diff --git a/codec-http2/src/main/java/io/netty/handler/codec/http2/Http2StreamFrameToHttpObjectCodec.java b/codec-http2/src/main/java/io/netty/handler/codec/http2/Http2StreamFrameToHttpObjectCodec.java index ed38d84d8c..36a7fba1c0 100644 --- a/codec-http2/src/main/java/io/netty/handler/codec/http2/Http2StreamFrameToHttpObjectCodec.java +++ b/codec-http2/src/main/java/io/netty/handler/codec/http2/Http2StreamFrameToHttpObjectCodec.java @@ -81,9 +81,10 @@ public class Http2StreamFrameToHttpObjectCodec extends MessageToMessageCodec out) throws Exception { if (frame instanceof Http2HeadersFrame) { - int id = 0; // not really the id Http2HeadersFrame headersFrame = (Http2HeadersFrame) frame; Http2Headers headers = headersFrame.headers(); + Http2FrameStream stream = headersFrame.stream(); + int id = stream == null ? 0 : stream.id(); final CharSequence status = headers.status(); diff --git a/codec-http2/src/test/java/io/netty/handler/codec/http2/Http2StreamFrameToHttpObjectCodecTest.java b/codec-http2/src/test/java/io/netty/handler/codec/http2/Http2StreamFrameToHttpObjectCodecTest.java index f8fb1f6a88..45e781c86c 100644 --- a/codec-http2/src/test/java/io/netty/handler/codec/http2/Http2StreamFrameToHttpObjectCodecTest.java +++ b/codec-http2/src/test/java/io/netty/handler/codec/http2/Http2StreamFrameToHttpObjectCodecTest.java @@ -745,12 +745,36 @@ public class Http2StreamFrameToHttpObjectCodecTest { @Test public void testDecodeFullResponseHeaders() throws Exception { + testDecodeFullResponseHeaders(false); + } + + @Test + public void testDecodeFullResponseHeadersWithStreamID() throws Exception { + testDecodeFullResponseHeaders(true); + } + + private void testDecodeFullResponseHeaders(boolean withStreamId) throws Exception { EmbeddedChannel ch = new EmbeddedChannel(new Http2StreamFrameToHttpObjectCodec(false)); Http2Headers headers = new DefaultHttp2Headers(); headers.scheme(HttpScheme.HTTP.name()); headers.status(HttpResponseStatus.OK.codeAsText()); - assertTrue(ch.writeInbound(new DefaultHttp2HeadersFrame(headers, true))); + Http2HeadersFrame frame = new DefaultHttp2HeadersFrame(headers, true); + if (withStreamId) { + frame.stream(new Http2FrameStream() { + @Override + public int id() { + return 1; + } + + @Override + public Http2Stream.State state() { + return Http2Stream.State.OPEN; + } + }); + } + + assertTrue(ch.writeInbound(frame)); FullHttpResponse response = ch.readInbound(); try { @@ -759,6 +783,10 @@ public class Http2StreamFrameToHttpObjectCodecTest { assertThat(response.content().readableBytes(), is(0)); assertTrue(response.trailingHeaders().isEmpty()); assertFalse(HttpUtil.isTransferEncodingChunked(response)); + if (withStreamId) { + assertEquals(1, + (int) response.headers().getInt(HttpConversionUtil.ExtensionHeaderNames.STREAM_ID.text())); + } } finally { response.release(); }