@@ -995,3 +995,32 @@ class TestExtensionFrame:
995995 def test_repr (self ):
996996 f = ExtensionFrame (0xFF , 1 , 42 , b'hello' )
997997 assert repr (f ).endswith ("type=255, flag_byte=42, body=<hex:68656c6c6f>" )
998+
999+
1000+ @pytest .mark .parametrize ('pad_length' , [0 , 1 , 5 ])
1001+ @pytest .mark .parametrize ('payload' , [b'' , b'hello' ])
1002+ @pytest .mark .parametrize ('priority' , [False , True ])
1003+ def test_padded_headers_body_length (pad_length , payload , priority ):
1004+ flags = ['PADDED' , 'END_HEADERS' ]
1005+ if priority :
1006+ flags .append ('PRIORITY' )
1007+ frame = HeadersFrame (1 , flags = flags , pad_length = pad_length , data = payload )
1008+ wire = frame .serialize ()
1009+ decoded = decode_frame (wire )
1010+ assert decoded .data == payload
1011+ assert decoded .body_len == len (wire ) - 9
1012+ assert decoded .serialize () == wire
1013+
1014+
1015+ @pytest .mark .parametrize ('frame_type' , [HeadersFrame , PushPromiseFrame ])
1016+ def test_padding_cannot_overlap_fixed_fields (frame_type ):
1017+ # The pad-length byte claims one padding byte, but all remaining bytes
1018+ # belong to the mandatory priority or promised-stream-ID field.
1019+ if frame_type is HeadersFrame :
1020+ frame = HeadersFrame (1 , flags = ['PADDED' , 'PRIORITY' ])
1021+ body = b'\x01 \x00 \x00 \x00 \x00 \x00 '
1022+ else :
1023+ frame = PushPromiseFrame (1 , flags = ['PADDED' ])
1024+ body = b'\x01 \x00 \x00 \x00 \x02 '
1025+ with pytest .raises (InvalidPaddingError ):
1026+ frame .parse_body (memoryview (body ))
0 commit comments