Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ public void start(ServerListener listener) throws IOException {
listener.transportCreated(new ServletServerBuilder.ServerTransportImpl(scheduler));
ServletAdapter adapter =
new ServletAdapter(serverTransportListener, streamTracerFactories,
ServletAdapter.DEFAULT_METHOD_NAME_RESOLVER,
Integer.MAX_VALUE);
GrpcServlet grpcServlet = new GrpcServlet(adapter);

Expand Down
8 changes: 7 additions & 1 deletion servlet/src/main/java/io/grpc/servlet/ServletAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import java.util.Enumeration;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.logging.Logger;
import javax.servlet.AsyncContext;
import javax.servlet.AsyncEvent;
Expand Down Expand Up @@ -72,18 +73,23 @@
public final class ServletAdapter {

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

private final ServerTransportListener transportListener;
private final List<? extends ServerStreamTracer.Factory> streamTracerFactories;
private final Function<HttpServletRequest, String> methodNameResolver;
private final int maxInboundMessageSize;
private final Attributes attributes;

ServletAdapter(
ServerTransportListener transportListener,
List<? extends ServerStreamTracer.Factory> streamTracerFactories,
Function<HttpServletRequest, String> methodNameResolver,
int maxInboundMessageSize) {
this.transportListener = transportListener;
this.streamTracerFactories = streamTracerFactories;
this.methodNameResolver = methodNameResolver;
this.maxInboundMessageSize = maxInboundMessageSize;
attributes = transportListener.transportReady(Attributes.EMPTY);
}
Expand Down Expand Up @@ -119,7 +125,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 = methodNameResolver.apply(req);
Metadata headers = getHeaders(req);

if (logger.isLoggable(FINEST)) {
Expand Down
19 changes: 18 additions & 1 deletion servlet/src/main/java/io/grpc/servlet/ServletServerBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,10 @@
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.function.Function;
import javax.annotation.Nullable;
import javax.annotation.concurrent.NotThreadSafe;
import javax.servlet.http.HttpServletRequest;

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

private final ServerImplBuilder serverImplBuilder;
Expand Down Expand Up @@ -98,7 +102,8 @@ public Server build() {
* Creates a {@link ServletAdapter}.
*/
public ServletAdapter buildServletAdapter() {
return new ServletAdapter(buildAndStart(), streamTracerFactories, maxInboundMessageSize);
return new ServletAdapter(buildAndStart(), streamTracerFactories, methodNameResolver,
maxInboundMessageSize);
}

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

/**
* Specifies how to determine gRPC method name from servlet request.
*
* <p>The default strategy is using {@link HttpServletRequest#getRequestURI()} without the leading
* slash.</p>
*/
public ServletServerBuilder methodNameResolver(
Function<HttpServletRequest, String> methodResolver) {
this.methodNameResolver = checkNotNull(methodResolver);
return this;
}

@Override
public ServletServerBuilder maxInboundMessageSize(int bytes) {
checkArgument(bytes >= 0, "bytes must be >= 0");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,9 @@ public void start(ServerListener listener) throws IOException {
ServerTransportListener serverTransportListener =
listener.transportCreated(new ServerTransportImpl(scheduler));
ServletAdapter adapter =
new ServletAdapter(serverTransportListener, streamTracerFactories, Integer.MAX_VALUE);
new ServletAdapter(serverTransportListener, streamTracerFactories,
ServletAdapter.DEFAULT_METHOD_NAME_RESOLVER,
Integer.MAX_VALUE);
GrpcServlet grpcServlet = new GrpcServlet(adapter);

tomcatServer = new Tomcat();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,9 @@ public void start(ServerListener listener) throws IOException {
ServerTransportListener serverTransportListener =
listener.transportCreated(new ServerTransportImpl(scheduler));
ServletAdapter adapter =
new ServletAdapter(serverTransportListener, streamTracerFactories, Integer.MAX_VALUE);
new ServletAdapter(serverTransportListener, streamTracerFactories,
ServletAdapter.DEFAULT_METHOD_NAME_RESOLVER,
Integer.MAX_VALUE);
GrpcServlet grpcServlet = new GrpcServlet(adapter);
InstanceFactory<? extends Servlet> instanceFactory =
() -> new ImmediateInstanceHandle<>(grpcServlet);
Expand Down