Thanks for the info Andrea! Reverted on camel-2.23.x branch
Freeman > On Oct 23, 2019, at 12:09 PM, Andrea Cosentino <[email protected]> wrote: > > I don't we'll release 2.23.5 > > Il mer 23 ott 2019, 17:56 <[email protected]> ha scritto: > >> This is an automated email from the ASF dual-hosted git repository. >> >> ffang pushed a commit to branch camel-2.23.x >> in repository https://gitbox.apache.org/repos/asf/camel.git >> >> >> The following commit(s) were added to refs/heads/camel-2.23.x by this push: >> new 9f91d2c [CAMEL-14105]avoid using deprecated >> org.eclipse.jetty.util.MultiPartInputStreamParser >> 9f91d2c is described below >> >> commit 9f91d2cc6dbae55af7193e1beeba0a146ea13368 >> Author: Freeman Fang <[email protected]> >> AuthorDate: Wed Oct 23 11:36:40 2019 -0400 >> >> [CAMEL-14105]avoid using deprecated >> org.eclipse.jetty.util.MultiPartInputStreamParser >> >> (cherry picked from commit b71cf87b0d29db8d3ba265f443555e410456d27a) >> (cherry picked from commit 57e95a1b3aa742f64567a6618fba1b72bb32295d) >> --- >> .../camel/component/jetty/JettyHttpComponent.java | 14 ++++- >> .../camel/component/jetty/JettyHttpEndpoint.java | 4 +- >> .../camel/component/jetty/MultiPartFilter.java | 66 >> ++++++++++++++++++++++ >> .../src/main/docs/jetty-component.adoc | 2 +- >> .../component/jetty9/AttachmentHttpBinding.java | 18 ++++-- >> .../jetty/MultiPartFormWithCustomFilterTest.java | 2 +- >> 6 files changed, 96 insertions(+), 10 deletions(-) >> >> diff --git >> a/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java >> b/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java >> index 0f47261..5f79c23 100644 >> --- >> a/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java >> +++ >> b/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java >> @@ -32,6 +32,7 @@ import java.util.Locale; >> import java.util.Map; >> import javax.management.MBeanServer; >> import javax.servlet.Filter; >> +import javax.servlet.MultipartConfigElement; >> import javax.servlet.RequestDispatcher; >> import javax.servlet.http.HttpServletRequest; >> import javax.servlet.http.HttpServletResponse; >> @@ -78,6 +79,8 @@ import org.eclipse.jetty.jmx.MBeanContainer; >> import org.eclipse.jetty.server.AbstractConnector; >> import org.eclipse.jetty.server.Connector; >> import org.eclipse.jetty.server.Handler; >> +import org.eclipse.jetty.server.HttpConnectionFactory; >> +import org.eclipse.jetty.server.MultiPartFormDataCompliance; >> import org.eclipse.jetty.server.Request; >> import org.eclipse.jetty.server.Response; >> import org.eclipse.jetty.server.Server; >> @@ -90,7 +93,6 @@ import org.eclipse.jetty.servlet.FilterHolder; >> import org.eclipse.jetty.servlet.ServletContextHandler; >> import org.eclipse.jetty.servlet.ServletHolder; >> import org.eclipse.jetty.servlets.CrossOriginFilter; >> -import org.eclipse.jetty.servlets.MultiPartFilter; >> import org.eclipse.jetty.util.component.Container; >> import org.eclipse.jetty.util.ssl.SslContextFactory; >> import org.eclipse.jetty.util.thread.QueuedThreadPool; >> @@ -1344,9 +1346,19 @@ public abstract class JettyHttpComponent extends >> HttpCommonComponent implements >> holder.setAsyncSupported(true); >> holder.setInitParameter(CamelServlet.ASYNC_PARAM, >> Boolean.toString(endpoint.isAsync())); >> context.addServlet(holder, "/*"); >> + >> + File file = File.createTempFile("camel", ""); >> + file.delete(); >> + >> + //must register the MultipartConfig to make jetty server >> multipart aware >> + holder.getRegistration().setMultipartConfig(new >> MultipartConfigElement(file.getParentFile().getAbsolutePath(), -1, -1, 0)); >> >> // use rest enabled resolver in case we use rest >> camelServlet.setServletResolveConsumerStrategy(new >> HttpRestServletResolveConsumerStrategy()); >> + >> + //must make RFC7578 as default to avoid using the deprecated >> MultiPartInputStreamParser >> + >> connector.getConnectionFactory(HttpConnectionFactory.class).getHttpConfiguration() >> + >> .setMultiPartFormDataCompliance(MultiPartFormDataCompliance.RFC7578); >> >> return camelServlet; >> } >> diff --git >> a/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java >> b/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java >> index ac2a460..68344bb 100644 >> --- >> a/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java >> +++ >> b/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java >> @@ -64,7 +64,7 @@ public abstract class JettyHttpEndpoint extends >> HttpCommonEndpoint { >> @UriParam(label = "consumer", >> description = "If this option is true, Jetty JMX support will >> be enabled for this endpoint. See Jetty JMX support for more details.") >> private boolean enableJmx; >> - @UriParam(description = "Whether Jetty >> org.eclipse.jetty.servlets.MultiPartFilter is enabled or not." >> + @UriParam(description = "Whether >> org.apache.camel.component.jetty.MultiPartFilter is enabled or not." >> + " You should set this value to false when bridging >> endpoints, to ensure multipart requests is proxied/bridged as well.") >> private boolean enableMultipartFilter; >> @UriParam(label = "consumer", defaultValue = "true", >> @@ -297,7 +297,7 @@ public abstract class JettyHttpEndpoint extends >> HttpCommonEndpoint { >> } >> >> /** >> - * Whether Jetty org.eclipse.jetty.servlets.MultiPartFilter is >> enabled or not. >> + * Whether org.apache.camel.component.jetty.MultiPartFilter is >> enabled or not. >> * You should set this value to false when bridging endpoints, to >> ensure multipart requests is proxied/bridged as well. >> */ >> public void setEnableMultipartFilter(boolean enableMultipartFilter) { >> diff --git >> a/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/MultiPartFilter.java >> b/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/MultiPartFilter.java >> new file mode 100644 >> index 0000000..87f141d >> --- /dev/null >> +++ >> b/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/MultiPartFilter.java >> @@ -0,0 +1,66 @@ >> +/** >> + * Licensed to the Apache Software Foundation (ASF) under one or more >> + * contributor license agreements. See the NOTICE file distributed with >> + * this work for additional information regarding copyright ownership. >> + * The ASF licenses this file to You under the Apache License, Version 2.0 >> + * (the "License"); you may not use this file except in compliance with >> + * the License. You may obtain a copy of the License at >> + * >> + * http://www.apache.org/licenses/LICENSE-2.0 >> + * >> + * Unless required by applicable law or agreed to in writing, software >> + * distributed under the License is distributed on an "AS IS" BASIS, >> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >> implied. >> + * See the License for the specific language governing permissions and >> + * limitations under the License. >> + */ >> + >> +package org.apache.camel.component.jetty; >> + >> +import java.io.IOException; >> + >> +import javax.servlet.Filter; >> +import javax.servlet.FilterChain; >> +import javax.servlet.FilterConfig; >> +import javax.servlet.ServletException; >> +import javax.servlet.ServletRequest; >> +import javax.servlet.ServletResponse; >> +import javax.servlet.http.HttpServletRequest; >> + >> + >> +/** >> + * To enable handle attachments with Jetty 9 when this filter is set. >> + * <p/> >> + * To replace the deprecated org.eclipse.jetty.servlets.MultiPartFilter >> + * Tell AttachmentHttpBinding to use Servlet 3 >> HttpServletRequest.getParts API >> + */ >> +public class MultiPartFilter implements Filter { >> + >> + public static final String MULTIPART = "populate.multipart"; >> + >> + @Override >> + public void init(FilterConfig filterConfig) throws ServletException { >> + >> + } >> + >> + @Override >> + public void doFilter(ServletRequest request, ServletResponse >> response, FilterChain chain) >> + throws IOException, ServletException { >> + HttpServletRequest srequest = (HttpServletRequest)request; >> + if (srequest.getContentType() == null || >> !srequest.getContentType().startsWith("multipart/form-data")) { >> + chain.doFilter(request, response); >> + } else { >> + srequest.getParts(); //load and init attachments >> + request.setAttribute(MULTIPART, Boolean.TRUE); >> + chain.doFilter(request, response); >> + } >> + } >> + >> + @Override >> + public void destroy() { >> + >> + } >> + >> + >> + >> +} >> diff --git a/components/camel-jetty9/src/main/docs/jetty-component.adoc >> b/components/camel-jetty9/src/main/docs/jetty-component.adoc >> index 0c313f7..a404909 100644 >> --- a/components/camel-jetty9/src/main/docs/jetty-component.adoc >> +++ b/components/camel-jetty9/src/main/docs/jetty-component.adoc >> @@ -131,7 +131,7 @@ with the following path and query parameters: >> | Name | Description | Default | Type >> | *chunked* (common) | If this option is false the Servlet will disable >> the HTTP streaming and set the content-length header on the response | true >> | boolean >> | *disableStreamCache* (common) | Determines whether or not the raw input >> stream from Servlet is cached or not (Camel will read the stream into a in >> memory/overflow to file, Stream caching) cache. By default Camel will cache >> the Servlet input stream to support reading it multiple times to ensure it >> Camel can retrieve all data from the stream. However you can set this >> option to true when you for example need to access the raw stream, such as >> streaming it directly to a file or other persis [...] >> -| *enableMultipartFilter* (common) | Whether Jetty >> org.eclipse.jetty.servlets.MultiPartFilter is enabled or not. You should >> set this value to false when bridging endpoints, to ensure multipart >> requests is proxied/bridged as well. | false | boolean >> +| *enableMultipartFilter* (common) | Whether >> org.apache.camel.component.jetty.MultiPartFilter is enabled or not. You >> should set this value to false when bridging endpoints, to ensure multipart >> requests is proxied/bridged as well. | false | boolean >> | *headerFilterStrategy* (common) | To use a custom HeaderFilterStrategy >> to filter header to and from Camel message. | | HeaderFilterStrategy >> | *transferException* (common) | If enabled and an Exchange failed >> processing on the consumer side, and if the caused Exception was send back >> serialized in the response as a application/x-java-serialized-object >> content type. On the producer side the exception will be deserialized and >> thrown as is, instead of the HttpOperationFailedException. The caused >> exception is required to be serialized. This is by default turned off. If >> you enable this then be aware that Java will deserialize the in [...] >> | *httpBinding* (common) | To use a custom HttpBinding to control the >> mapping between Camel message and HttpClient. | | HttpBinding >> diff --git >> a/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/AttachmentHttpBinding.java >> b/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/AttachmentHttpBinding.java >> index b72f0c6..10a654b 100644 >> --- >> a/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/AttachmentHttpBinding.java >> +++ >> b/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/AttachmentHttpBinding.java >> @@ -31,11 +31,11 @@ import javax.servlet.http.Part; >> import org.apache.camel.Attachment; >> import org.apache.camel.Exchange; >> import org.apache.camel.RuntimeCamelException; >> +import org.apache.camel.component.jetty.MultiPartFilter; >> import org.apache.camel.http.common.DefaultHttpBinding; >> import org.apache.camel.http.common.HttpHelper; >> import org.apache.camel.http.common.HttpMessage; >> import org.apache.camel.impl.DefaultAttachment; >> -import org.eclipse.jetty.util.MultiPartInputStreamParser; >> import org.slf4j.Logger; >> import org.slf4j.LoggerFactory; >> >> @@ -52,12 +52,11 @@ final class AttachmentHttpBinding extends >> DefaultHttpBinding { >> >> @Override >> protected void populateAttachments(HttpServletRequest request, >> HttpMessage message) { >> - Object object = >> request.getAttribute("org.eclipse.jetty.servlet.MultiPartFile.multiPartInputStream"); >> - if (object instanceof MultiPartInputStreamParser) { >> - MultiPartInputStreamParser parser = >> (MultiPartInputStreamParser)object; >> + Boolean object = >> (Boolean)request.getAttribute(MultiPartFilter.MULTIPART); >> + if (object != null && object) { >> Collection<Part> parts; >> try { >> - parts = parser.getParts(); >> + parts = request.getParts(); >> for (Part part : parts) { >> DataSource ds = new PartDataSource(part); >> Attachment attachment = new DefaultAttachment(ds); >> @@ -67,6 +66,15 @@ final class AttachmentHttpBinding extends >> DefaultHttpBinding { >> } >> } >> message.addAttachmentObject(part.getName(), >> attachment); >> + String name = part.getSubmittedFileName(); >> + Object value = message.getAttachment(name); >> + Map<String, Object> headers = message.getHeaders(); >> + if (getHeaderFilterStrategy() != null >> + && >> !getHeaderFilterStrategy().applyFilterToExternalHeaders(name, value, >> message.getExchange()) >> + && name != null) { >> + HttpHelper.appendHeader(headers, name, value); >> + } >> + >> } >> } catch (Exception e) { >> throw new RuntimeCamelException("Cannot populate >> attachments", e); >> diff --git >> a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MultiPartFormWithCustomFilterTest.java >> b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MultiPartFormWithCustomFilterTest.java >> index aeae20a..bb11f4b 100644 >> --- >> a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MultiPartFormWithCustomFilterTest.java >> +++ >> b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/MultiPartFormWithCustomFilterTest.java >> @@ -37,7 +37,7 @@ 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.commons.httpclient.methods.multipart.StringPart; >> -import org.eclipse.jetty.servlets.MultiPartFilter; >> + >> import org.junit.Test; >> >> public class MultiPartFormWithCustomFilterTest extends BaseJettyTest { >> >>
