Skip to content

Commit 8b243db

Browse files
Louis Ryannmittler
Louis Ryan
authored and
nmittler
committed
Fix memory leak in DefaultHttp2Headers
Motivation: Memory leak makes headers non-reusable. Modifications: Correctly reset firstNonPseudo header reference Result: No leak
1 parent c1c19b9 commit 8b243db

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

codec-http2/src/main/java/io/netty/handler/codec/http2/DefaultHttp2Headers.java

+6
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@ public DefaultHttp2Headers(boolean validate) {
9090
validate ? HTTP2_NAME_VALIDATOR : NameValidator.NOT_NULL);
9191
}
9292

93+
@Override
94+
public Http2Headers clear() {
95+
this.firstNonPseudo = head;
96+
return super.clear();
97+
}
98+
9399
@Override
94100
public Http2Headers method(CharSequence value) {
95101
set(PseudoHeaderName.METHOD.value(), value);

codec-http2/src/test/java/io/netty/handler/codec/http2/DefaultHttp2HeadersTest.java

+11
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import java.util.Map.Entry;
2424

25+
import static org.junit.Assert.assertEquals;
2526
import static org.junit.Assert.assertFalse;
2627
import static org.junit.Assert.assertNotNull;
2728
import static org.junit.Assert.assertTrue;
@@ -74,6 +75,16 @@ public void testHeaderNameValidation() {
7475
headers.add(of("Foo"), of("foo"));
7576
}
7677

78+
@Test
79+
public void testClearResetsPseudoHeaderDivision() {
80+
DefaultHttp2Headers http2Headers = new DefaultHttp2Headers();
81+
http2Headers.method("POST");
82+
http2Headers.set("some", "value");
83+
http2Headers.clear();
84+
http2Headers.method("GET");
85+
assertEquals(1, http2Headers.names().size());
86+
}
87+
7788
private static void verifyAllPseudoHeadersPresent(Http2Headers headers) {
7889
for (PseudoHeaderName pseudoName : PseudoHeaderName.values()) {
7990
assertNotNull(headers.get(pseudoName.value()));

0 commit comments

Comments
 (0)