Author: ningjiang Date: Fri Aug 20 08:02:54 2010 New Revision: 987398 URL: http://svn.apache.org/viewvc?rev=987398&view=rev Log: CAMEL-3059 HTTP Proxy Mulitpart Requests
Added: camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpBridgeMultipartRouteTest.java (with props) Modified: camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java Modified: camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java?rev=987398&r1=987397&r2=987398&view=diff ============================================================================== --- camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java (original) +++ camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java Fri Aug 20 08:02:54 2010 @@ -129,6 +129,8 @@ public class JettyHttpComponent extends Boolean bridgeEndpoint = getAndRemoveParameter(parameters, "bridgeEndpoint", Boolean.class); Boolean matchOnUriPrefix = getAndRemoveParameter(parameters, "matchOnUriPrefix", Boolean.class); Boolean enableJmx = getAndRemoveParameter(parameters, "enableJmx", Boolean.class); + Boolean enableMultipartFilter = getAndRemoveParameter(parameters, "enableMultipartFilter", + Boolean.class, true); // configure http client if we have url configuration for it // http client is only used for jetty http producer (hence not very commonly used) @@ -185,6 +187,8 @@ public class JettyHttpComponent extends // set this option based on setting of JettyHttpComponent endpoint.setEnableJmx(isEnableJmx()); } + + endpoint.setEnableMultipartFilter(enableMultipartFilter); setProperties(endpoint, parameters); return endpoint; @@ -237,6 +241,10 @@ public class JettyHttpComponent extends if (endpoint.isSessionSupport()) { enableSessionSupport(connectorRef.server, connectorKey); } + + if (endpoint.isEnableMultipartFilter()) { + enableMultipartFilter(endpoint, connectorRef.server, connectorKey); + } connectorRef.servlet.connect(consumer); } } @@ -263,6 +271,33 @@ public class JettyHttpComponent extends } } } + + private void enableMultipartFilter(HttpEndpoint endpoint, Server server, String connectorKey) throws Exception { + ServletContextHandler context = (ServletContextHandler) server + .getChildHandlerByClass(ServletContextHandler.class); + CamelContext camelContext = this.getCamelContext(); + FilterHolder filterHolder = new FilterHolder(); + filterHolder.setInitParameter("deleteFiles", "true"); + if (ObjectHelper.isNotEmpty(camelContext.getProperties().get(TMP_DIR))) { + File file = new File(camelContext.getProperties().get(TMP_DIR)); + if (!file.isDirectory()) { + throw new RuntimeCamelException( + "The temp file directory of camel-jetty is not exists, please recheck it with directory name :" + + camelContext.getProperties().get(TMP_DIR)); + } + context.setAttribute("javax.servlet.context.tempdir", file); + } + filterHolder.setFilter(new CamelMultipartFilter()); + // add the default MultiPartFilter filter for it + String pathSpec = endpoint.getPath(); + if (pathSpec == null || "".equals(pathSpec)) { + pathSpec = "/"; + } + if (endpoint.isMatchOnUriPrefix()) { + pathSpec = pathSpec.endsWith("/") ? pathSpec + "*" : pathSpec + "/*"; + } + context.addFilter(filterHolder, pathSpec, 0); + } /** * Disconnects the URL specified on the endpoint from the specified processor. @@ -590,20 +625,6 @@ public class JettyHttpComponent extends CamelServlet camelServlet = new CamelContinuationServlet(); ServletHolder holder = new ServletHolder(); holder.setServlet(camelServlet); - CamelContext camelContext = this.getCamelContext(); - FilterHolder filterHolder = new FilterHolder(); - filterHolder.setInitParameter("deleteFiles", "true"); - if (ObjectHelper.isNotEmpty(camelContext.getProperties().get(TMP_DIR))) { - File file = new File(camelContext.getProperties().get(TMP_DIR)); - if (!file.isDirectory()) { - throw new RuntimeCamelException("The temp file directory of camel-jetty is not exists, please recheck it with directory name :" - + camelContext.getProperties().get(TMP_DIR)); - } - context.setAttribute("javax.servlet.context.tempdir", file); - } - filterHolder.setFilter(new CamelMultipartFilter()); - //add the default MultiPartFilter filter for it - context.addFilter(filterHolder, "/*", 0); context.addServlet(holder, "/*"); return camelServlet; Modified: camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java?rev=987398&r1=987397&r2=987398&view=diff ============================================================================== --- camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java (original) +++ camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java Fri Aug 20 08:02:54 2010 @@ -39,6 +39,7 @@ public class JettyHttpEndpoint extends H private HttpClient client; private JettyHttpBinding jettyBinding; private boolean enableJmx; + private boolean enableMultipartFilter; public JettyHttpEndpoint(JettyHttpComponent component, String uri, URI httpURL) throws URISyntaxException { super(uri, component, httpURL); @@ -112,4 +113,12 @@ public class JettyHttpEndpoint extends H public void setEnableJmx(boolean enableJmx) { this.enableJmx = enableJmx; } + + public boolean isEnableMultipartFilter() { + return enableMultipartFilter; + } + + public void setEnableMultipartFilter(boolean enableMultipartFilter) { + this.enableMultipartFilter = enableMultipartFilter; + } } Added: camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpBridgeMultipartRouteTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpBridgeMultipartRouteTest.java?rev=987398&view=auto ============================================================================== --- camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpBridgeMultipartRouteTest.java (added) +++ camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpBridgeMultipartRouteTest.java Fri Aug 20 08:02:54 2010 @@ -0,0 +1,96 @@ +/** + * 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.ByteArrayInputStream; +import java.io.File; + +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.apache.camel.Processor; +import org.apache.camel.RuntimeCamelException; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.http.HttpEndpoint; +import org.apache.camel.impl.DefaultHeaderFilterStrategy; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.methods.PostMethod; +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.junit.Test; + +public class HttpBridgeMultipartRouteTest extends CamelTestSupport { + + private class MultipartHeaderFilterStrategy extends DefaultHeaderFilterStrategy { + public MultipartHeaderFilterStrategy() { + initialize(); + } + + protected void initialize() { + setLowerCase(true); + setOutFilterPattern("(?i)(Camel|org\\.apache\\.camel)[\\.|a-z|A-z|0-9]*"); + } + } + + @Test + public void testHttpClient() throws Exception { + File jpg = new File("src/test/resources/java.jpg"); + String body = "TEST"; + Part[] parts = new Part[] {new StringPart("body", body), new FilePart(jpg.getName(), jpg)}; + + PostMethod method = new PostMethod("http://localhost:9090/test/hello"); + MultipartRequestEntity requestEntity = new MultipartRequestEntity(parts, method.getParams()); + method.setRequestEntity(requestEntity); + + HttpClient client = new HttpClient(); + client.executeMethod(method); + + String responseBody = method.getResponseBodyAsString(); + assertEquals(body, responseBody); + + String numAttachments = method.getResponseHeader("numAttachments").getValue(); + assertEquals(numAttachments, "1"); + } + + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() { + errorHandler(noErrorHandler()); + + Processor serviceProc = new Processor() { + public void process(Exchange exchange) throws Exception { + Message in = exchange.getIn(); + // put the number of attachments in a response header + exchange.getOut().setHeader("numAttachments", in.getAttachments().size()); + exchange.getOut().setBody(in.getHeader("body")); + } + }; + + HttpEndpoint epOut = (HttpEndpoint) getContext().getEndpoint("http://localhost:9080?bridgeEndpoint=true&throwExceptionOnFailure=false"); + epOut.setHeaderFilterStrategy(new MultipartHeaderFilterStrategy()); + + from("jetty:http://localhost:9090/test/hello?enableMultipartFilter=false") + .to(epOut); + + from("jetty://http://localhost:9080?matchOnUriPrefix=true").process(serviceProc); + } + }; + } + +} \ No newline at end of file Propchange: camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpBridgeMultipartRouteTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpBridgeMultipartRouteTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date