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 <davscl...@apache.org> Authored: Thu Oct 5 13:09:31 2017 +0200 Committer: Claus Ibsen <davscl...@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(); }