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


Reply via email to