This is an automated email from the ASF dual-hosted git repository.
ffang pushed a commit to branch 4.0.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/4.0.x-fixes by this push:
new d7bf83577c [CXF-9111]Make behavior for "multipart/form-data" requests
standard-conform
d7bf83577c is described below
commit d7bf83577c1ff38beee2fe8f718e8b629f60fe41
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
(cherry picked from commit a174014a9ea64dae8412ead69499db585189ac8c)
---
.../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 cd37a36822..10002e2666 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,13 +94,15 @@ 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",
launchServer(MultipartServer.class, true));
}
+
+
@Test
public void testBookAsRootAttachmentStreamSource() throws Exception {
String address = "http://localhost:" + PORT +
"/bookstore/books/stream";
@@ -523,9 +527,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 1c9678d032..2eae7e2d44 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.testutil.common.AbstractServerTestServerBase;
@@ -35,6 +36,7 @@ public class MultipartServer extends
AbstractServerTestServerBase {
@Override
protected Server createServer(Bus bus) throws Exception {
+ bus.getInInterceptors().add(new LoggingInInterceptor());
JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
sf.setResourceClasses(MultipartStore.class);