Author: sergeyb Date: Fri Jun 29 17:05:19 2012 New Revision: 1355473 URL: http://svn.apache.org/viewvc?rev=1355473&view=rev Log: Merged revisions 1355465 via svnmerge from https://svn.apache.org/repos/asf/cxf/branches/2.6.x-fixes
................ r1355465 | sergeyb | 2012-06-29 17:41:27 +0100 (Fri, 29 Jun 2012) | 9 lines Merged revisions 1355462 via svnmerge from https://svn.apache.org/repos/asf/cxf/trunk ........ r1355462 | sergeyb | 2012-06-29 17:36:49 +0100 (Fri, 29 Jun 2012) | 1 line [CXF-4348] Ignoring optional multipart media type parameters when possible ........ ................ Modified: cxf/branches/2.5.x-fixes/ (props changed) cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/attachment/AttachmentSerializer.java cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/AttachmentOutInterceptor.java cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/AttachmentOutputInterceptor.java cxf/branches/2.5.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java Propchange: cxf/branches/2.5.x-fixes/ ------------------------------------------------------------------------------ Merged /cxf/trunk:r1355462 Merged /cxf/branches/2.6.x-fixes:r1355465 Propchange: cxf/branches/2.5.x-fixes/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/attachment/AttachmentSerializer.java URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/attachment/AttachmentSerializer.java?rev=1355473&r1=1355472&r2=1355473&view=diff ============================================================================== --- cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/attachment/AttachmentSerializer.java (original) +++ cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/attachment/AttachmentSerializer.java Fri Jun 29 17:05:19 2012 @@ -35,6 +35,9 @@ import org.apache.cxf.message.Attachment import org.apache.cxf.message.Message; public class AttachmentSerializer { + // http://tools.ietf.org/html/rfc2387 + private static final String DEFAULT_MULTIPART_TYPE = "multipart/related"; + private Message message; private String bodyBoundary; private OutputStream out; @@ -43,15 +46,19 @@ public class AttachmentSerializer { private String multipartType; private Map<String, List<String>> rootHeaders = Collections.emptyMap(); private boolean xop = true; + private boolean writeOptionalTypeParameters = true; public AttachmentSerializer(Message messageParam) { message = messageParam; } - public AttachmentSerializer(Message messageParam, String multipartType, + public AttachmentSerializer(Message messageParam, + String multipartType, + boolean writeOptionalTypeParameters, Map<String, List<String>> headers) { message = messageParam; this.multipartType = multipartType; + this.writeOptionalTypeParameters = writeOptionalTypeParameters; this.rootHeaders = headers; } @@ -86,11 +93,19 @@ public class AttachmentSerializer { } // Set transport mime type - String requestMimeType = multipartType == null ? "multipart/related" : multipartType; + String requestMimeType = multipartType == null ? DEFAULT_MULTIPART_TYPE : multipartType; StringBuilder ct = new StringBuilder(); ct.append(requestMimeType); - if (requestMimeType.indexOf("type=") == -1) { + + // having xop set to true implies multipart/related, but just in case... + boolean xopOrMultipartRelated = xop + || DEFAULT_MULTIPART_TYPE.equalsIgnoreCase(requestMimeType) + || DEFAULT_MULTIPART_TYPE.startsWith(requestMimeType); + + // type is a required parameter for multipart/related only + if (xopOrMultipartRelated + && requestMimeType.indexOf("type=") == -1) { ct.append("; "); if (xop) { ct.append("type=\"application/xop+xml\""); @@ -98,19 +113,33 @@ public class AttachmentSerializer { ct.append("type=\"").append(bodyCt).append("\""); } } - ct.append("; "); - String rootContentId = getHeaderValue("Content-ID", AttachmentUtil.BODY_ATTACHMENT_ID); - - ct.append("boundary=\"") + // boundary + ct.append("; ") + .append("boundary=\"") .append(bodyBoundary) - .append("\"; ") - .append("start=\"<") - .append(checkAngleBrackets(rootContentId)) - .append(">\"; ") - .append("start-info=\"") - .append(bodyCt) .append("\""); + + String rootContentId = getHeaderValue("Content-ID", AttachmentUtil.BODY_ATTACHMENT_ID); + + // 'start' is a required parameter for XOP/MTOM, clearly defined + // for simpler multipart/related payloads but is not needed for + // multipart/mixed, multipart/form-data + if (xopOrMultipartRelated) { + ct.append("; ") + .append("start=\"<") + .append(checkAngleBrackets(rootContentId)) + .append(">\""); + } + + // start-info is a required parameter for XOP/MTOM, may be needed for + // other WS cases but is redundant in simpler multipart/related cases + if (writeOptionalTypeParameters || xop) { + ct.append("; ") + .append("start-info=\"") + .append(bodyCt) + .append("\""); + } message.put(Message.CONTENT_TYPE, ct.toString()); Modified: cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/AttachmentOutInterceptor.java URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/AttachmentOutInterceptor.java?rev=1355473&r1=1355472&r2=1355473&view=diff ============================================================================== --- cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/AttachmentOutInterceptor.java (original) +++ cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/AttachmentOutInterceptor.java Fri Jun 29 17:05:19 2012 @@ -62,7 +62,10 @@ public class AttachmentOutInterceptor ex } AttachmentSerializer serializer = - new AttachmentSerializer(message, getMultipartType(), getRootHeaders()); + new AttachmentSerializer(message, + getMultipartType(), + writeOptionalTypeParameters(), + getRootHeaders()); serializer.setXop(mtomEnabled); try { @@ -80,6 +83,10 @@ public class AttachmentOutInterceptor ex return "multipart/related"; } + protected boolean writeOptionalTypeParameters() { + return true; + } + protected Map<String, List<String>> getRootHeaders() { return Collections.emptyMap(); } Modified: cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/AttachmentOutputInterceptor.java URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/AttachmentOutputInterceptor.java?rev=1355473&r1=1355472&r2=1355473&view=diff ============================================================================== --- cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/AttachmentOutputInterceptor.java (original) +++ cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/AttachmentOutputInterceptor.java Fri Jun 29 17:05:19 2012 @@ -43,4 +43,7 @@ public class AttachmentOutputInterceptor return Collections.unmodifiableMap(rootHeaders); } + protected boolean writeOptionalTypeParameters() { + return false; + } } Modified: cxf/branches/2.5.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java?rev=1355473&r1=1355472&r2=1355473&view=diff ============================================================================== --- cxf/branches/2.5.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java (original) +++ cxf/branches/2.5.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java Fri Jun 29 17:05:19 2012 @@ -357,6 +357,16 @@ public class JAXRSMultipartTest extends "/org/apache/cxf/systest/jaxrs/resources/book.xsd")); String bookXsd2 = IOUtils.readStringFromStream(xop2.getAttachinfo().getInputStream()); assertEquals(bookXsdOriginal, bookXsd2); + + String ctString = + client.getResponse().getMetadata().getFirst("Content-Type").toString(); + MediaType mt = MediaType.valueOf(ctString); + Map<String, String> params = mt.getParameters(); + assertEquals(4, params.size()); + assertNotNull(params.get("boundary")); + assertNotNull(params.get("type")); + assertNotNull(params.get("start")); + assertNotNull(params.get("start-info")); } private Image getImage(String name) throws Exception { @@ -413,6 +423,14 @@ public class JAXRSMultipartTest extends getClass().getResourceAsStream("/org/apache/cxf/systest/jaxrs/resources/java.jpg")); byte[] image2 = IOUtils.readBytesFromStream(is2); assertTrue(Arrays.equals(image1, image2)); + + String ctString = + client.getResponse().getMetadata().getFirst("Content-Type").toString(); + MediaType mt = MediaType.valueOf(ctString); + Map<String, String> params = mt.getParameters(); + assertEquals(1, params.size()); + assertNotNull(params.get("boundary")); + } @Test
