From 7cc320ce47f1d346cc46cf68022c75e9d15b22c8 Mon Sep 17 00:00:00 2001 From: Louis Ryan Date: Thu, 5 Nov 2015 14:07:34 -0800 Subject: [PATCH] Fix memory leak in DefaultHttp2Headers Motivation: Memory leak makes headers non-reusable. Modifications: Correctly reset firstNonPseudo header reference Result: No leak --- .../handler/codec/http2/DefaultHttp2Headers.java | 6 ++++++ .../handler/codec/http2/DefaultHttp2HeadersTest.java | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/codec-http2/src/main/java/io/netty/handler/codec/http2/DefaultHttp2Headers.java b/codec-http2/src/main/java/io/netty/handler/codec/http2/DefaultHttp2Headers.java index 7a4bfe6043..69b1e17e07 100644 --- a/codec-http2/src/main/java/io/netty/handler/codec/http2/DefaultHttp2Headers.java +++ b/codec-http2/src/main/java/io/netty/handler/codec/http2/DefaultHttp2Headers.java @@ -90,6 +90,12 @@ public class DefaultHttp2Headers validate ? HTTP2_NAME_VALIDATOR : NameValidator.NOT_NULL); } + @Override + public Http2Headers clear() { + this.firstNonPseudo = head; + return super.clear(); + } + @Override public Http2Headers method(CharSequence value) { set(PseudoHeaderName.METHOD.value(), value); diff --git a/codec-http2/src/test/java/io/netty/handler/codec/http2/DefaultHttp2HeadersTest.java b/codec-http2/src/test/java/io/netty/handler/codec/http2/DefaultHttp2HeadersTest.java index 5885ea153c..eb187c9d4a 100644 --- a/codec-http2/src/test/java/io/netty/handler/codec/http2/DefaultHttp2HeadersTest.java +++ b/codec-http2/src/test/java/io/netty/handler/codec/http2/DefaultHttp2HeadersTest.java @@ -22,6 +22,7 @@ import org.junit.Test; import java.util.Map.Entry; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -74,6 +75,16 @@ public class DefaultHttp2HeadersTest { headers.add(of("Foo"), of("foo")); } + @Test + public void testClearResetsPseudoHeaderDivision() { + DefaultHttp2Headers http2Headers = new DefaultHttp2Headers(); + http2Headers.method("POST"); + http2Headers.set("some", "value"); + http2Headers.clear(); + http2Headers.method("GET"); + assertEquals(1, http2Headers.names().size()); + } + private static void verifyAllPseudoHeadersPresent(Http2Headers headers) { for (PseudoHeaderName pseudoName : PseudoHeaderName.values()) { assertNotNull(headers.get(pseudoName.value()));