Repository: camel Updated Branches: refs/heads/master 7113dee32 -> 965d2377a
Rest DSL. camel-swagger work in progress. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/965d2377 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/965d2377 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/965d2377 Branch: refs/heads/master Commit: 965d2377ab5c3ddca3bc39bcc42330d18cc05dfa Parents: 7113dee Author: Claus Ibsen <davscl...@apache.org> Authored: Sun Aug 10 16:38:50 2014 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Sun Aug 10 16:38:50 2014 +0200 ---------------------------------------------------------------------- .../camel/component/http/CamelServlet.java | 16 ++++++++++++++- ...JettyRestServletResolveConsumerStrategy.java | 7 ++++++- .../netty/http/RestContextPathMatcher.java | 2 ++ .../http/handlers/HttpServerChannelHandler.java | 21 ++++++++++++++++++++ ...rvletRestServletResolveConsumerStrategy.java | 7 ++++++- .../camel/example/rest/UserRouteBuilder.java | 2 +- .../apache/camel/example/rest/UserService.java | 5 ++--- .../src/main/resources/camel-config-xml.xml | 2 +- 8 files changed, 54 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/965d2377/components/camel-http/src/main/java/org/apache/camel/component/http/CamelServlet.java ---------------------------------------------------------------------- diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/CamelServlet.java b/components/camel-http/src/main/java/org/apache/camel/component/http/CamelServlet.java index 926d25d..f70b57b 100644 --- a/components/camel-http/src/main/java/org/apache/camel/component/http/CamelServlet.java +++ b/components/camel-http/src/main/java/org/apache/camel/component/http/CamelServlet.java @@ -74,9 +74,23 @@ public class CamelServlet extends HttpServlet { response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE); return; } + + // if its an OPTIONS request then return which method is allowed + if ("OPTIONS".equals(request.getMethod())) { + String s; + if (consumer.getEndpoint().getHttpMethodRestrict() != null) { + s = "OPTIONS," + consumer.getEndpoint().getHttpMethodRestrict(); + } else { + // allow them all + s = "GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,CONNECT,PATCH"; + } + response.addHeader("Allow", s); + response.setStatus(HttpServletResponse.SC_OK); + return; + } if (consumer.getEndpoint().getHttpMethodRestrict() != null - && !consumer.getEndpoint().getHttpMethodRestrict().equals(request.getMethod())) { + && !consumer.getEndpoint().getHttpMethodRestrict().contains(request.getMethod())) { response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED); return; } http://git-wip-us.apache.org/repos/asf/camel/blob/965d2377/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyRestServletResolveConsumerStrategy.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyRestServletResolveConsumerStrategy.java b/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyRestServletResolveConsumerStrategy.java index 1a7e05a..a8c3a4f 100644 --- a/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyRestServletResolveConsumerStrategy.java +++ b/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyRestServletResolveConsumerStrategy.java @@ -152,7 +152,12 @@ public class JettyRestServletResolveConsumerStrategy extends HttpServletResolveC return true; } - return method.toLowerCase(Locale.US).endsWith(restrict.toLowerCase(Locale.US)); + // always match OPTIONS as some REST clients uses that prior to calling the service + if ("OPTIONS".equals(method)) { + return true; + } + + return restrict.toLowerCase(Locale.US).contains(method.toLowerCase(Locale.US)); } } http://git-wip-us.apache.org/repos/asf/camel/blob/965d2377/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/RestContextPathMatcher.java ---------------------------------------------------------------------- diff --git a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/RestContextPathMatcher.java b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/RestContextPathMatcher.java index c48e815..f7e73db 100644 --- a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/RestContextPathMatcher.java +++ b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/RestContextPathMatcher.java @@ -23,6 +23,8 @@ public class RestContextPathMatcher extends DefaultContextPathMatcher { private final String rawPath; + // TODO: improve matching like we have done in camel-servlet + public RestContextPathMatcher(String rawPath, String path, boolean matchOnUriPrefix) { super(path, matchOnUriPrefix); this.rawPath = rawPath; http://git-wip-us.apache.org/repos/asf/camel/blob/965d2377/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpServerChannelHandler.java ---------------------------------------------------------------------- diff --git a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpServerChannelHandler.java b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpServerChannelHandler.java index f30c304..3bf21ba 100644 --- a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpServerChannelHandler.java +++ b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/handlers/HttpServerChannelHandler.java @@ -53,6 +53,7 @@ import org.slf4j.LoggerFactory; import static org.jboss.netty.handler.codec.http.HttpHeaders.isKeepAlive; import static org.jboss.netty.handler.codec.http.HttpResponseStatus.BAD_REQUEST; import static org.jboss.netty.handler.codec.http.HttpResponseStatus.METHOD_NOT_ALLOWED; +import static org.jboss.netty.handler.codec.http.HttpResponseStatus.OK; import static org.jboss.netty.handler.codec.http.HttpResponseStatus.SERVICE_UNAVAILABLE; import static org.jboss.netty.handler.codec.http.HttpResponseStatus.UNAUTHORIZED; import static org.jboss.netty.handler.codec.http.HttpVersion.HTTP_1_1; @@ -91,6 +92,26 @@ public class HttpServerChannelHandler extends ServerChannelHandler { messageEvent.getChannel().write(response); return; } + + // if its an OPTIONS request then return which methods is allowed + if ("OPTIONS".equals(request.getMethod().getName())) { + String s; + if (consumer.getEndpoint().getHttpMethodRestrict() != null) { + s = "OPTIONS," + consumer.getEndpoint().getHttpMethodRestrict(); + } else { + // allow them all + s = "GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,CONNECT,PATCH"; + } + HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK); + response.setChunked(false); + response.headers().set("Allow", s); + response.headers().set(Exchange.CONTENT_TYPE, "text/plain"); + response.headers().set(Exchange.CONTENT_LENGTH, 0); + messageEvent.getChannel().write(response); + return; + } + + if (consumer.getEndpoint().getHttpMethodRestrict() != null && !consumer.getEndpoint().getHttpMethodRestrict().contains(request.getMethod().getName())) { HttpResponse response = new DefaultHttpResponse(HTTP_1_1, METHOD_NOT_ALLOWED); http://git-wip-us.apache.org/repos/asf/camel/blob/965d2377/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletRestServletResolveConsumerStrategy.java ---------------------------------------------------------------------- diff --git a/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletRestServletResolveConsumerStrategy.java b/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletRestServletResolveConsumerStrategy.java index ac24ef0..c315fa5 100644 --- a/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletRestServletResolveConsumerStrategy.java +++ b/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletRestServletResolveConsumerStrategy.java @@ -155,7 +155,12 @@ public class ServletRestServletResolveConsumerStrategy extends HttpServletResolv return true; } - return method.toLowerCase(Locale.US).endsWith(restrict.toLowerCase(Locale.US)); + // always match OPTIONS as some REST clients uses that prior to calling the service + if ("OPTIONS".equals(method)) { + return true; + } + + return restrict.toLowerCase(Locale.US).contains(method.toLowerCase(Locale.US)); } } http://git-wip-us.apache.org/repos/asf/camel/blob/965d2377/examples/camel-example-servlet-rest-tomcat/src/main/java/org/apache/camel/example/rest/UserRouteBuilder.java ---------------------------------------------------------------------- diff --git a/examples/camel-example-servlet-rest-tomcat/src/main/java/org/apache/camel/example/rest/UserRouteBuilder.java b/examples/camel-example-servlet-rest-tomcat/src/main/java/org/apache/camel/example/rest/UserRouteBuilder.java index 807f4b4..1aabafc 100644 --- a/examples/camel-example-servlet-rest-tomcat/src/main/java/org/apache/camel/example/rest/UserRouteBuilder.java +++ b/examples/camel-example-servlet-rest-tomcat/src/main/java/org/apache/camel/example/rest/UserRouteBuilder.java @@ -52,7 +52,7 @@ public class UserRouteBuilder extends RouteBuilder { .get("/{id}").outType(User.class) .to("bean:userService?method=getUser(${header.id})") - .put().type(User.class).outType(User.class) + .put().type(User.class) .to("bean:userService?method=updateUser") .get("/findAll").outTypeList(User.class) http://git-wip-us.apache.org/repos/asf/camel/blob/965d2377/examples/camel-example-servlet-rest-tomcat/src/main/java/org/apache/camel/example/rest/UserService.java ---------------------------------------------------------------------- diff --git a/examples/camel-example-servlet-rest-tomcat/src/main/java/org/apache/camel/example/rest/UserService.java b/examples/camel-example-servlet-rest-tomcat/src/main/java/org/apache/camel/example/rest/UserService.java index e59ce5f..26abd73 100644 --- a/examples/camel-example-servlet-rest-tomcat/src/main/java/org/apache/camel/example/rest/UserService.java +++ b/examples/camel-example-servlet-rest-tomcat/src/main/java/org/apache/camel/example/rest/UserService.java @@ -56,9 +56,8 @@ public class UserService { * Updates or creates the given user * * @param user the user - * @return the old user before it was updated, or <tt>null</tt> if creating a new user */ - public User updateUser(User user) { - return users.put("" + user.getId(), user); + public void updateUser(User user) { + users.put("" + user.getId(), user); } } http://git-wip-us.apache.org/repos/asf/camel/blob/965d2377/examples/camel-example-servlet-rest-tomcat/src/main/resources/camel-config-xml.xml ---------------------------------------------------------------------- diff --git a/examples/camel-example-servlet-rest-tomcat/src/main/resources/camel-config-xml.xml b/examples/camel-example-servlet-rest-tomcat/src/main/resources/camel-config-xml.xml index b6185c6..82192e6 100755 --- a/examples/camel-example-servlet-rest-tomcat/src/main/resources/camel-config-xml.xml +++ b/examples/camel-example-servlet-rest-tomcat/src/main/resources/camel-config-xml.xml @@ -48,7 +48,7 @@ </get> <!-- this is a rest PUT to create/update an user --> - <put type="org.apache.camel.example.rest.User" outType="org.apache.camel.example.rest.User"> + <put type="org.apache.camel.example.rest.User"> <to uri="bean:userService?method=updateUser"/> </put>