From 92b16e638aa01d671a35aeef41312aa277295a09 Mon Sep 17 00:00:00 2001 From: aldettinger Date: Mon, 14 Aug 2017 15:49:23 +0200 Subject: [PATCH] CAMEL-11316: Added support for HTTP OPTIONS in camel-restlet --- .../component/restlet/MethodBasedRouter.java | 6 +++-- .../component/restlet/RestletComponent.java | 26 +++++++++++-------- .../restlet/RestRestletHttpOptionsTest.java | 5 ++-- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/MethodBasedRouter.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/MethodBasedRouter.java index b9518c370b17d..7e782451daf2f 100644 --- a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/MethodBasedRouter.java +++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/MethodBasedRouter.java @@ -50,13 +50,15 @@ public void handle(Request request, Response response) { LOG.debug("MethodRouter ({}) received request method: {}", uriPattern, method); Restlet target = routes.get(method); + if (target == null || org.restlet.data.Method.OPTIONS.equals(method)) { + // must include list of allowed methods + response.setAllowedMethods(routes.keySet()); + } if (target != null) { target.handle(request, response); } else { LOG.debug("MethodRouter ({}) method not allowed: {}", uriPattern, method); response.setStatus(Status.CLIENT_ERROR_METHOD_NOT_ALLOWED); - // must include list of allowed methods - response.setAllowedMethods(routes.keySet()); } } diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java index e2f1b7199b2d5..c01a1eac3099f 100644 --- a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java +++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java @@ -22,6 +22,7 @@ import java.security.InvalidParameterException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -284,13 +285,16 @@ public void disconnect(RestletConsumer consumer) throws Exception { } for (MethodBasedRouter router : routesToRemove) { + + List methods = new ArrayList<>(); + Collections.addAll(methods, Method.OPTIONS); if (endpoint.getRestletMethods() != null) { - Method[] methods = endpoint.getRestletMethods(); - for (Method method : methods) { - router.removeRoute(method); - } + Collections.addAll(methods, endpoint.getRestletMethods()); } else { - router.removeRoute(endpoint.getRestletMethod()); + Collections.addAll(methods, endpoint.getRestletMethod()); + } + for (Method method : methods) { + router.removeRoute(method); } if (LOG.isDebugEnabled()) { @@ -488,14 +492,14 @@ private void attachUriPatternToRestlet(String offsetPath, String uriPattern, Res LOG.debug("Target has been set to guard: {}", guard); } + List methods = new ArrayList<>(); + Collections.addAll(methods, Method.OPTIONS); if (endpoint.getRestletMethods() != null) { - Method[] methods = endpoint.getRestletMethods(); - for (Method method : methods) { - router.addRoute(method, target); - LOG.debug("Attached restlet uriPattern: {} method: {}", uriPattern, method); - } + Collections.addAll(methods, endpoint.getRestletMethods()); } else { - Method method = endpoint.getRestletMethod(); + Collections.addAll(methods, endpoint.getRestletMethod()); + } + for (Method method : methods) { router.addRoute(method, target); LOG.debug("Attached restlet uriPattern: {} method: {}", uriPattern, method); } diff --git a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestRestletHttpOptionsTest.java b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestRestletHttpOptionsTest.java index e8625738f229b..6d1ecad4d1a2f 100644 --- a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestRestletHttpOptionsTest.java +++ b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestRestletHttpOptionsTest.java @@ -25,7 +25,6 @@ /** * @version */ -@Ignore("Not supported by camel-restlet yet") public class RestRestletHttpOptionsTest extends RestletTestSupport { @Test @@ -38,12 +37,12 @@ public void process(Exchange exchange) throws Exception { }); assertEquals(200, exchange.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE)); - assertEquals("OPTIONS,GET", exchange.getOut().getHeader("ALLOW")); + assertEquals("GET, OPTIONS", exchange.getOut().getHeader("ALLOW")); assertEquals("", exchange.getOut().getBody(String.class)); exchange = fluentTemplate.to("http://localhost:" + portNum + "/users/v1/123").withHeader(Exchange.HTTP_METHOD, "OPTIONS").send(); assertEquals(200, exchange.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE)); - assertEquals("OPTIONS,PUT", exchange.getOut().getHeader("ALLOW")); + assertEquals("OPTIONS, PUT", exchange.getOut().getHeader("ALLOW")); assertEquals("", exchange.getOut().getBody(String.class)); }