You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ha...@apache.org on 2008/02/28 04:52:48 UTC

svn commit: r631834 - in /activemq/camel/trunk: camel-core/src/test/java/org/apache/camel/builder/ components/camel-http/src/main/java/org/apache/camel/component/http/ components/camel-jetty/src/main/java/org/apache/camel/component/jetty/ components/ca...

Author: hadrian
Date: Wed Feb 27 19:52:47 2008
New Revision: 631834

URL: http://svn.apache.org/viewvc?rev=631834&view=rev
Log:
CAMEL-324.  Patch applied with thanks!

Added:
    activemq/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpRoundtripHeaderTest.java
Modified:
    activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerTest.java
    activemq/camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpBinding.java
    activemq/camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java
    activemq/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpProducer.java

Modified: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerTest.java?rev=631834&r1=631833&r2=631834&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerTest.java (original)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerTest.java Wed Feb 27 19:52:47 2008
@@ -68,7 +68,7 @@
         RouteBuilder builder = new RouteBuilder() {
             public void configure() {
                 from("seda:a").errorHandler(loggingErrorHandler("FOO.BAR")).to("seda:b");
-                // this route willÊuse the default error handler, DeadLetterChannel
+                // this route will use the default error handler, DeadLetterChannel
                 from("seda:b").to("seda:c");
             }
         };

Modified: activemq/camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpBinding.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpBinding.java?rev=631834&r1=631833&r2=631834&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpBinding.java (original)
+++ activemq/camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpBinding.java Wed Feb 27 19:52:47 2008
@@ -18,6 +18,9 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
 
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
@@ -30,6 +33,11 @@
  */
 public class HttpBinding {
 
+    // This should be a set of lower-case strings 
+    public static final Set<String> DEFAULT_HEADERS_TO_IGNORE = new HashSet<String>(Arrays.asList(
+            "content-length", "content-type", HttpProducer.HTTP_RESPONSE_CODE.toLowerCase()));
+    private Set<String> ignoredHeaders = DEFAULT_HEADERS_TO_IGNORE;
+
     /**
      * Writes the exchange to the servlet response
      * 
@@ -43,7 +51,7 @@
             // Write out the headers...
             for (String key : out.getHeaders().keySet()) {
                 String value = out.getHeader(key, String.class);
-                if (value != null) {
+                if (shouldHeaderBePropagated(key, value)) {
                     response.setHeader(key, value);
                 }
             }
@@ -77,5 +85,34 @@
         // lets assume the body is a reader
         HttpServletRequest request = httpMessage.getRequest();
         return request.getReader();
+    }
+    
+    /*
+     * Exclude a set of headers from responses and new requests as all headers get
+     * propagated between exchanges by default
+     */
+    public boolean shouldHeaderBePropagated(String headerName, String headerValue) {
+        if (headerValue == null) {
+            return false;
+        }
+        if (headerName.startsWith("org.apache.camel")) {
+            return false;
+        }
+        if (getIgnoredHeaders().contains(headerName.toLowerCase())) {
+            return false;
+        }
+        return true;
+    }
+
+    /*
+     * override the set of headers to ignore for responses and new requests
+     * @param headersToIgnore should be a set of lower-case strings
+     */
+    public void setIgnoredHeaders(Set<String> headersToIgnore) {
+        ignoredHeaders  = headersToIgnore;
+    }
+    
+    public Set<String> getIgnoredHeaders() {
+        return ignoredHeaders;
     }
 }

Modified: activemq/camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java?rev=631834&r1=631833&r2=631834&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java (original)
+++ activemq/camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java Wed Feb 27 19:52:47 2008
@@ -17,9 +17,6 @@
 package org.apache.camel.component.http;
 
 import java.io.InputStream;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
@@ -37,12 +34,9 @@
  * @version $Revision$
  */
 public class HttpProducer extends DefaultProducer<HttpExchange> implements Producer<HttpExchange> {
-    private static final String HTTP_RESPONSE_CODE = "http.responseCode";
+    public static final String HTTP_RESPONSE_CODE = "http.responseCode";
     public static final String QUERY = "org.apache.camel.component.http.query";
     
-    // This should be a set of lower-case strings 
-    public static final Set<String> HEADERS_TO_SKIP = new HashSet<String>(Arrays.asList(
-            "content-length", "content-type", HTTP_RESPONSE_CODE.toLowerCase())); 
     private HttpClient httpClient;
 
     public HttpProducer(HttpEndpoint endpoint) {
@@ -53,11 +47,11 @@
     public void process(Exchange exchange) throws Exception {
         HttpMethod method = createMethod(exchange);
         
-        
+        HttpBinding binding = ((HttpEndpoint)getEndpoint()).getBinding();
         // propagate headers as HTTP headers
         for (String headerName : exchange.getIn().getHeaders().keySet()) {
             String headerValue = exchange.getIn().getHeader(headerName, String.class);
-            if (shouldHeaderBePropagated(headerName, headerValue)) {
+            if (binding.shouldHeaderBePropagated(headerName, headerValue)) {
                 method.addRequestHeader(headerName, headerValue);
             }
         }
@@ -121,18 +115,5 @@
             }
         }
         return entity;
-    }
-    
-    protected boolean shouldHeaderBePropagated(String headerName, String headerValue) {
-        if (headerValue == null) {
-            return false;
-        }
-        if (headerName.startsWith("org.apache.camel")) {
-            return false;
-        }
-        if (HEADERS_TO_SKIP.contains(headerName.toLowerCase())) {
-            return false;
-        }
-        return true;
     }
 }

Modified: activemq/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpProducer.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpProducer.java?rev=631834&r1=631833&r2=631834&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpProducer.java (original)
+++ activemq/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpProducer.java Wed Feb 27 19:52:47 2008
@@ -26,6 +26,7 @@
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.Producer;
+import org.apache.camel.component.http.HttpBinding;
 import org.apache.camel.component.http.HttpEndpoint;
 import org.apache.camel.component.http.HttpExchange;
 import org.apache.camel.impl.DefaultProducer;
@@ -127,11 +128,12 @@
             }
         }
 
+        HttpBinding binding = ((HttpEndpoint)getEndpoint()).getBinding();
         for (String name : in.getHeaders().keySet()) {            
             String value = in.getHeader(name, String.class);
             if( "Content-Type".equals(name) ) {
                 jettyExchange.setRequestContentType(value);
-            } else {
+            } else if (binding.shouldHeaderBePropagated(name, value)){
                 jettyExchange.addRequestHeader(name, value);
             }
         }

Added: activemq/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpRoundtripHeaderTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpRoundtripHeaderTest.java?rev=631834&view=auto
==============================================================================
--- activemq/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpRoundtripHeaderTest.java (added)
+++ activemq/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpRoundtripHeaderTest.java Wed Feb 27 19:52:47 2008
@@ -0,0 +1,128 @@
+/**
+ * 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.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+
+public class HttpRoundtripHeaderTest extends ContextTestSupport {
+    protected final String uri = "http://localhost:8088/WhichWillGetCloseException";
+    protected final String jettyUri = "jetty:" + uri;
+    protected final String outputText = ":output";
+    protected String inputText = "input";
+    protected String expectedText = inputText + outputText;
+
+    // http://issues.apache.org/activemq/browse/CAMEL-324
+    public void testHttpRoundTripHeaders() throws Exception {
+
+        MockEndpoint mockEndpoint = resolveMandatoryEndpoint("mock:results", MockEndpoint.class);
+        mockEndpoint.expectedMessageCount(1);
+
+        InputStream answer = (InputStream) template.sendBody(uri, inputText);
+
+        verifyMockGotExpectedText(mockEndpoint, expectedText);
+
+        // read the response data
+        String lastLine = readLastLine(answer);
+
+        assertNotNull("last response line", lastLine);
+        assertEquals("response matches: " + expectedText, expectedText,
+                lastLine);
+    }
+
+    public void testHttpRoundTripHeadersWithNoIngoredHeaders() throws Exception {
+
+        MockEndpoint mockEndpoint = resolveMandatoryEndpoint("mock:results", MockEndpoint.class);
+        mockEndpoint.expectedMessageCount(1);
+
+        JettyHttpEndpoint endpoint = context.getEndpoint(jettyUri, JettyHttpEndpoint.class);
+        // override the default set of ignored headers which includes Content-Length
+        endpoint.getBinding().setIgnoredHeaders(new HashSet<String>());
+
+        InputStream answer = (InputStream) template.sendBody(uri, inputText);
+
+        verifyMockGotExpectedText(mockEndpoint, expectedText);
+
+        // read the response data
+        String lastLine = readLastLine(answer);
+
+        assertNotNull("last response line", lastLine);
+        // Content-Length from request will truncate the output to just the
+        // inputText
+        assertEquals("response matches: " + inputText, inputText, lastLine);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                Processor processor = new Processor() {
+                    public void process(Exchange exchange) {
+                        String input = (String) exchange.getIn().getBody();
+                        // append some text to invalidate Context-Length
+                        // for the http reply
+                        exchange.getOut().setBody(input + outputText);
+                    }
+                };
+
+                // the unmarshaller does a copy from in message to out
+                // including all headers
+                from(jettyUri).unmarshal().string().process(processor).to("mock:results");
+            }
+        };
+    }
+
+    private void verifyMockGotExpectedText(MockEndpoint mockEndpoint, String expected) throws InterruptedException {
+        mockEndpoint.assertIsSatisfied();
+        List<Exchange> list = mockEndpoint.getReceivedExchanges();
+        Exchange exchange = list.get(0);
+        assertNotNull("exchange", exchange);
+        Message in = exchange.getIn();
+        assertNotNull("in", in);
+        Map<String, Object> headers = in.getHeaders();
+        assertTrue("no headers are propagated", headers.isEmpty());
+        assertEquals("body has expectedText:" + expected, expected, in.getBody());
+    }
+
+    private String readLastLine(InputStream answer) throws IOException {
+        String lastLine = null;
+        BufferedReader reader = new BufferedReader(
+                new InputStreamReader(answer));
+        while (true) {
+            String line = reader.readLine();
+            if (line == null) {
+                break;
+            }
+            lastLine = line;
+            log.info("Read: " + line);
+        }
+        reader.close();
+        return lastLine;
+    }
+}