You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2014/07/09 17:29:08 UTC
git commit: [CXF-5842] Make sure the cache gets cleaned up if it
fails to cache the input
Repository: cxf
Updated Branches:
refs/heads/master 3812fe232 -> ebf24b72c
[CXF-5842] Make sure the cache gets cleaned up if it fails to cache the input
Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/ebf24b72
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/ebf24b72
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/ebf24b72
Branch: refs/heads/master
Commit: ebf24b72c0468195f129aa6fd3b10c571592d216
Parents: 3812fe2
Author: Daniel Kulp <dk...@apache.org>
Authored: Wed Jul 9 10:58:33 2014 -0400
Committer: Daniel Kulp <dk...@apache.org>
Committed: Wed Jul 9 11:28:27 2014 -0400
----------------------------------------------------------------------
.../cxf/attachment/AttachmentDataSource.java | 28 ++++++--
.../cxf/jaxrs/ext/MessageContextImpl.java | 2 +-
.../cxf/systest/jaxrs/JAXRSMultipartTest.java | 67 +++++++++++++++++++-
.../cxf/systest/jaxrs/MultipartServer.java | 1 +
.../cxf/systest/jaxrs/resources/attachmentData | 2 +-
5 files changed, 90 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cxf/blob/ebf24b72/core/src/main/java/org/apache/cxf/attachment/AttachmentDataSource.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/cxf/attachment/AttachmentDataSource.java b/core/src/main/java/org/apache/cxf/attachment/AttachmentDataSource.java
index 42194f5..d1b64b8 100644
--- a/core/src/main/java/org/apache/cxf/attachment/AttachmentDataSource.java
+++ b/core/src/main/java/org/apache/cxf/attachment/AttachmentDataSource.java
@@ -26,6 +26,7 @@ import java.io.OutputStream;
import javax.activation.DataSource;
import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.io.CacheSizeExceededException;
import org.apache.cxf.io.CachedOutputStream;
import org.apache.cxf.message.Message;
@@ -49,12 +50,27 @@ public class AttachmentDataSource implements DataSource {
if (cache == null) {
cache = new CachedOutputStream();
AttachmentUtil.setStreamedAttachmentProperties(message, cache);
- IOUtils.copy(ins, cache);
- cache.lockOutputStream();
- ins.close();
- ins = null;
- if (delegate != null) {
- delegate.setInputStream(cache.getInputStream());
+ try {
+ IOUtils.copy(ins, cache);
+ cache.lockOutputStream();
+ if (delegate != null) {
+ delegate.setInputStream(cache.getInputStream());
+ }
+ } catch (CacheSizeExceededException cee) {
+ cache.close();
+ cache = null;
+ throw cee;
+ } catch (IOException cee) {
+ cache.close();
+ cache = null;
+ throw cee;
+ } finally {
+ try {
+ ins.close();
+ } catch (Exception ex) {
+ //ignore
+ }
+ ins = null;
}
}
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/ebf24b72/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java
index acd96d8..b1fec9b 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java
@@ -76,7 +76,7 @@ public class MessageContextImpl implements MessageContext {
return createAttachments(key.toString());
} catch (CacheSizeExceededException e) {
m.getExchange().put("cxf.io.cacheinput", Boolean.FALSE);
- throw new WebApplicationException(413);
+ throw new WebApplicationException(e, 413);
}
}
if (keyValue.equals("WRITE-" + Message.ATTACHMENTS)) {
http://git-wip-us.apache.org/repos/asf/cxf/blob/ebf24b72/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java
----------------------------------------------------------------------
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java
index 9832202..e89a3ea 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java
@@ -22,7 +22,9 @@ package org.apache.cxf.systest.jaxrs;
import java.awt.Image;
import java.io.ByteArrayInputStream;
import java.io.File;
+import java.io.IOException;
import java.io.InputStream;
+import java.io.PushbackInputStream;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.Arrays;
@@ -50,6 +52,7 @@ import org.apache.commons.httpclient.methods.multipart.ByteArrayPartSource;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
+import org.apache.cxf.helpers.FileUtils;
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
@@ -140,6 +143,60 @@ public class JAXRSMultipartTest extends AbstractBusClientServerTestBase {
doAddBook(address, "attachmentData", 200);
}
+
+ int countTempFiles() {
+ File file = FileUtils.getDefaultTempDir();
+ File files[] = file.listFiles();
+ if (files == null) {
+ return 0;
+ }
+ int count = 0;
+ for (File f : files) {
+ if (f.isFile()) {
+ count++;
+ }
+ }
+ return count;
+ }
+ @Test
+ public void testBookAsMassiveAttachment() throws Exception {
+ //CXF-5842
+ int orig = countTempFiles();
+ String address = "http://localhost:" + PORT + "/bookstore/books/attachments";
+ InputStream is =
+ getClass().getResourceAsStream("/org/apache/cxf/systest/jaxrs/resources/attachmentData");
+ //create a stream that sticks a bunch of data for the attachement to cause the
+ //server to buffer the attachment to disk.
+ PushbackInputStream buf = new PushbackInputStream(is, 1024 * 20) {
+ int bcount = -1;
+ @Override
+ public int read(byte b[], int offset, int len) throws IOException {
+ if (bcount >= 0 && bcount < 1024 * 50) {
+ for (int x = 0; x < len; x++) {
+ b[offset + x] = (byte)x;
+ }
+ bcount += len;
+ return len;
+ }
+ int i = super.read(b, offset, len);
+ for (int x = 0; x < i - 5; x++) {
+ if (b[x + offset] == '*'
+ && b[x + offset + 1] == '*'
+ && b[x + offset + 2] == 'D'
+ && b[x + offset + 3] == '*'
+ && b[x + offset + 4] == '*') {
+ super.unread(b, x + offset + 5, i - x - 5);
+ i = x;
+ bcount = 0;
+ }
+ }
+ return i;
+ }
+ };
+ doAddBook("multipart/related", address, buf, 413);
+ assertEquals(orig, countTempFiles());
+ }
+
@Test
public void testBookJSONForm() throws Exception {
String address = "http://localhost:" + PORT + "/bookstore/books/jsonform";
@@ -888,13 +945,19 @@ public class JAXRSMultipartTest extends AbstractBusClientServerTestBase {
}
private void doAddBook(String type, String address, String resourceName, int status) throws Exception {
+ InputStream is =
+ getClass().getResourceAsStream("/org/apache/cxf/systest/jaxrs/resources/" + resourceName);
+ doAddBook(type, address, is, status);
+ }
+ private void doAddBook(String type, String address, InputStream is, int status) throws Exception {
+
PostMethod post = new PostMethod(address);
String ct = type + "; type=\"text/xml\"; " + "start=\"rootPart\"; "
+ "boundary=\"----=_Part_4_701508.1145579811786\"";
post.setRequestHeader("Content-Type", ct);
- InputStream is =
- getClass().getResourceAsStream("/org/apache/cxf/systest/jaxrs/resources/" + resourceName);
+
+
RequestEntity entity = new InputStreamRequestEntity(is);
post.setRequestEntity(entity);
HttpClient httpclient = new HttpClient();
http://git-wip-us.apache.org/repos/asf/cxf/blob/ebf24b72/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartServer.java
----------------------------------------------------------------------
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartServer.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartServer.java
index 0eb365f..0bf1718 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartServer.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartServer.java
@@ -39,6 +39,7 @@ public class MultipartServer extends AbstractBusTestServerBase {
Map<String, Object> props = new HashMap<String, Object>();
props.put(AttachmentDeserializer.ATTACHMENT_MAX_SIZE, String.valueOf(1024 * 10));
+ props.put(AttachmentDeserializer.ATTACHMENT_MEMORY_THRESHOLD, String.valueOf(1024 * 5));
sf.setProperties(props);
//default lifecycle is per-request, change it to singleton
sf.setResourceProvider(MultipartStore.class,
http://git-wip-us.apache.org/repos/asf/cxf/blob/ebf24b72/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/attachmentData
----------------------------------------------------------------------
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/attachmentData b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/attachmentData
index acca093..d82aa8e 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/attachmentData
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/attachmentData
@@ -9,7 +9,7 @@ Content-Type: image/jpeg
Content-Transfer-Encoding: binary
Content-ID: <foo>
-foobar
+**D**
------=_Part_4_701508.1145579811786--
Content-Type: application/xml
Content-ID: <book2>