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();
}