This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch CAMEL-26139-servlet-attachment-non-multipart in repository https://gitbox.apache.org/repos/asf/camel.git
commit 2bdb384f9f4895b0dba97f592bc869ff3db21baa Author: Claus Ibsen <[email protected]> AuthorDate: Mon Nov 2 17:11:38 2026 +0100 CAMEL-26139: camel-servlet - attachmentMultipartBinding only reads parts of multipart/form-data requests AttachmentHttpBinding called HttpServletRequest.getParts() for every request. The servlet container throws for a request that is not multipart/form-data, so with attachmentMultipartBinding=true every GET or plain POST failed with 500 "Cannot populate attachments". The parts are now only read when the Content-Type is multipart/form-data. Co-Authored-By: Claude Opus 5.5 <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .../component/servlet/AttachmentHttpBinding.java | 11 +++++++++++ .../component/servlet/MultipartUploadTest.java | 21 +++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/AttachmentHttpBinding.java b/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/AttachmentHttpBinding.java index e60c8f94219f..0f992f9ff73e 100644 --- a/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/AttachmentHttpBinding.java +++ b/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/AttachmentHttpBinding.java @@ -44,12 +44,18 @@ import org.slf4j.LoggerFactory; public final class AttachmentHttpBinding extends DefaultHttpBinding { private static final Logger LOG = LoggerFactory.getLogger(AttachmentHttpBinding.class); + private static final String MULTIPART_FORM_DATA = "multipart/form-data"; AttachmentHttpBinding() { } @Override protected void populateAttachments(HttpServletRequest request, Message message) { + // the servlet container throws from getParts() when the request is not multipart/form-data, so a plain + // request (GET, or a POST of text, JSON and so on) has no parts to read and must not fail + if (!isMultipartFormData(request)) { + return; + } try { Collection<Part> parts = request.getParts(); for (Part part : parts) { @@ -80,6 +86,11 @@ public final class AttachmentHttpBinding extends DefaultHttpBinding { } } + private static boolean isMultipartFormData(HttpServletRequest request) { + String contentType = request.getContentType(); + return contentType != null && contentType.regionMatches(true, 0, MULTIPART_FORM_DATA, 0, MULTIPART_FORM_DATA.length()); + } + public final class PartDataSource implements DataSource { private final Part part; diff --git a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/MultipartUploadTest.java b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/MultipartUploadTest.java index fcc9f05ecd07..8122a19c86e4 100644 --- a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/MultipartUploadTest.java +++ b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/MultipartUploadTest.java @@ -54,6 +54,24 @@ public class MultipartUploadTest extends ServletCamelRouterTestSupport { assertEquals(content, response.getText()); } + @Test + void testPlainPostWithAttachmentMultipartBinding() throws IOException { + // a request that is not multipart/form-data has no parts and must not fail with "Cannot populate attachments" + InputStream inputStream = context.getTypeConverter().convertTo(InputStream.class, "Hello World"); + PostMethodWebRequest request + = new PostMethodWebRequest(contextUrl + "/services/plainRequest", inputStream, "text/plain"); + WebResponse response = query(request, false); + assertEquals(200, response.getResponseCode()); + assertEquals("Bye Hello World", response.getText()); + } + + @Test + void testGetWithAttachmentMultipartBinding() throws IOException { + WebResponse response = query(new GetMethodWebRequest(contextUrl + "/services/plainRequest"), false); + assertEquals(200, response.getResponseCode()); + assertEquals("Bye ", response.getText()); + } + @Override protected RoutesBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @@ -72,6 +90,9 @@ public class MultipartUploadTest extends ServletCamelRouterTestSupport { } } }); + + from("servlet:plainRequest?attachmentMultipartBinding=true") + .transform(simple("Bye ${body}")); } }; }
