You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2010/07/30 04:47:06 UTC

svn commit: r980636 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/ components/camel-http/src/main/java/org/apache/camel/component/http/ components/camel-http4/src/main/java/org/apache/camel/component/http4/ components/camel-http4/src/mai...

Author: ningjiang
Date: Fri Jul 30 02:47:05 2010
New Revision: 980636

URL: http://svn.apache.org/viewvc?rev=980636&view=rev
Log:
CAMEL-3013 HttpProducer should support to set the http protocol version from message header

Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java
    camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java
    camel/trunk/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java
    camel/trunk/components/camel-http4/src/main/java/org/apache/camel/component/http4/helper/HttpProducerHelper.java
    camel/trunk/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpCamelHeadersTest.java
    camel/trunk/components/camel-http4/src/test/java/org/apache/camel/component/http4/handler/HeaderValidationHandler.java
    camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpHeaderTest.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java?rev=980636&r1=980635&r2=980636&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java Fri Jul 30 02:47:05 2010
@@ -76,6 +76,7 @@ public interface Exchange {
     String HTTP_CHARACTER_ENCODING = "CamelHttpCharacterEncoding";
     String HTTP_METHOD             = "CamelHttpMethod";
     String HTTP_PATH               = "CamelHttpPath";
+    String HTTP_PROTOCOL_VERSION   = "CamelHttpProtocolVersion";
     String HTTP_QUERY              = "CamelHttpQuery";
     String HTTP_RESPONSE_CODE      = "CamelHttpResponseCode";
     String HTTP_URI                = "CamelHttpUri";
@@ -83,6 +84,7 @@ public interface Exchange {
     String HTTP_CHUNKED            = "CamelHttpChunked";
     String HTTP_SERVLET_REQUEST    = "CamelHttpServletRequest";
     String HTTP_SERVLET_RESPONSE   = "CamelHttpServletResponse";
+    
 
     String INTERCEPTED_ENDPOINT = "CamelInterceptedEndpoint";
 

Modified: camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java?rev=980636&r1=980635&r2=980636&view=diff
==============================================================================
--- camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java (original)
+++ camel/trunk/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java Fri Jul 30 02:47:05 2010
@@ -39,11 +39,13 @@ import org.apache.camel.util.IOHelper;
 import org.apache.commons.httpclient.Header;
 import org.apache.commons.httpclient.HttpClient;
 import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.HttpVersion;
 import org.apache.commons.httpclient.methods.EntityEnclosingMethod;
 import org.apache.commons.httpclient.methods.FileRequestEntity;
 import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
 import org.apache.commons.httpclient.methods.RequestEntity;
 import org.apache.commons.httpclient.methods.StringRequestEntity;
+import org.apache.commons.httpclient.params.HttpMethodParams;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -65,8 +67,15 @@ public class HttpProducer extends Defaul
         if (((HttpEndpoint)getEndpoint()).isBridgeEndpoint()) {
             exchange.setProperty(Exchange.SKIP_GZIP_ENCODING, Boolean.TRUE);
         }
-        HttpMethod method = createMethod(exchange);
+        HttpMethod method = createMethod(exchange);        
         Message in = exchange.getIn();
+        String httpProtocolVersion = in.getHeader(Exchange.HTTP_PROTOCOL_VERSION, String.class);
+        if (httpProtocolVersion != null) {
+            // set the HTTP protocol version
+            HttpMethodParams params = method.getParams();
+            params.setVersion(HttpVersion.parse(httpProtocolVersion));
+        }
+        
         HeaderFilterStrategy strategy = getEndpoint().getHeaderFilterStrategy();
 
         // propagate headers as HTTP headers

Modified: camel/trunk/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java?rev=980636&r1=980635&r2=980636&view=diff
==============================================================================
--- camel/trunk/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java (original)
+++ camel/trunk/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java Fri Jul 30 02:47:05 2010
@@ -50,6 +50,7 @@ import org.apache.http.client.methods.Ht
 import org.apache.http.entity.FileEntity;
 import org.apache.http.entity.InputStreamEntity;
 import org.apache.http.entity.StringEntity;
+import org.apache.http.params.CoreProtocolPNames;
 
 /**
  * @version $Revision$
@@ -71,6 +72,11 @@ public class HttpProducer extends Defaul
         }
         HttpRequestBase httpRequest = createMethod(exchange);
         Message in = exchange.getIn();
+        String httpProtocolVersion = in.getHeader(Exchange.HTTP_PROTOCOL_VERSION, String.class);
+        if (httpProtocolVersion != null) {
+            // set the HTTP protocol version
+            httpRequest.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpProducerHelper.parserHttpVersion(httpProtocolVersion));
+        }
         HeaderFilterStrategy strategy = getEndpoint().getHeaderFilterStrategy();
 
         // propagate headers as HTTP headers

Modified: camel/trunk/components/camel-http4/src/main/java/org/apache/camel/component/http4/helper/HttpProducerHelper.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-http4/src/main/java/org/apache/camel/component/http4/helper/HttpProducerHelper.java?rev=980636&r1=980635&r2=980636&view=diff
==============================================================================
--- camel/trunk/components/camel-http4/src/main/java/org/apache/camel/component/http4/helper/HttpProducerHelper.java (original)
+++ camel/trunk/components/camel-http4/src/main/java/org/apache/camel/component/http4/helper/HttpProducerHelper.java Fri Jul 30 02:47:05 2010
@@ -22,6 +22,8 @@ import org.apache.camel.Exchange;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.component.http4.HttpEndpoint;
 import org.apache.camel.component.http4.HttpMethods;
+import org.apache.http.HttpVersion;
+import org.apache.http.ProtocolException;
 
 /**
  * Helper methods for HTTP producers.
@@ -122,5 +124,35 @@ public final class HttpProducerHelper {
 
         return answer;
     }
+    
+    public static HttpVersion parserHttpVersion(String s) throws ProtocolException {
+        int major;
+        int minor;
+        if (s == null) {
+            throw new IllegalArgumentException("String may not be null");
+        }
+        if (!s.startsWith("HTTP/")) {
+            throw new ProtocolException("Invalid HTTP version string: " + s);
+        }
+        int i1 = "HTTP/".length();
+        int i2 = s.indexOf(".", i1);
+        if (i2 == -1) {
+            throw new ProtocolException("Invalid HTTP version number: " + s);
+        }
+        try {
+            major = Integer.parseInt(s.substring(i1, i2)); 
+        } catch (NumberFormatException e) {
+            throw new ProtocolException("Invalid HTTP major version number: " + s);
+        }
+        i1 = i2 + 1;
+        i2 = s.length();
+        try {
+            minor = Integer.parseInt(s.substring(i1, i2)); 
+        } catch (NumberFormatException e) {
+            throw new ProtocolException("Invalid HTTP minor version number: " + s);
+        }
+        return new HttpVersion(major, minor);
+        
+    }
 
 }

Modified: camel/trunk/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpCamelHeadersTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpCamelHeadersTest.java?rev=980636&r1=980635&r2=980636&view=diff
==============================================================================
--- camel/trunk/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpCamelHeadersTest.java (original)
+++ camel/trunk/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpCamelHeadersTest.java Fri Jul 30 02:47:05 2010
@@ -16,13 +16,19 @@
  */
 package org.apache.camel.component.http4;
 
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.component.http4.handler.HeaderValidationHandler;
+import org.apache.http.HttpException;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
 import org.apache.http.localserver.LocalTestServer;
+import org.apache.http.protocol.HttpContext;
 import org.junit.Test;
 
 /**
@@ -37,6 +43,7 @@ public class HttpCamelHeadersTest extend
             public void process(Exchange exchange) throws Exception {
                 exchange.getIn().setHeader("TestHeader", "test");
                 exchange.getIn().setHeader("Accept-Language", "pl");
+                exchange.getIn().setHeader(Exchange.HTTP_PROTOCOL_VERSION, "HTTP/1.0");
             }
         });
 
@@ -57,6 +64,26 @@ public class HttpCamelHeadersTest extend
         expectedHeaders.put("TestHeader", "test");
         expectedHeaders.put("Accept-Language", "pl");
 
-        server.register("/", new HeaderValidationHandler("GET", null, null, getExpectedContent(), expectedHeaders));
+        server.register("/", new MyHeaderValidationHandler("GET", "HTTP/1.0", getExpectedContent(), expectedHeaders));
+    }
+    
+    class MyHeaderValidationHandler extends HeaderValidationHandler {
+        private String expectProtocolVersion;
+
+        public MyHeaderValidationHandler(String expectedMethod, String protocolVersion, 
+                                         String responseContent, Map<String, String> expectedHeaders) {
+            super(expectedMethod, null, null, responseContent, expectedHeaders);
+            expectProtocolVersion = protocolVersion;
+        }
+        
+        public void handle(final HttpRequest request, final HttpResponse response,
+                           final HttpContext context) throws HttpException, IOException {
+            if (!expectProtocolVersion.equals(request.getProtocolVersion().toString())) {
+                response.setStatusCode(HttpStatus.SC_HTTP_VERSION_NOT_SUPPORTED);
+                return;
+            }
+            super.handle(request, response, context);
+        }
+        
     }
 }
\ No newline at end of file

Modified: camel/trunk/components/camel-http4/src/test/java/org/apache/camel/component/http4/handler/HeaderValidationHandler.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-http4/src/test/java/org/apache/camel/component/http4/handler/HeaderValidationHandler.java?rev=980636&r1=980635&r2=980636&view=diff
==============================================================================
--- camel/trunk/components/camel-http4/src/test/java/org/apache/camel/component/http4/handler/HeaderValidationHandler.java (original)
+++ camel/trunk/components/camel-http4/src/test/java/org/apache/camel/component/http4/handler/HeaderValidationHandler.java Fri Jul 30 02:47:05 2010
@@ -47,17 +47,17 @@ public class HeaderValidationHandler ext
 
         if (expectedHeaders != null) {
             for (Entry<String, String> entry : expectedHeaders.entrySet()) {
-                boolean haederExist = false;
+                boolean headerExist = false;
                 Header[] headers = request.getHeaders(entry.getKey());
 
                 for (Header header : headers) {
                     if (header.getValue().equalsIgnoreCase(entry.getValue())) {
-                        haederExist = true;
+                        headerExist = true;
                         break;
                     }
                 }
 
-                if (!haederExist) {
+                if (!headerExist) {
                     response.setStatusCode(HttpStatus.SC_EXPECTATION_FAILED);
                     return;
                 }

Modified: camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpHeaderTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpHeaderTest.java?rev=980636&r1=980635&r2=980636&view=diff
==============================================================================
--- camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpHeaderTest.java (original)
+++ camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpHeaderTest.java Fri Jul 30 02:47:05 2010
@@ -19,6 +19,9 @@ package org.apache.camel.component.jetty
 import java.util.Map;
 import java.util.Map.Entry;
 
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
@@ -35,20 +38,26 @@ public class HttpHeaderTest extends Came
     public void testHttpHeaders() throws Exception {
         String result = template.requestBody("direct:start", "hello", String.class);
         assertEquals("Should send a right http header to the server.", "Find the key!", result);
+       
     }
 
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             public void configure() throws Exception {
-                from("direct:start").setHeader("SOAPAction", constant("http://xxx.com/interfaces/ticket"))
+                from("direct:start")
+                .setHeader("SOAPAction", constant("http://xxx.com/interfaces/ticket"))
                     .setHeader("Content-Type", constant("text/xml; charset=utf-8"))
+                    .setHeader(Exchange.HTTP_PROTOCOL_VERSION, constant("HTTP/1.0"))
                     .to("http://localhost:9080/myapp/mytest");
 
                 from("jetty:http://localhost:9080/myapp/mytest").process(new Processor() {
 
                     public void process(Exchange exchange) throws Exception {
                         Map<String, Object> headers = exchange.getIn().getHeaders();
+                        ServletRequest request = exchange.getIn().getHeader(Exchange.HTTP_SERVLET_REQUEST, ServletRequest.class);
+                        assertNotNull(request);
+                        assertEquals("Get a wong http protocol version", request.getProtocol(), "HTTP/1.0");
                         for (Entry<String, Object> entry : headers.entrySet()) {
                             if ("SOAPAction".equals(entry.getKey()) && "http://xxx.com/interfaces/ticket".equals(entry.getValue())) {
                                 exchange.getOut().setBody("Find the key!");