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;
+ }
+}