mirror of https://github.com/grpc/grpc-java.git
core: Add missing setListener if decompressor is unknown
Previously AbstractServerStream would throw an exception which would kill the RPC with a RST_STREAM. Now the server actually responds with a clean error message and avoids spamming the logs. WARNING: Exception in onHeadersRead() java.lang.IllegalStateException at com.google.common.base.Preconditions.checkState(Preconditions.java:495) at io.grpc.internal.AbstractStream$TransportState.onStreamAllocated(AbstractStream.java:232) at io.grpc.internal.AbstractServerStream$TransportState.onStreamAllocated(AbstractServerStream.java:224) at io.grpc.netty.NettyServerHandler.onHeadersRead(NettyServerHandler.java:451) at io.grpc.netty.NettyServerHandler.access$900(NettyServerHandler.java:101) at io.grpc.netty.NettyServerHandler$FrameListener.onHeadersRead(NettyServerHandler.java:807) at io.netty.handler.codec.http2.DefaultHttp2ConnectionDecoder$FrameReadListener.onHeadersRead(DefaultHttp2ConnectionDecoder.java:373)
This commit is contained in:
parent
9dec06cc91
commit
c7f69c851b
|
@ -486,6 +486,7 @@ public final class ServerImpl extends io.grpc.Server implements InternalInstrume
|
||||||
String encoding = headers.get(MESSAGE_ENCODING_KEY);
|
String encoding = headers.get(MESSAGE_ENCODING_KEY);
|
||||||
Decompressor decompressor = decompressorRegistry.lookupDecompressor(encoding);
|
Decompressor decompressor = decompressorRegistry.lookupDecompressor(encoding);
|
||||||
if (decompressor == null) {
|
if (decompressor == null) {
|
||||||
|
stream.setListener(NOOP_LISTENER);
|
||||||
stream.close(
|
stream.close(
|
||||||
Status.UNIMPLEMENTED.withDescription(
|
Status.UNIMPLEMENTED.withDescription(
|
||||||
String.format("Can't find decompressor for %s", encoding)),
|
String.format("Can't find decompressor for %s", encoding)),
|
||||||
|
|
|
@ -487,6 +487,7 @@ public class ServerImplTest {
|
||||||
|
|
||||||
transportListener.streamCreated(stream, "Waiter/nonexist", requestHeaders);
|
transportListener.streamCreated(stream, "Waiter/nonexist", requestHeaders);
|
||||||
|
|
||||||
|
verify(stream).setListener(isA(ServerStreamListener.class));
|
||||||
verify(stream).streamId();
|
verify(stream).streamId();
|
||||||
verify(stream).close(statusCaptor.capture(), any(Metadata.class));
|
verify(stream).close(statusCaptor.capture(), any(Metadata.class));
|
||||||
Status status = statusCaptor.getValue();
|
Status status = statusCaptor.getValue();
|
||||||
|
|
Loading…
Reference in New Issue