diff --git a/codec-http2/src/main/java/io/netty/handler/codec/http2/Http2FrameCodec.java b/codec-http2/src/main/java/io/netty/handler/codec/http2/Http2FrameCodec.java index d571ba496b..b4dacf0d70 100644 --- a/codec-http2/src/main/java/io/netty/handler/codec/http2/Http2FrameCodec.java +++ b/codec-http2/src/main/java/io/netty/handler/codec/http2/Http2FrameCodec.java @@ -548,6 +548,10 @@ public class Http2FrameCodec extends Http2ConnectionHandler { @Override public void onUnknownFrame( ChannelHandlerContext ctx, byte frameType, int streamId, Http2Flags flags, ByteBuf payload) { + if (streamId == 0) { + // Ignore unknown frames on connection stream, for example: HTTP/2 GREASE testing + return; + } onHttp2Frame(ctx, new DefaultHttp2UnknownFrame(frameType, flags, payload) .stream(requireStream(streamId)).retain()); } diff --git a/codec-http2/src/test/java/io/netty/handler/codec/http2/Http2FrameCodecTest.java b/codec-http2/src/test/java/io/netty/handler/codec/http2/Http2FrameCodecTest.java index 1f382584dd..b40486babc 100644 --- a/codec-http2/src/test/java/io/netty/handler/codec/http2/Http2FrameCodecTest.java +++ b/codec-http2/src/test/java/io/netty/handler/codec/http2/Http2FrameCodecTest.java @@ -375,6 +375,18 @@ public class Http2FrameCodecTest { assertEquals(0, frame.refCnt()); } + @Test + public void unknownFrameTypeOnConnectionStream() throws Exception { + // handle the case where unknown frames are sent before a stream is created, + // for example: HTTP/2 GREASE testing + ByteBuf debugData = bb("debug"); + frameInboundWriter.writeInboundFrame((byte) 0xb, 0, new Http2Flags(), debugData); + channel.flush(); + + assertEquals(0, debugData.refCnt()); + assertTrue(channel.isActive()); + } + @Test public void goAwayLastStreamIdOverflowed() throws Exception { frameInboundWriter.writeInboundHeaders(5, request, 31, false);