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 { > >
