Skip to content

Commit 6f21bc2

Browse files
authored
servlet: configurable methodNameResolver (#12333)
Introduces configuring a method name resolver in `ServletServerBuilder` for customizing the servlet context root path for request paths.
1 parent 6fae71b commit 6f21bc2

File tree

5 files changed

+32
-4
lines changed

5 files changed

+32
-4
lines changed

servlet/src/jettyTest/java/io/grpc/servlet/JettyTransportTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public void start(ServerListener listener) throws IOException {
6969
listener.transportCreated(new ServletServerBuilder.ServerTransportImpl(scheduler));
7070
ServletAdapter adapter =
7171
new ServletAdapter(serverTransportListener, streamTracerFactories,
72+
ServletAdapter.DEFAULT_METHOD_NAME_RESOLVER,
7273
Integer.MAX_VALUE);
7374
GrpcServlet grpcServlet = new GrpcServlet(adapter);
7475

servlet/src/main/java/io/grpc/servlet/ServletAdapter.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import java.util.Enumeration;
4646
import java.util.List;
4747
import java.util.concurrent.TimeUnit;
48+
import java.util.function.Function;
4849
import java.util.logging.Logger;
4950
import javax.servlet.AsyncContext;
5051
import javax.servlet.AsyncEvent;
@@ -72,18 +73,23 @@
7273
public final class ServletAdapter {
7374

7475
static final Logger logger = Logger.getLogger(ServletAdapter.class.getName());
76+
static final Function<HttpServletRequest, String> DEFAULT_METHOD_NAME_RESOLVER =
77+
req -> req.getRequestURI().substring(1); // remove the leading "/"
7578

7679
private final ServerTransportListener transportListener;
7780
private final List<? extends ServerStreamTracer.Factory> streamTracerFactories;
81+
private final Function<HttpServletRequest, String> methodNameResolver;
7882
private final int maxInboundMessageSize;
7983
private final Attributes attributes;
8084

8185
ServletAdapter(
8286
ServerTransportListener transportListener,
8387
List<? extends ServerStreamTracer.Factory> streamTracerFactories,
88+
Function<HttpServletRequest, String> methodNameResolver,
8489
int maxInboundMessageSize) {
8590
this.transportListener = transportListener;
8691
this.streamTracerFactories = streamTracerFactories;
92+
this.methodNameResolver = methodNameResolver;
8793
this.maxInboundMessageSize = maxInboundMessageSize;
8894
attributes = transportListener.transportReady(Attributes.EMPTY);
8995
}
@@ -119,7 +125,7 @@ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOEx
119125

120126
AsyncContext asyncCtx = req.startAsync(req, resp);
121127

122-
String method = req.getRequestURI().substring(1); // remove the leading "/"
128+
String method = methodNameResolver.apply(req);
123129
Metadata headers = getHeaders(req);
124130

125131
if (logger.isLoggable(FINEST)) {

servlet/src/main/java/io/grpc/servlet/ServletServerBuilder.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,10 @@
4949
import java.util.Collections;
5050
import java.util.List;
5151
import java.util.concurrent.ScheduledExecutorService;
52+
import java.util.function.Function;
5253
import javax.annotation.Nullable;
5354
import javax.annotation.concurrent.NotThreadSafe;
55+
import javax.servlet.http.HttpServletRequest;
5456

5557
/**
5658
* Builder to build a gRPC server that can run as a servlet. This is for advanced custom settings.
@@ -64,6 +66,8 @@
6466
@NotThreadSafe
6567
public final class ServletServerBuilder extends ForwardingServerBuilder<ServletServerBuilder> {
6668
List<? extends ServerStreamTracer.Factory> streamTracerFactories;
69+
private Function<HttpServletRequest, String> methodNameResolver =
70+
ServletAdapter.DEFAULT_METHOD_NAME_RESOLVER;
6771
int maxInboundMessageSize = DEFAULT_MAX_MESSAGE_SIZE;
6872

6973
private final ServerImplBuilder serverImplBuilder;
@@ -98,7 +102,8 @@ public Server build() {
98102
* Creates a {@link ServletAdapter}.
99103
*/
100104
public ServletAdapter buildServletAdapter() {
101-
return new ServletAdapter(buildAndStart(), streamTracerFactories, maxInboundMessageSize);
105+
return new ServletAdapter(buildAndStart(), streamTracerFactories, methodNameResolver,
106+
maxInboundMessageSize);
102107
}
103108

104109
/**
@@ -176,6 +181,18 @@ public ServletServerBuilder useTransportSecurity(File certChain, File privateKey
176181
throw new UnsupportedOperationException("TLS should be configured by the servlet container");
177182
}
178183

184+
/**
185+
* Specifies how to determine gRPC method name from servlet request.
186+
*
187+
* <p>The default strategy is using {@link HttpServletRequest#getRequestURI()} without the leading
188+
* slash.</p>
189+
*/
190+
public ServletServerBuilder methodNameResolver(
191+
Function<HttpServletRequest, String> methodResolver) {
192+
this.methodNameResolver = checkNotNull(methodResolver);
193+
return this;
194+
}
195+
179196
@Override
180197
public ServletServerBuilder maxInboundMessageSize(int bytes) {
181198
checkArgument(bytes >= 0, "bytes must be >= 0");

servlet/src/tomcatTest/java/io/grpc/servlet/TomcatTransportTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ public void start(ServerListener listener) throws IOException {
8181
ServerTransportListener serverTransportListener =
8282
listener.transportCreated(new ServerTransportImpl(scheduler));
8383
ServletAdapter adapter =
84-
new ServletAdapter(serverTransportListener, streamTracerFactories, Integer.MAX_VALUE);
84+
new ServletAdapter(serverTransportListener, streamTracerFactories,
85+
ServletAdapter.DEFAULT_METHOD_NAME_RESOLVER,
86+
Integer.MAX_VALUE);
8587
GrpcServlet grpcServlet = new GrpcServlet(adapter);
8688

8789
tomcatServer = new Tomcat();

servlet/src/undertowTest/java/io/grpc/servlet/UndertowTransportTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,9 @@ public void start(ServerListener listener) throws IOException {
100100
ServerTransportListener serverTransportListener =
101101
listener.transportCreated(new ServerTransportImpl(scheduler));
102102
ServletAdapter adapter =
103-
new ServletAdapter(serverTransportListener, streamTracerFactories, Integer.MAX_VALUE);
103+
new ServletAdapter(serverTransportListener, streamTracerFactories,
104+
ServletAdapter.DEFAULT_METHOD_NAME_RESOLVER,
105+
Integer.MAX_VALUE);
104106
GrpcServlet grpcServlet = new GrpcServlet(adapter);
105107
InstanceFactory<? extends Servlet> instanceFactory =
106108
() -> new ImmediateInstanceHandle<>(grpcServlet);

0 commit comments

Comments
 (0)