This is an automated email from the ASF dual-hosted git repository.

ffang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cxf.git


The following commit(s) were added to refs/heads/main by this push:
     new a174014a9e [CXF-9111]Make behavior for "multipart/form-data" requests 
standard-conform
a174014a9e is described below

commit a174014a9ea64dae8412ead69499db585189ac8c
Author: Freeman Fang <[email protected]>
AuthorDate: Wed Aug 20 10:27:48 2025 -0400

    [CXF-9111]Make behavior for "multipart/form-data" requests standard-conform
---
 .../apache/cxf/jaxrs/provider/MultipartProvider.java  | 19 ++++++++++++++++++-
 .../apache/cxf/systest/jaxrs/JAXRSMultipartTest.java  | 14 +++++++++++++-
 .../org/apache/cxf/systest/jaxrs/MultipartServer.java |  2 ++
 3 files changed, 33 insertions(+), 2 deletions(-)

diff --git 
a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java
 
b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java
index 533bf6665c..7618e17d60 100644
--- 
a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java
+++ 
b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/MultipartProvider.java
@@ -44,6 +44,7 @@ import jakarta.ws.rs.Consumes;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.WebApplicationException;
 import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.HttpHeaders;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.MultivaluedMap;
 import jakarta.ws.rs.ext.MessageBodyReader;
@@ -98,6 +99,9 @@ public class MultipartProvider extends 
AbstractConfigurableProvider
     private String attachmentDir;
     private String attachmentThreshold;
     private String attachmentMaxSize;
+    
+    @Context
+    private HttpHeaders httpHeaders;
 
     public void setMessageContext(MessageContext context) {
         this.mc = context;
@@ -352,7 +356,20 @@ public class MultipartProvider extends 
AbstractConfigurableProvider
             dh = getHandlerForObject(att.getObject(),
                                      att.getObject().getClass(), new 
Annotation[]{},
                                      att.getContentType().toString(), id);
-            return new Attachment(att.getContentId(), dh, att.getHeaders());
+            MediaType mediaType = httpHeaders.getMediaType();
+            Attachment ret = null;
+            if (MediaType.MULTIPART_FORM_DATA_TYPE.isCompatible(mediaType)) {
+                ContentDisposition cd = new 
+                    ContentDisposition("form-data;name=\"" 
+                        + att.getContentId() + "\"");
+                MultivaluedMap<String, String> newHeaders = 
+                    new MetadataMap<String, String>(att.getHeaders(), false, 
true);
+                newHeaders.putSingle("Content-Disposition", cd.toString());
+                ret = new Attachment(att.getContentId(), dh, newHeaders);
+            } else {
+                ret = new Attachment(att.getContentId(), dh, att.getHeaders());
+            }
+            return ret;
         } else if (byte[].class.isAssignableFrom(obj.getClass())) {
             ByteDataSource source = new ByteDataSource((byte[])obj);
             source.setContentType(mimeType);
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 4b2ae2702e..706ebdf970 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
@@ -21,9 +21,11 @@ package org.apache.cxf.systest.jaxrs;
 
 import java.awt.Image;
 import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.PrintWriter;
 import java.io.PushbackInputStream;
 import java.lang.annotation.Annotation;
 import java.util.ArrayList;
@@ -92,7 +94,7 @@ import static org.junit.Assert.assertTrue;
 public class JAXRSMultipartTest extends AbstractBusClientServerTestBase {
     public static final String PORT = MultipartServer.PORT;
     public static final String PORTINV = 
allocatePort(JAXRSMultipartTest.class, 1);
-
+    
     @BeforeClass
     public static void startServers() throws Exception {
         assertTrue("server did not launch correctly",
@@ -102,6 +104,8 @@ public class JAXRSMultipartTest extends 
AbstractBusClientServerTestBase {
         
bus.setProperty(ProviderFactory.SKIP_JAKARTA_JSON_PROVIDERS_REGISTRATION, true);
     }
 
+    
+    
     @Test
     public void testBookAsRootAttachmentStreamSource() throws Exception {
         String address = "http://localhost:"; + PORT + 
"/bookstore/books/stream";
@@ -526,9 +530,17 @@ public class JAXRSMultipartTest extends 
AbstractBusClientServerTestBase {
 
     @Test
     public void testNullPartProxy() throws Exception {
+        ByteArrayOutputStream output = new ByteArrayOutputStream();
+        PrintWriter writer = new PrintWriter(output, true);
+
+        LoggingOutInterceptor out = new LoggingOutInterceptor(writer);
+        
         MultipartStore store =
             JAXRSClientFactory.create("http://localhost:"; + PORT, 
MultipartStore.class);
+        WebClient.getConfig(store).getOutInterceptors().add(out);
         assertEquals("nobody home2", store.testNullParts("value1", null));
+        String expected = "Content-Disposition: form-data;name=\"someid\"";
+        assertTrue(output.toString().indexOf(expected) != -1);
     }
 
     @Test
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 c883c26541..ec8fa1ea44 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
@@ -25,6 +25,7 @@ import java.util.Map;
 import org.apache.cxf.Bus;
 import org.apache.cxf.attachment.AttachmentDeserializer;
 import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.ext.logging.LoggingInInterceptor;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
 import org.apache.cxf.jaxrs.provider.ProviderFactory;
@@ -36,6 +37,7 @@ public class MultipartServer extends 
AbstractServerTestServerBase {
     @Override
     protected Server createServer(Bus bus) throws Exception {
         
bus.setProperty(ProviderFactory.SKIP_JAKARTA_JSON_PROVIDERS_REGISTRATION, true);
+        bus.getInInterceptors().add(new LoggingInInterceptor());
 
         JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
         sf.setResourceClasses(MultipartStore.class);

Reply via email to