codec-http2: Better keep track of nameLength in HpackDecoder.decode
Motivation: http/2 counts header sizes somewhat inconsistently. Sometimes, headers which are substantively less than the header list size will be measured as longer than the header list size. Modifications: Keep better track of the nameLength of a given name, so that we don't accidentally end up reusing a nameLength. Result: More consistent measurement of header list size. Fixes #7511.
This commit is contained in:
parent
f9888acfdd
commit
94ab0dc442
@ -162,6 +162,7 @@ final class HpackDecoder {
|
|||||||
default:
|
default:
|
||||||
// Index was stored as the prefix
|
// Index was stored as the prefix
|
||||||
name = readName(index);
|
name = readName(index);
|
||||||
|
nameLength = name.length();
|
||||||
state = READ_LITERAL_HEADER_VALUE_LENGTH_PREFIX;
|
state = READ_LITERAL_HEADER_VALUE_LENGTH_PREFIX;
|
||||||
}
|
}
|
||||||
} else if ((b & 0x20) == 0x20) {
|
} else if ((b & 0x20) == 0x20) {
|
||||||
@ -187,6 +188,7 @@ final class HpackDecoder {
|
|||||||
default:
|
default:
|
||||||
// Index was stored as the prefix
|
// Index was stored as the prefix
|
||||||
name = readName(index);
|
name = readName(index);
|
||||||
|
nameLength = name.length();
|
||||||
state = READ_LITERAL_HEADER_VALUE_LENGTH_PREFIX;
|
state = READ_LITERAL_HEADER_VALUE_LENGTH_PREFIX;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -205,6 +207,7 @@ final class HpackDecoder {
|
|||||||
case READ_INDEXED_HEADER_NAME:
|
case READ_INDEXED_HEADER_NAME:
|
||||||
// Header Name matches an entry in the Header Table
|
// Header Name matches an entry in the Header Table
|
||||||
name = readName(decodeULE128(in, index));
|
name = readName(decodeULE128(in, index));
|
||||||
|
nameLength = name.length();
|
||||||
state = READ_LITERAL_HEADER_VALUE_LENGTH_PREFIX;
|
state = READ_LITERAL_HEADER_VALUE_LENGTH_PREFIX;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -455,4 +455,26 @@ public class HpackDecoderTest {
|
|||||||
in.release();
|
in.release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDecodeCountsNamesOnlyOnce() throws Http2Exception {
|
||||||
|
ByteBuf in = Unpooled.buffer(200);
|
||||||
|
try {
|
||||||
|
hpackDecoder.setMaxHeaderListSize(3500, 4000);
|
||||||
|
HpackEncoder hpackEncoder = new HpackEncoder(true);
|
||||||
|
|
||||||
|
// encode headers that are slightly larger than maxHeaderListSize
|
||||||
|
// but smaller than maxHeaderListSizeGoAway
|
||||||
|
Http2Headers toEncode = new DefaultHttp2Headers();
|
||||||
|
toEncode.add(String.format("%03000d", 0).replace('0', 'f'), "value");
|
||||||
|
toEncode.add("accept", "value");
|
||||||
|
hpackEncoder.encodeHeaders(1, in, toEncode, NEVER_SENSITIVE);
|
||||||
|
|
||||||
|
Http2Headers decoded = new DefaultHttp2Headers();
|
||||||
|
hpackDecoder.decode(1, in, decoded);
|
||||||
|
assertEquals(2, decoded.size());
|
||||||
|
} finally {
|
||||||
|
in.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user