diff --git a/netty/src/main/java/io/grpc/netty/NettyClientHandler.java b/netty/src/main/java/io/grpc/netty/NettyClientHandler.java index be4552a326..274014564f 100644 --- a/netty/src/main/java/io/grpc/netty/NettyClientHandler.java +++ b/netty/src/main/java/io/grpc/netty/NettyClientHandler.java @@ -202,9 +202,11 @@ class NettyClientHandler extends AbstractNettyHandler { * Handler for an inbound HTTP/2 RST_STREAM frame, terminating a stream. */ private void onRstStreamRead(int streamId, long errorCode) throws Http2Exception { - NettyClientStream stream = clientStream(requireHttp2Stream(streamId)); - Status status = GrpcUtil.Http2Error.statusForCode((int) errorCode); - stream.transportReportStatus(status, false /*stop delivery*/, new Metadata()); + NettyClientStream stream = clientStream(connection().stream(streamId)); + if (stream != null) { + Status status = GrpcUtil.Http2Error.statusForCode((int) errorCode); + stream.transportReportStatus(status, false /*stop delivery*/, new Metadata()); + } } @Override @@ -226,7 +228,10 @@ class NettyClientHandler extends AbstractNettyHandler { connection().forEachActiveStream(new Http2StreamVisitor() { @Override public boolean visit(Http2Stream stream) throws Http2Exception { - clientStream(stream).transportReportStatus(goAwayStatus, false, new Metadata()); + NettyClientStream clientStream = clientStream(stream); + if (clientStream != null) { + clientStream.transportReportStatus(goAwayStatus, false, new Metadata()); + } return true; } }); @@ -248,9 +253,9 @@ class NettyClientHandler extends AbstractNettyHandler { protected void onStreamError(ChannelHandlerContext ctx, Throwable cause, Http2Exception.StreamException http2Ex) { // Close the stream with a status that contains the cause. - Http2Stream stream = connection().stream(http2Ex.streamId()); + NettyClientStream stream = clientStream(connection().stream(http2Ex.streamId())); if (stream != null) { - clientStream(stream).transportReportStatus(statusFromError(cause), false, new Metadata()); + stream.transportReportStatus(statusFromError(cause), false, new Metadata()); } // Delegate to the base class to send a RST_STREAM. @@ -398,8 +403,10 @@ class NettyClientHandler extends AbstractNettyHandler { @Override public boolean visit(Http2Stream stream) throws Http2Exception { if (stream.id() > lastKnownStream) { - clientStream(stream) - .transportReportStatus(goAwayStatus, false, new Metadata()); + NettyClientStream clientStream = clientStream(stream); + if (clientStream != null) { + clientStream.transportReportStatus(goAwayStatus, false, new Metadata()); + } stream.close(); } return true; @@ -445,7 +452,7 @@ class NettyClientHandler extends AbstractNettyHandler { * Gets the client stream associated to the given HTTP/2 stream object. */ private NettyClientStream clientStream(Http2Stream stream) { - return stream.getProperty(streamKey); + return stream == null ? null : (NettyClientStream) stream.getProperty(streamKey); } private int getAndIncrementNextStreamId() throws StatusException { diff --git a/netty/src/main/java/io/grpc/netty/NettyServerHandler.java b/netty/src/main/java/io/grpc/netty/NettyServerHandler.java index bdbab84efd..1fbd7061f0 100644 --- a/netty/src/main/java/io/grpc/netty/NettyServerHandler.java +++ b/netty/src/main/java/io/grpc/netty/NettyServerHandler.java @@ -199,8 +199,10 @@ class NettyServerHandler extends AbstractNettyHandler { private void onRstStreamRead(int streamId) throws Http2Exception { try { - NettyServerStream stream = serverStream(requireHttp2Stream(streamId)); - stream.abortStream(Status.CANCELLED, false); + NettyServerStream stream = serverStream(connection().stream(streamId)); + if (stream != null) { + stream.abortStream(Status.CANCELLED, false); + } } catch (Throwable e) { logger.log(Level.WARNING, "Exception in onRstStreamRead()", e); // Throw an exception that will get handled by onStreamError. @@ -220,8 +222,8 @@ class NettyServerHandler extends AbstractNettyHandler { protected void onStreamError(ChannelHandlerContext ctx, Throwable cause, StreamException http2Ex) { logger.log(Level.WARNING, "Stream Error", cause); - Http2Stream stream = connection().stream(Http2Exception.streamId(http2Ex)); - NettyServerStream serverStream = stream != null ? serverStream(stream) : null; + NettyServerStream serverStream = serverStream( + connection().stream(Http2Exception.streamId(http2Ex))); if (serverStream != null) { // Abort the stream with a status to help the client with debugging. serverStream.abortStream(cause instanceof Http2Exception @@ -242,7 +244,10 @@ class NettyServerHandler extends AbstractNettyHandler { connection().forEachActiveStream(new Http2StreamVisitor() { @Override public boolean visit(Http2Stream stream) throws Http2Exception { - serverStream(stream).abortStream(GOAWAY_STATUS, false); + NettyServerStream serverStream = serverStream(stream); + if (serverStream != null) { + serverStream.abortStream(GOAWAY_STATUS, false); + } return true; } }); @@ -376,7 +381,7 @@ class NettyServerHandler extends AbstractNettyHandler { * Returns the server stream associated to the given HTTP/2 stream object. */ private NettyServerStream serverStream(Http2Stream stream) { - return stream.getProperty(streamKey); + return stream == null ? null : (NettyServerStream) stream.getProperty(streamKey); } private Http2Exception newStreamException(int streamId, Throwable cause) {