You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2017/10/05 11:37:24 UTC

[2/5] camel git commit: CAMEL-10665: Setting restlet standard headers should be done via their special api instead of making it easy :(

CAMEL-10665: Setting restlet standard headers should be done via their special api instead of making it easy :(


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/cef6626e
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/cef6626e
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/cef6626e

Branch: refs/heads/master
Commit: cef6626ec8e8e9488833b8206ddd30d7fc6fc318
Parents: 93c30cf
Author: Claus Ibsen <da...@apache.org>
Authored: Thu Oct 5 13:09:31 2017 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Thu Oct 5 13:37:17 2017 +0200

----------------------------------------------------------------------
 .../restlet/DefaultRestletBinding.java          | 78 +++++++++++++++++---
 ...estletProducerStandardHeaderWarningTest.java |  8 --
 .../component/restlet/RestletTestSupport.java   |  7 ++
 3 files changed, 75 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/cef6626e/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java
----------------------------------------------------------------------
diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java
index 70f9806..5c7ed1f 100644
--- a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java
+++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java
@@ -52,6 +52,7 @@ import org.apache.http.NameValuePair;
 import org.apache.http.client.utils.URLEncodedUtils;
 import org.restlet.Request;
 import org.restlet.Response;
+import org.restlet.data.AuthenticationInfo;
 import org.restlet.data.CacheDirective;
 import org.restlet.data.ChallengeResponse;
 import org.restlet.data.ChallengeScheme;
@@ -310,7 +311,7 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate
         LOG.debug("Detected {} extension headers", extensionHeaders.getHeaders().size());
         LOG.debug("Detected {} standard headers", standardHeaders.size());
 
-        configureRestletStandardHeaders(exchange, request, standardHeaders);
+        configureRestletRequestStandardHeaders(exchange, request, standardHeaders);
 
         // deprecated accept
         final MediaType[] acceptedMediaTypes = exchange.getIn().getHeader(Exchange.ACCEPT_CONTENT_TYPE, MediaType[].class);
@@ -323,7 +324,7 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate
         }
     }
 
-    private void configureRestletStandardHeaders(Exchange exchange, Request request, Series standardHeaders) {
+    private void configureRestletRequestStandardHeaders(Exchange exchange, Request request, Series standardHeaders) {
         Iterator it = standardHeaders.iterator();
         while (it.hasNext()) {
             Header h = (Header) it.next();
@@ -334,7 +335,6 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate
                 ChallengeResponse c = new ChallengeResponse(new ChallengeScheme("", ""));
                 c.setRawValue(value);
                 request.setChallengeResponse(c);
-                continue;
             } else if ("Accept".equalsIgnoreCase(key)) {
                 ClientInfo clientInfo = request.getClientInfo();
                 List<Preference<MediaType>> acceptedMediaTypesList = clientInfo.getAcceptedMediaTypes();
@@ -342,16 +342,56 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate
                 for (MediaType acceptedMediaType : acceptedMediaTypes) {
                     acceptedMediaTypesList.add(new Preference<MediaType>(acceptedMediaType));
                 }
-                continue;
             } else if ("Content-Type".equalsIgnoreCase(key)) {
                 MediaType mediaType = exchange.getContext().getTypeConverter().tryConvertTo(MediaType.class, exchange, value);
                 if (mediaType != null) {
                     request.getEntity().setMediaType(mediaType);
                 }
-                continue;
+            } else if ("User-Agent".equalsIgnoreCase(key)) {
+                request.getClientInfo().setAgent(value);
+            } else if ("Referer".equalsIgnoreCase(key)) {
+                request.setReferrerRef(value);
+            } else if ("Host".equalsIgnoreCase(key)) {
+                request.setHostRef(value);
+            } else if ("Date".equalsIgnoreCase(key)) {
+                Date d = exchange.getContext().getTypeConverter().tryConvertTo(Date.class, exchange, value);
+                if (d != null) {
+                    request.setDate(d);
+                }
+            } else {
+                // TODO: implement all the other restlet standard headers
+                LOG.warn("Addition of the standard header \"{}\" is not allowed. Please use the equivalent property in the Restlet API.", key);
+            }
+        }
+    }
+
+    private void configureRestletResponseStandardHeaders(Exchange exchange, Response response, Series standardHeaders) {
+        Iterator it = standardHeaders.iterator();
+        while (it.hasNext()) {
+            Header h = (Header) it.next();
+            String key = h.getName();
+            String value = h.getValue();
+            if ("Content-Type".equalsIgnoreCase(key)) {
+                MediaType mediaType = exchange.getContext().getTypeConverter().tryConvertTo(MediaType.class, exchange, value);
+                if (mediaType != null) {
+                    response.getEntity().setMediaType(mediaType);
+                }
+            } else if ("Server".equalsIgnoreCase(key)) {
+                response.getServerInfo().setAgent(value);
+            } else if ("Age".equalsIgnoreCase(key)) {
+                Integer age = exchange.getContext().getTypeConverter().tryConvertTo(Integer.class, exchange, value);
+                if (age != null) {
+                    response.setAge(age);
+                }
+            } else if ("Expires".equalsIgnoreCase(key)) {
+                Date date = exchange.getContext().getTypeConverter().tryConvertTo(Date.class, exchange, value);
+                if (date != null) {
+                    response.getEntity().setExpirationDate(date);
+                }
+            } else {
+                // TODO: implement all the other restlet standard headers
+                LOG.warn("Addition of the standard header \"{}\" is not allowed. Please use the equivalent property in the Restlet API.", key);
             }
-            // TODO: implement all the other restlet standard headers
-            LOG.warn("Addition of the standard header \"{}\" is not allowed. Please use the equivalent property in the Restlet API.", key);
         }
     }
 
@@ -450,9 +490,27 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate
             }
         }
 
-        // set HTTP headers so we return these in the response
-        if (!series.isEmpty()) {
-            response.getAttributes().put(HeaderConstants.ATTRIBUTE_HEADERS, series);
+        // filter out standard restlet headers which must be configured differently
+        org.restlet.Message extensionHeaders = new Request();
+        HeaderUtils.copyExtensionHeaders(series, extensionHeaders);
+
+        // setup standard headers
+        Series<Header> standardHeaders = new Series<>(Header.class);
+        standardHeaders.addAll(series);
+        standardHeaders.removeAll(extensionHeaders.getHeaders());
+
+        // setup extension headers
+        series.removeAll(standardHeaders);
+
+        // now add standard headers but via the special restlet api
+        LOG.debug("Detected {} extension headers", extensionHeaders.getHeaders().size());
+        LOG.debug("Detected {} standard headers", standardHeaders.size());
+
+        configureRestletResponseStandardHeaders(exchange, response, standardHeaders);
+
+        // include the extension headers on the response
+        if (extensionHeaders.getHeaders().size() > 0) {
+            response.getHeaders().addAll(extensionHeaders.getHeaders());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/cef6626e/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerStandardHeaderWarningTest.java
----------------------------------------------------------------------
diff --git a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerStandardHeaderWarningTest.java b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerStandardHeaderWarningTest.java
index 8037eae..b9e105a 100644
--- a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerStandardHeaderWarningTest.java
+++ b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerStandardHeaderWarningTest.java
@@ -16,13 +16,10 @@
  */
 package org.apache.camel.component.restlet;
 
-import java.util.logging.Level;
-
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.junit.Test;
-import org.slf4j.bridge.SLF4JBridgeHandler;
 
 /**
  * @version 
@@ -31,11 +28,6 @@ public class RestletProducerStandardHeaderWarningTest extends RestletTestSupport
 
     @Test
     public void testRestletProducerAuthorizationGet() throws Exception {
-        // restlet uses the JUL logger which is a pain to configure/install
-        // we should not see WARN logs
-        SLF4JBridgeHandler.install();
-        java.util.logging.LogManager.getLogManager().getLogger("").setLevel(Level.INFO);
-
         String out = fluentTemplate.to("direct:start")
             .withHeader("id", 123).withHeader("Authorization", "myuser")
             .request(String.class);

http://git-wip-us.apache.org/repos/asf/camel/blob/cef6626e/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletTestSupport.java
----------------------------------------------------------------------
diff --git a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletTestSupport.java b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletTestSupport.java
index 389a1f5..e1df106 100644
--- a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletTestSupport.java
+++ b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletTestSupport.java
@@ -17,6 +17,7 @@
 package org.apache.camel.component.restlet;
 
 import java.io.IOException;
+import java.util.logging.Level;
 
 import org.apache.camel.test.AvailablePortFinder;
 import org.apache.camel.test.junit4.CamelTestSupport;
@@ -28,6 +29,7 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.http.util.EntityUtils;
 import org.junit.BeforeClass;
+import org.slf4j.bridge.SLF4JBridgeHandler;
 
 /**
  *
@@ -38,6 +40,11 @@ public abstract class RestletTestSupport extends CamelTestSupport {
     
     @BeforeClass
     public static void initializePortNum() {
+        // restlet uses the JUL logger which is a pain to configure/install
+        // we should not see WARN logs
+        SLF4JBridgeHandler.install();
+        java.util.logging.LogManager.getLogManager().getLogger("").setLevel(Level.INFO);
+
         portNum = AvailablePortFinder.getNextAvailable();
     }