diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeaderBlockParser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeaderBlockParser.java index e66888fb92b..855e0899086 100644 --- a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeaderBlockParser.java +++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeaderBlockParser.java @@ -75,7 +75,12 @@ public class HeaderBlockParser MetaData result = hpackDecoder.decode(toDecode); buffer.limit(limit); - byteBufferPool.release(blockBuffer); + + if (blockBuffer != null) + { + byteBufferPool.release(blockBuffer); + blockBuffer = null; + } return result; } diff --git a/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/HeadersGenerateParseTest.java b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/HeadersGenerateParseTest.java index a7796f0a32f..25bb969f4de 100644 --- a/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/HeadersGenerateParseTest.java +++ b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/HeadersGenerateParseTest.java @@ -114,41 +114,47 @@ public class HeadersGenerateParseTest } }, 4096, 8192); - int streamId = 13; - HttpFields fields = new HttpFields(); - fields.put("Accept", "text/html"); - fields.put("User-Agent", "Jetty"); - MetaData.Request metaData = new MetaData.Request("GET", HttpScheme.HTTP, new HostPortHttpField("localhost:8080"), "/path", HttpVersion.HTTP_2, fields); - - ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool); - PriorityFrame priorityFrame = new PriorityFrame(streamId, 3 * streamId, 200, true); - generator.generateHeaders(lease, streamId, metaData, priorityFrame, true); - - for (ByteBuffer buffer : lease.getByteBuffers()) + // Iterate a few times to be sure generator and parser are properly reset. + for (int i = 0; i < 2; ++i) { - while (buffer.hasRemaining()) + int streamId = 13; + HttpFields fields = new HttpFields(); + fields.put("Accept", "text/html"); + fields.put("User-Agent", "Jetty"); + MetaData.Request metaData = new MetaData.Request("GET", HttpScheme.HTTP, new HostPortHttpField("localhost:8080"), "/path", HttpVersion.HTTP_2, fields); + + ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool); + PriorityFrame priorityFrame = new PriorityFrame(streamId, 3 * streamId, 200, true); + generator.generateHeaders(lease, streamId, metaData, priorityFrame, true); + + frames.clear(); + for (ByteBuffer buffer : lease.getByteBuffers()) { - parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()})); + buffer = buffer.slice(); + while (buffer.hasRemaining()) + { + parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()})); + } } - } - Assert.assertEquals(1, frames.size()); - HeadersFrame frame = frames.get(0); - Assert.assertEquals(streamId, frame.getStreamId()); - Assert.assertTrue(frame.isEndStream()); - MetaData.Request request = (MetaData.Request)frame.getMetaData(); - Assert.assertEquals(metaData.getMethod(), request.getMethod()); - Assert.assertEquals(metaData.getURI(), request.getURI()); - for (int j = 0; j < fields.size(); ++j) - { - HttpField field = fields.getField(j); - Assert.assertTrue(request.getFields().contains(field)); + Assert.assertEquals(1, frames.size()); + HeadersFrame frame = frames.get(0); + Assert.assertEquals(streamId, frame.getStreamId()); + Assert.assertTrue(frame.isEndStream()); + MetaData.Request request = (MetaData.Request)frame.getMetaData(); + Assert.assertEquals(metaData.getMethod(), request.getMethod()); + Assert.assertEquals(metaData.getURI(), request.getURI()); + for (int j = 0; j < fields.size(); ++j) + { + HttpField field = fields.getField(j); + Assert.assertTrue(request.getFields().contains(field)); + } + PriorityFrame priority = frame.getPriority(); + Assert.assertNotNull(priority); + Assert.assertEquals(priorityFrame.getStreamId(), priority.getStreamId()); + Assert.assertEquals(priorityFrame.getParentStreamId(), priority.getParentStreamId()); + Assert.assertEquals(priorityFrame.getWeight(), priority.getWeight()); + Assert.assertEquals(priorityFrame.isExclusive(), priority.isExclusive()); } - PriorityFrame priority = frame.getPriority(); - Assert.assertNotNull(priority); - Assert.assertEquals(priorityFrame.getStreamId(), priority.getStreamId()); - Assert.assertEquals(priorityFrame.getParentStreamId(), priority.getParentStreamId()); - Assert.assertEquals(priorityFrame.getWeight(), priority.getWeight()); - Assert.assertEquals(priorityFrame.isExclusive(), priority.isExclusive()); } }