From 249509508863545aa40ccfd2a8c7c030be3c340b Mon Sep 17 00:00:00 2001 From: long76 <18124433+long76@users.noreply.github.com> Date: Mon, 9 Dec 2024 17:42:15 +0300 Subject: [PATCH 01/16] feat[ServletAdapter]: Ability remove context path when get method name Refs: #5066 --- .../main/java/io/grpc/servlet/ServletAdapter.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java b/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java index 5a567916f99..160aec9f83b 100644 --- a/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java +++ b/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java @@ -70,6 +70,7 @@ */ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/5066") public final class ServletAdapter { + public static final String REMOVE_CONTEXT_PATH = "REMOVE_CONTEXT_PATH"; static final Logger logger = Logger.getLogger(ServletAdapter.class.getName()); @@ -119,7 +120,7 @@ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOEx AsyncContext asyncCtx = req.startAsync(req, resp); - String method = req.getRequestURI().substring(1); // remove the leading "/" + String method = getMethod(req); Metadata headers = getHeaders(req); if (logger.isLoggable(FINEST)) { @@ -158,6 +159,15 @@ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOEx asyncCtx.addListener(new GrpcAsyncListener(stream, logId)); } + private static String getMethod(HttpServletRequest req) { + Boolean removeContextPath = Boolean.parseBoolean(getInitParameter(REMOVE_CONTEXT_PATH)); + String method = req.getRequestURI(); + if (removeContextPath) { + method = method.substring(req.getContextPath().length()); // remove Context Path from application server + } + return method.substring(1); // remove the leading "/" + } + // This method must use Enumeration and its members, since that is the only way to read headers // from the servlet api. @SuppressWarnings("JdkObsolete") From 4bb9d650ce8908d43ce0b2aedd0cd9ac6ac1ea3c Mon Sep 17 00:00:00 2001 From: long76 <18124433+long76@users.noreply.github.com> Date: Mon, 9 Dec 2024 17:58:33 +0300 Subject: [PATCH 02/16] fix: getMethod must be not static --- servlet/src/main/java/io/grpc/servlet/ServletAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java b/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java index 160aec9f83b..0b9a8f8965b 100644 --- a/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java +++ b/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java @@ -159,7 +159,7 @@ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOEx asyncCtx.addListener(new GrpcAsyncListener(stream, logId)); } - private static String getMethod(HttpServletRequest req) { + private String getMethod(HttpServletRequest req) { Boolean removeContextPath = Boolean.parseBoolean(getInitParameter(REMOVE_CONTEXT_PATH)); String method = req.getRequestURI(); if (removeContextPath) { From 2f4aea57107e1b26eae1d78d371dfe1c84f835f9 Mon Sep 17 00:00:00 2001 From: long76 <18124433+long76@users.noreply.github.com> Date: Mon, 9 Dec 2024 18:11:52 +0300 Subject: [PATCH 03/16] fix: wrong realisation --- .../src/main/java/io/grpc/servlet/GrpcServlet.java | 12 +++++++++++- .../main/java/io/grpc/servlet/ServletAdapter.java | 13 +------------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java b/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java index f68ed083506..65b9471420b 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,15 @@ private static ServletAdapter loadServices(List binda return serverBuilder.buildServletAdapter(); } + private String getMethod(HttpServletRequest req) { + Boolean removeContextPath = Boolean.parseBoolean(getInitParameter(REMOVE_CONTEXT_PATH)); + String method = req.getRequestURI(); + if (removeContextPath) { + method = method.substring(req.getContextPath().length()); // remove Context Path from application server + } + return method.substring(1); // remove the leading "/" + } + @Override protected final void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { @@ -67,7 +77,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 0b9a8f8965b..0c3f2315d53 100644 --- a/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java +++ b/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java @@ -70,7 +70,6 @@ */ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/5066") public final class ServletAdapter { - public static final String REMOVE_CONTEXT_PATH = "REMOVE_CONTEXT_PATH"; static final Logger logger = Logger.getLogger(ServletAdapter.class.getName()); @@ -111,7 +110,7 @@ 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"); @@ -120,7 +119,6 @@ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOEx AsyncContext asyncCtx = req.startAsync(req, resp); - String method = getMethod(req); Metadata headers = getHeaders(req); if (logger.isLoggable(FINEST)) { @@ -159,15 +157,6 @@ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOEx asyncCtx.addListener(new GrpcAsyncListener(stream, logId)); } - private String getMethod(HttpServletRequest req) { - Boolean removeContextPath = Boolean.parseBoolean(getInitParameter(REMOVE_CONTEXT_PATH)); - String method = req.getRequestURI(); - if (removeContextPath) { - method = method.substring(req.getContextPath().length()); // remove Context Path from application server - } - return method.substring(1); // remove the leading "/" - } - // This method must use Enumeration and its members, since that is the only way to read headers // from the servlet api. @SuppressWarnings("JdkObsolete") From 33ed4c66c5000b7a3b2d6d8f3d96ec69dcec8152 Mon Sep 17 00:00:00 2001 From: long76 <18124433+long76@users.noreply.github.com> Date: Mon, 9 Dec 2024 18:24:48 +0300 Subject: [PATCH 04/16] fix[ServletAdapter]: java doc --- .../src/main/java/io/grpc/servlet/ServletAdapter.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java b/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java index 0c3f2315d53..f20b34bef4d 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 From 9ffaeb71439ccfd61da943f688f7f3e498bffc3d Mon Sep 17 00:00:00 2001 From: long76 <18124433+long76@users.noreply.github.com> Date: Mon, 9 Dec 2024 19:01:46 +0300 Subject: [PATCH 05/16] fix: code style --- servlet/src/main/java/io/grpc/servlet/GrpcServlet.java | 3 ++- servlet/src/main/java/io/grpc/servlet/ServletAdapter.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java b/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java index 65b9471420b..5e9cec4a008 100644 --- a/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java +++ b/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java @@ -63,7 +63,8 @@ private String getMethod(HttpServletRequest req) { Boolean removeContextPath = Boolean.parseBoolean(getInitParameter(REMOVE_CONTEXT_PATH)); String method = req.getRequestURI(); if (removeContextPath) { - method = method.substring(req.getContextPath().length()); // remove Context Path from application server + // remove context path used in application server + method = method.substring(req.getContextPath().length()); } return method.substring(1); // remove the leading "/" } diff --git a/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java b/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java index f20b34bef4d..b6e0eabd502 100644 --- a/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java +++ b/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java @@ -111,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(String method, 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"); From bb7a6d42a94d6756f4a34b84083a1e1b7d9e519b Mon Sep 17 00:00:00 2001 From: long76 <18124433+long76@users.noreply.github.com> Date: Mon, 9 Dec 2024 19:17:30 +0300 Subject: [PATCH 06/16] fix[ServletServerBuilderTest]: compile test --- .../src/test/java/io/grpc/servlet/ServletServerBuilderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servlet/src/test/java/io/grpc/servlet/ServletServerBuilderTest.java b/servlet/src/test/java/io/grpc/servlet/ServletServerBuilderTest.java index d571cfd45d5..c51b7f2e588 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(req.getRequestURI().substring(1), request, response); verify(asyncContext).setTimeout(1); From 2c1c2f1782ab394b726e3092b35579ef48e3f301 Mon Sep 17 00:00:00 2001 From: long76 <18124433+long76@users.noreply.github.com> Date: Mon, 9 Dec 2024 19:31:26 +0300 Subject: [PATCH 07/16] fix[bb7a6d4]: var name --- .../src/test/java/io/grpc/servlet/ServletServerBuilderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servlet/src/test/java/io/grpc/servlet/ServletServerBuilderTest.java b/servlet/src/test/java/io/grpc/servlet/ServletServerBuilderTest.java index c51b7f2e588..99410143bd0 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(req.getRequestURI().substring(1), request, response); + servletAdapter.doPost(request.getRequestURI().substring(1), request, response); verify(asyncContext).setTimeout(1); From 27a99bc778b79b9e7bb2e3f9caf521c617f77fef Mon Sep 17 00:00:00 2001 From: long76 <18124433+long76@users.noreply.github.com> Date: Mon, 9 Dec 2024 19:51:21 +0300 Subject: [PATCH 08/16] fix[HelloWorldServlet]: example --- .../io/grpc/servlet/examples/helloworld/HelloWorldServlet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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!

"); From 21e48bebb720fff38912be65f11da563c4411c51 Mon Sep 17 00:00:00 2001 From: long76 <18124433+long76@users.noreply.github.com> Date: Mon, 9 Dec 2024 20:11:20 +0300 Subject: [PATCH 09/16] fix[ServletServerBuilderTest]: use verify --- .../src/test/java/io/grpc/servlet/ServletServerBuilderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servlet/src/test/java/io/grpc/servlet/ServletServerBuilderTest.java b/servlet/src/test/java/io/grpc/servlet/ServletServerBuilderTest.java index 99410143bd0..8f030e0bfdc 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.getRequestURI().substring(1), request, response); + servletAdapter.doPost(verify(request).getRequestURI().substring(1), request, response); verify(asyncContext).setTimeout(1); From ed0fdbde97a92d85ebbd8ab042550b247b7d264c Mon Sep 17 00:00:00 2001 From: long76 <18124433+long76@users.noreply.github.com> Date: Mon, 9 Dec 2024 20:28:25 +0300 Subject: [PATCH 10/16] fix: use hardcoded method --- .../src/test/java/io/grpc/servlet/ServletServerBuilderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servlet/src/test/java/io/grpc/servlet/ServletServerBuilderTest.java b/servlet/src/test/java/io/grpc/servlet/ServletServerBuilderTest.java index 8f030e0bfdc..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(verify(request).getRequestURI().substring(1), request, response); + servletAdapter.doPost("hello/world", request, response); verify(asyncContext).setTimeout(1); From e20b3dfa4ae6fae00c055a08daa6b9c0e4e30510 Mon Sep 17 00:00:00 2001 From: long76 <18124433+long76@users.noreply.github.com> Date: Tue, 14 Jan 2025 21:40:40 +0300 Subject: [PATCH 11/16] refactor: tests and realization --- .../grpc/servlet/examples/helloworld/HelloWorldServlet.java | 2 +- servlet/src/main/java/io/grpc/servlet/GrpcServlet.java | 3 ++- servlet/src/main/java/io/grpc/servlet/ServletAdapter.java | 4 ++++ .../test/java/io/grpc/servlet/ServletServerBuilderTest.java | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) 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 2f0a5f149b1..a970c26a119 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("helloworld.Greeter/SayHello", request, response); + servletAdapter.doPost(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 5e9cec4a008..a22081c03c5 100644 --- a/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java +++ b/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java @@ -39,9 +39,11 @@ public class GrpcServlet extends HttpServlet { public static final String REMOVE_CONTEXT_PATH = "REMOVE_CONTEXT_PATH"; private final ServletAdapter servletAdapter; + private final boolean removeContextPath; GrpcServlet(ServletAdapter servletAdapter) { this.servletAdapter = servletAdapter; + removeContextPath = Boolean.parseBoolean(getInitParameter(REMOVE_CONTEXT_PATH)); } /** @@ -60,7 +62,6 @@ private static ServletAdapter loadServices(List binda } 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 diff --git a/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java b/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java index b6e0eabd502..81b431dc9a9 100644 --- a/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java +++ b/servlet/src/main/java/io/grpc/servlet/ServletAdapter.java @@ -104,6 +104,10 @@ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOExc resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "GET method not supported"); } + public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + doPost(req.getRequestURI().substring(1), req, resp); + } + /** * Call this method inside {@link javax.servlet.http.HttpServlet#doPost(HttpServletRequest, * HttpServletResponse)} to serve gRPC POST request. diff --git a/servlet/src/test/java/io/grpc/servlet/ServletServerBuilderTest.java b/servlet/src/test/java/io/grpc/servlet/ServletServerBuilderTest.java index 40f75b97d72..d571cfd45d5 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("hello/world", request, response); + servletAdapter.doPost(request, response); verify(asyncContext).setTimeout(1); From ecb51d446e8ccb7de09e6335cb05cc8e3cffa5c0 Mon Sep 17 00:00:00 2001 From: long76 <18124433+long76@users.noreply.github.com> Date: Wed, 29 Jan 2025 14:15:23 +0300 Subject: [PATCH 12/16] fix(GrpcServlet): check getServletConfig on null before getInitParameter --- servlet/src/main/java/io/grpc/servlet/GrpcServlet.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java b/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java index a22081c03c5..81e6c00791a 100644 --- a/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java +++ b/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java @@ -43,7 +43,11 @@ public class GrpcServlet extends HttpServlet { GrpcServlet(ServletAdapter servletAdapter) { this.servletAdapter = servletAdapter; - removeContextPath = Boolean.parseBoolean(getInitParameter(REMOVE_CONTEXT_PATH)); + if (getServletConfig() != null) { + removeContextPath = Boolean.parseBoolean(getInitParameter(REMOVE_CONTEXT_PATH)); + } else { + removeContextPath = false; + } } /** From 8956729b851d7dafd3b319b9252e32db193485a8 Mon Sep 17 00:00:00 2001 From: long76 <18124433+long76@users.noreply.github.com> Date: Wed, 29 Jan 2025 17:28:33 +0300 Subject: [PATCH 13/16] fix(GrpcServlet): getInitParameter in init --- .../main/java/io/grpc/servlet/GrpcServlet.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java b/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java index 81e6c00791a..861129c6a41 100644 --- a/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java +++ b/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java @@ -39,15 +39,17 @@ public class GrpcServlet extends HttpServlet { public static final String REMOVE_CONTEXT_PATH = "REMOVE_CONTEXT_PATH"; private final ServletAdapter servletAdapter; - private final boolean removeContextPath; + private boolean removeContextPath; GrpcServlet(ServletAdapter servletAdapter) { this.servletAdapter = servletAdapter; - if (getServletConfig() != null) { - removeContextPath = Boolean.parseBoolean(getInitParameter(REMOVE_CONTEXT_PATH)); - } else { - removeContextPath = false; - } + removeContextPath = false; // default value + } + + @Override + public void init() throws ServletException { + super.init(); + removeContextPath = Boolean.parseBoolean(getInitParameter(REMOVE_CONTEXT_PATH)); } /** @@ -65,7 +67,7 @@ private static ServletAdapter loadServices(List binda return serverBuilder.buildServletAdapter(); } - private String getMethod(HttpServletRequest req) { + protected String getMethod(HttpServletRequest req) { String method = req.getRequestURI(); if (removeContextPath) { // remove context path used in application server From 68fe5acedd223e4643dfe11833285405b11f5a55 Mon Sep 17 00:00:00 2001 From: long76 <18124433+long76@users.noreply.github.com> Date: Wed, 29 Jan 2025 17:29:42 +0300 Subject: [PATCH 14/16] tests: add GrpcServletTest for getMethod --- .../java/io/grpc/servlet/GrpcServletTest.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 servlet/src/test/java/io/grpc/servlet/GrpcServletTest.java diff --git a/servlet/src/test/java/io/grpc/servlet/GrpcServletTest.java b/servlet/src/test/java/io/grpc/servlet/GrpcServletTest.java new file mode 100644 index 00000000000..1fb221d76e6 --- /dev/null +++ b/servlet/src/test/java/io/grpc/servlet/GrpcServletTest.java @@ -0,0 +1,68 @@ +/* + * Copyright 2025 The gRPC Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.grpc.servlet; + +import static io.grpc.servlet.GrpcServlet.REMOVE_CONTEXT_PATH; +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.doCallRealMethod; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class GrpcServletTest { + private static final String EXPECTED_METHOD = "hello/world"; + private static final String CONTEXT_PATH = "/grpc"; + private static final String REQUEST_URI = "/hello/world"; + + @Test + public void defaultMethodTest() throws ServletException { + HttpServletRequest request = mock(HttpServletRequest.class); + GrpcServlet grpcServlet = mock(GrpcServlet.class); + + doCallRealMethod().when(grpcServlet).init(); + grpcServlet.init(); + + doReturn(REQUEST_URI).when(request).getRequestURI(); + when(grpcServlet.getMethod(request)).thenCallRealMethod(); + + assertEquals(EXPECTED_METHOD, grpcServlet.getMethod(request)); + } + + @Test + public void removeContextPathMethodTest() throws ServletException { + HttpServletRequest request = mock(HttpServletRequest.class); + GrpcServlet grpcServlet = mock(GrpcServlet.class); + + doReturn("true").when(grpcServlet).getInitParameter(REMOVE_CONTEXT_PATH); + doCallRealMethod().when(grpcServlet).init(); + grpcServlet.init(); + + doReturn(CONTEXT_PATH + REQUEST_URI).when(request).getRequestURI(); + doReturn(CONTEXT_PATH).when(request).getContextPath(); + when(grpcServlet.getMethod(request)).thenCallRealMethod(); + + assertEquals(EXPECTED_METHOD, grpcServlet.getMethod(request)); + } +} From a216eb97af38eb1bad492210777e4e58701d8acc Mon Sep 17 00:00:00 2001 From: long76 <18124433+long76@users.noreply.github.com> Date: Wed, 29 Jan 2025 17:32:58 +0300 Subject: [PATCH 15/16] fix(GrpcServlet): import ServletException --- servlet/src/main/java/io/grpc/servlet/GrpcServlet.java | 1 + 1 file changed, 1 insertion(+) diff --git a/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java b/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java index 861129c6a41..171b242e7d8 100644 --- a/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java +++ b/servlet/src/main/java/io/grpc/servlet/GrpcServlet.java @@ -20,6 +20,7 @@ import io.grpc.ExperimentalApi; import java.io.IOException; import java.util.List; +import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; From 76b49cfd1c6ec0018408696d6175ede7a5d15a5b Mon Sep 17 00:00:00 2001 From: long76 <18124433+long76@users.noreply.github.com> Date: Wed, 29 Jan 2025 17:38:13 +0300 Subject: [PATCH 16/16] style(GrpcServletTest): remove empty line --- servlet/src/test/java/io/grpc/servlet/GrpcServletTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/servlet/src/test/java/io/grpc/servlet/GrpcServletTest.java b/servlet/src/test/java/io/grpc/servlet/GrpcServletTest.java index 1fb221d76e6..d471f92a266 100644 --- a/servlet/src/test/java/io/grpc/servlet/GrpcServletTest.java +++ b/servlet/src/test/java/io/grpc/servlet/GrpcServletTest.java @@ -25,7 +25,6 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; - import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4;