diff --git a/examples/example-servlet/src/main/java/io/grpc/servlet/examples/helloworld/HelloWorldServlet.java b/examples/example-servlet/src/main/java/io/grpc/servlet/examples/helloworld/HelloWorldServlet.java index a970c26a119..2f0a5f149b1 100644 --- a/examples/example-servlet/src/main/java/io/grpc/servlet/examples/helloworld/HelloWorldServlet.java +++ b/examples/example-servlet/src/main/java/io/grpc/servlet/examples/helloworld/HelloWorldServlet.java @@ -64,7 +64,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { if (ServletAdapter.isGrpc(request)) { - servletAdapter.doPost(request, response); + servletAdapter.doPost("helloworld.Greeter/SayHello", request, response); } else { response.setContentType("text/html"); response.getWriter().println("
Hello non-gRPC client!
"); diff --git a/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java b/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java index f68ed083506..5e9cec4a008 100644 --- a/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java +++ b/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java @@ -36,6 +36,7 @@ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/5066") public class GrpcServlet extends HttpServlet { private static final long serialVersionUID = 1L; + public static final String REMOVE_CONTEXT_PATH = "REMOVE_CONTEXT_PATH"; private final ServletAdapter servletAdapter; @@ -58,6 +59,16 @@ private static ServletAdapter loadServices(List extends BindableService> binda return serverBuilder.buildServletAdapter(); } + private String getMethod(HttpServletRequest req) { + Boolean removeContextPath = Boolean.parseBoolean(getInitParameter(REMOVE_CONTEXT_PATH)); + String method = req.getRequestURI(); + if (removeContextPath) { + // remove context path used in application server + method = method.substring(req.getContextPath().length()); + } + return method.substring(1); // remove the leading "/" + } + @Override protected final void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { @@ -67,7 +78,7 @@ protected final void doGet(HttpServletRequest request, HttpServletResponse respo @Override protected final void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { - servletAdapter.doPost(request, response); + servletAdapter.doPost(getMethod(request), request, response); } @Override diff --git a/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java b/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java index 5a567916f99..b6e0eabd502 100644 --- a/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java +++ b/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java @@ -59,10 +59,11 @@ * process it, and transforms the gRPC response into {@link HttpServletResponse}. An adapter can be * instantiated by {@link ServletServerBuilder#buildServletAdapter()}. * - *In a servlet, calling {@link #doPost(HttpServletRequest, HttpServletResponse)} inside {@link - * javax.servlet.http.HttpServlet#doPost(HttpServletRequest, HttpServletResponse)} makes the servlet - * backed by the gRPC server associated with the adapter. The servlet must support Asynchronous - * Processing and must be deployed to a container that supports servlet 4.0 and enables HTTP/2. + *
In a servlet, calling {@link #doPost(String, HttpServletRequest, HttpServletResponse)} inside + * {@link javax.servlet.http.HttpServlet#doPost(HttpServletRequest, HttpServletResponse)} makes + * the servlet backed by the gRPC server associated with the adapter. The servlet must support + * Asynchronous Processing and must be deployed to a container that supports servlet 4.0 + * and enables HTTP/2. * *
The API is experimental. The authors would like to know more about the real usecases. Users * are welcome to provide feedback by commenting on @@ -110,7 +111,8 @@ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOExc *
Do not modify {@code req} and {@code resp} before or after calling this method. However, * calling {@code resp.setBufferSize()} before invocation is allowed. */ - public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + public void doPost(String method, HttpServletRequest req, HttpServletResponse resp) + throws IOException { checkArgument(req.isAsyncSupported(), "servlet does not support asynchronous operation"); checkArgument(ServletAdapter.isGrpc(req), "the request is not a gRPC request"); @@ -119,7 +121,6 @@ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOEx AsyncContext asyncCtx = req.startAsync(req, resp); - String method = req.getRequestURI().substring(1); // remove the leading "/" Metadata headers = getHeaders(req); if (logger.isLoggable(FINEST)) { diff --git a/servlet/src/test/java/io/grpc/servlet/ServletServerBuilderTest.java b/servlet/src/test/java/io/grpc/servlet/ServletServerBuilderTest.java index d571cfd45d5..40f75b97d72 100644 --- a/servlet/src/test/java/io/grpc/servlet/ServletServerBuilderTest.java +++ b/servlet/src/test/java/io/grpc/servlet/ServletServerBuilderTest.java @@ -78,7 +78,7 @@ public void scheduledExecutorService() throws Exception { ServletServerBuilder serverBuilder = new ServletServerBuilder().scheduledExecutorService(scheduler); ServletAdapter servletAdapter = serverBuilder.buildServletAdapter(); - servletAdapter.doPost(request, response); + servletAdapter.doPost("hello/world", request, response); verify(asyncContext).setTimeout(1);