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