tornado_http2
tornado_http2 copied to clipboard
Demo.py fails h2spec testing
There is a nice integration test out there for ensuring that http2 servers are compliant called h2spec. I ran the tests, and the server is failing some tests (and actually causes the server to get into a funky state where it won't accept more requests).
Here's the output of the test:
Generic tests for HTTP/2 server
1. Starting HTTP/2
1: Sends a client connection preface
✔ 1: Sends a client connection preface
2. Streams and Multiplexing
1: Sends a PRIORITY frame on idle stream
× 1: Sends a PRIORITY frame on idle stream
-> The endpoint MUST accept PRIORITY frame.
Expected: PING Frame (length:8, flags:0x01, stream_id:0, opaque_data: )
Actual: Connection closed
2: Sends a WINDOW_UPDATE frame on half-closed (remote) stream
✔ 2: Sends a WINDOW_UPDATE frame on half-closed (remote) stream
3: Sends a PRIORITY frame on half-closed (remote) stream
✔ 3: Sends a PRIORITY frame on half-closed (remote) stream
4: Sends a RST_STREAM frame on half-closed (remote) stream
✔ 4: Sends a RST_STREAM frame on half-closed (remote) stream
5: Sends a PRIORITY frame on closed stream
✔ 5: Sends a PRIORITY frame on closed stream
3. Frame Definitions
3.1. DATA
1: Sends a DATA frame
✔ 1: Sends a DATA frame
2: Sends multiple DATA frames
✔ 2: Sends multiple DATA frames
3: Sends a DATA frame with padding
✔ 3: Sends a DATA frame with padding
3.2. HEADERS
1: Sends a HEADERS frame
✔ 1: Sends a HEADERS frame
2: Sends a HEADERS frame with padding
✔ 2: Sends a HEADERS frame with padding
3: Sends a HEADERS frame with priority
✔ 3: Sends a HEADERS frame with priority
3.3. PRIORITY
1: Sends a PRIORITY frame with priority 1
× 1: Sends a PRIORITY frame with priority 1
-> The endpoint MUST accept PRIORITY frame with priority 1.
Expected: HEADERS Frame (stream_id:1)
Actual: Connection closed
2: Sends a PRIORITY frame with priority 256
× 2: Sends a PRIORITY frame with priority 256
-> The endpoint MUST accept PRIORITY frame with priority 256.
Expected: HEADERS Frame (stream_id:1)
Actual: Connection closed
3: Sends a PRIORITY frame with stream dependency
× 3: Sends a PRIORITY frame with stream dependency
-> The endpoint MUST accept PRIORITY frame with stream dependency.
Expected: HEADERS Frame (stream_id:1)
Actual: Connection closed
4: Sends a PRIORITY frame with exclusive
× 4: Sends a PRIORITY frame with exclusive
-> The endpoint MUST accept PRIORITY frame with exclusive.
Expected: HEADERS Frame (stream_id:1)
Actual: Connection closed
5: Sends a PRIORITY frame for an idle stream, then send a HEADER frame for a lower stream ID
× 5: Sends a PRIORITY frame for an idle stream, then send a HEADER frame for a lower stream ID
-> The endpoint MUST respond the HEADER frame.
Expected: HEADERS Frame (stream_id:1)
Actual: Connection closed
3.4. RST_STREAM
1: Sends a RST_STREAM frame
✔ 1: Sends a RST_STREAM frame
3.5. SETTINGS
1: Sends a SETTINGS frame
✔ 1: Sends a SETTINGS frame
3.7. PING
1: Sends a PING frame
✔ 1: Sends a PING frame
3.8. GOAWAY
1: Sends a GOAWAY frame
✔ 1: Sends a GOAWAY frame
3.9. WINDOW_UPDATE
1: Sends a WINDOW_UPDATE frame with stream ID 0
✔ 1: Sends a WINDOW_UPDATE frame with stream ID 0
2: Sends a WINDOW_UPDATE frame with stream ID 1
✔ 2: Sends a WINDOW_UPDATE frame with stream ID 1
3.10. CONTINUATION
1: Sends a CONTINUATION frame
✔ 1: Sends a CONTINUATION frame
2: Sends multiple CONTINUATION frames
✔ 2: Sends multiple CONTINUATION frames
4. HTTP Message Exchanges
1: Sends a GET request
✔ 1: Sends a GET request
2: Sends a HEAD request
✔ 2: Sends a HEAD request
3: Sends a POST request
✔ 3: Sends a POST request
4: Sends a POST request with trailers
✔ 4: Sends a POST request with trailers
5. HPACK
1: Sends a indexed header field representation
✔ 1: Sends a indexed header field representation
2: Sends a literal header field with incremental indexing - indexed name
✔ 2: Sends a literal header field with incremental indexing - indexed name
3: Sends a literal header field with incremental indexing - indexed name (with Huffman coding)
✔ 3: Sends a literal header field with incremental indexing - indexed name (with Huffman coding)
4: Sends a literal header field with incremental indexing - new name
✔ 4: Sends a literal header field with incremental indexing - new name
5: Sends a literal header field with incremental indexing - new name (with Huffman coding)
✔ 5: Sends a literal header field with incremental indexing - new name (with Huffman coding)
6: Sends a literal header field without indexing - indexed name
✔ 6: Sends a literal header field without indexing - indexed name
7: Sends a literal header field without indexing - indexed name (with Huffman coding)
✔ 7: Sends a literal header field without indexing - indexed name (with Huffman coding)
8: Sends a literal header field without indexing - new name
✔ 8: Sends a literal header field without indexing - new name
9: Sends a literal header field without indexing - new name (huffman encoded)
✔ 9: Sends a literal header field without indexing - new name (huffman encoded)
10: Sends a literal header field never indexed - indexed name
✔ 10: Sends a literal header field never indexed - indexed name
11: Sends a literal header field never indexed - indexed name (huffman encoded)
✔ 11: Sends a literal header field never indexed - indexed name (huffman encoded)
12: Sends a literal header field never indexed - new name
✔ 12: Sends a literal header field never indexed - new name
13: Sends a literal header field never indexed - new name (huffman encoded)
✔ 13: Sends a literal header field never indexed - new name (huffman encoded)
14: Sends a dynamic table size update
✔ 14: Sends a dynamic table size update
15: Sends multiple dynamic table size update
✔ 15: Sends multiple dynamic table size update
Hypertext Transfer Protocol Version 2 (HTTP/2)
3. Starting HTTP/2
3.5. HTTP/2 Connection Preface
1: Sends client connection preface
✔ 1: Sends client connection preface
2: Sends invalid connection preface
✔ 2: Sends invalid connection preface
4. HTTP Frames
4.1. Frame Format
1: Sends a frame with unknown type
✔ 1: Sends a frame with unknown type
2: Sends a frame with undefined flag
✔ 2: Sends a frame with undefined flag
3: Sends a frame with reserved field bit
✔ 3: Sends a frame with reserved field bit
4.2. Frame Size
1: Sends a DATA frame with 2^14 octets in length
✔ 1: Sends a DATA frame with 2^14 octets in length
2: Sends a large size DATA frame that exceeds the SETTINGS_MAX_FRAME_SIZE
✔ 2: Sends a large size DATA frame that exceeds the SETTINGS_MAX_FRAME_SIZE
3: Sends a large size HEADERS frame that exceeds the SETTINGS_MAX_FRAME_SIZE
✔ 3: Sends a large size HEADERS frame that exceeds the SETTINGS_MAX_FRAME_SIZE
4.3. Header Compression and Decompression
1: Sends invalid header block fragment
✔ 1: Sends invalid header block fragment
2: Sends a PRIORITY frame while sending the header blocks
✔ 2: Sends a PRIORITY frame while sending the header blocks
3: Sends a HEADERS frame to another stream while sending the header blocks
✔ 3: Sends a HEADERS frame to another stream while sending the header blocks
5. Streams and Multiplexing
5.1. Stream States
1: idle: Sends a DATA frame
✔ 1: idle: Sends a DATA frame
2: idle: Sends a RST_STREAM frame
✔ 2: idle: Sends a RST_STREAM frame
3: idle: Sends a WINDOW_UPDATE frame
✔ 3: idle: Sends a WINDOW_UPDATE frame
4: idle: Sends a CONTINUATION frame
✔ 4: idle: Sends a CONTINUATION frame
5: half closed (remote): Sends a DATA frame
✔ 5: half closed (remote): Sends a DATA frame
6: half closed (remote): Sends a HEADERS frame
✔ 6: half closed (remote): Sends a HEADERS frame
7: half closed (remote): Sends a CONTINUATION frame
✔ 7: half closed (remote): Sends a CONTINUATION frame
8: closed: Sends a DATA frame after sending RST_STREAM frame
✔ 8: closed: Sends a DATA frame after sending RST_STREAM frame
9: closed: Sends a HEADERS frame after sending RST_STREAM frame
× 9: closed: Sends a HEADERS frame after sending RST_STREAM frame
-> The endpoint MUST treat this as a stream error of type STREAM_CLOSED.
Expected: GOAWAY Frame (Error Code: STREAM_CLOSED)
RST_STREAM Frame (Error Code: STREAM_CLOSED)
Connection closed
Actual: Timeout
10: closed: Sends a CONTINUATION frame after sending RST_STREAM frame
✔ 10: closed: Sends a CONTINUATION frame after sending RST_STREAM frame
11: closed: Sends a DATA frame
✔ 11: closed: Sends a DATA frame
12: closed: Sends a HEADERS frame
× 12: closed: Sends a HEADERS frame
-> The endpoint MUST treat this as a connection error of type STREAM_CLOSED.
Expected: GOAWAY Frame (Error Code: STREAM_CLOSED)
Connection closed
Actual: RST_STREAM Frame (length:4, flags:0x00, stream_id:1)
13: closed: Sends a CONTINUATION frame
× 13: closed: Sends a CONTINUATION frame
-> The endpoint MUST treat this as a connection error of type STREAM_CLOSED.
Expected: GOAWAY Frame (Error Code: STREAM_CLOSED)
GOAWAY Frame (Error Code: PROTOCOL_ERROR)
Connection closed
Actual: RST_STREAM Frame (length:4, flags:0x00, stream_id:1)
5.1.1. Stream Identifiers
1: Sends even-numbered stream identifier
✔ 1: Sends even-numbered stream identifier
2: Sends stream identifier that is numerically smaller than previous
× 2: Sends stream identifier that is numerically smaller than previous
-> The endpoint MUST respond with a connection error of type PROTOCOL_ERROR.
Expected: GOAWAY Frame (Error Code: PROTOCOL_ERROR)
Connection closed
Actual: DATA Frame (length:0, flags:0x01, stream_id:3)
5.1.2. Stream Concurrency
1: Sends HEADERS frames that causes their advertised concurrent stream limit to be exceeded
1: Sends HEADERS frames that causes their advertised concurrent stream limit to be exceeded
5.3. Stream Priority
5.3.1. Stream Dependencies
1: Sends HEADERS frame that depend on itself
✔ 1: Sends HEADERS frame that depend on itself
2: Sends PRIORITY frame that depend on itself
✔ 2: Sends PRIORITY frame that depend on itself
5.4. Error Handling
5.4.1. Connection Error Handling
1: Sends an invalid PING frame for connection close
✔ 1: Sends an invalid PING frame for connection close
5.5. Extending HTTP/2
1: Sends an unknown extension frame
✔ 1: Sends an unknown extension frame
2: Sends an unknown extension frame in the middle of a header block
✔ 2: Sends an unknown extension frame in the middle of a header block
6. Frame Definitions
6.1. DATA
1: Sends a DATA frame with 0x0 stream identifier
✔ 1: Sends a DATA frame with 0x0 stream identifier
2: Sends a DATA frame on the stream that is not in "open" or "half-closed (local)" state
✔ 2: Sends a DATA frame on the stream that is not in "open" or "half-closed (local)" state
3: Sends a DATA frame with invalid pad length
× 3: Sends a DATA frame with invalid pad length
-> The endpoint MUST treat this as a connection error of type PROTOCOL_ERROR.
Expected: GOAWAY Frame (Error Code: PROTOCOL_ERROR)
Connection closed
Actual: RST_STREAM Frame (length:4, flags:0x00, stream_id:1)
6.2. HEADERS
1: Sends a HEADERS frame without the END_HEADERS flag, and a PRIORITY frame
✔ 1: Sends a HEADERS frame without the END_HEADERS flag, and a PRIORITY frame
2: Sends a HEADERS frame to another stream while sending a HEADERS frame
✔ 2: Sends a HEADERS frame to another stream while sending a HEADERS frame
3: Sends a HEADERS frame with 0x0 stream identifier
✔ 3: Sends a HEADERS frame with 0x0 stream identifier
4: Sends a HEADERS frame with invalid pad length
✔ 4: Sends a HEADERS frame with invalid pad length
6.3. PRIORITY
1: Sends a PRIORITY frame with 0x0 stream identifier
✔ 1: Sends a PRIORITY frame with 0x0 stream identifier
2: Sends a PRIORITY frame with a length other than 5 octets
✔ 2: Sends a PRIORITY frame with a length other than 5 octets
6.4. RST_STREAM
1: Sends a RST_STREAM frame with 0x0 stream identifier
✔ 1: Sends a RST_STREAM frame with 0x0 stream identifier
2: Sends a RST_STREAM frame on a idle stream
✔ 2: Sends a RST_STREAM frame on a idle stream
3: Sends a RST_STREAM frame with a length other than 4 octets
✔ 3: Sends a RST_STREAM frame with a length other than 4 octets
6.5. SETTINGS
1: Sends a SETTINGS frame with ACK flag and payload
✔ 1: Sends a SETTINGS frame with ACK flag and payload
2: Sends a SETTINGS frame with a stream identifier other than 0x0
✔ 2: Sends a SETTINGS frame with a stream identifier other than 0x0
3: Sends a SETTINGS frame with a length other than a multiple of 6 octets
✔ 3: Sends a SETTINGS frame with a length other than a multiple of 6 octets
6.5.2. Defined SETTINGS Parameters
1: SETTINGS_ENABLE_PUSH (0x2): Sends the value other than 0 or 1
✔ 1: SETTINGS_ENABLE_PUSH (0x2): Sends the value other than 0 or 1
2: SETTINGS_INITIAL_WINDOW_SIZE (0x4): Sends the value above the maximum flow control window size
✔ 2: SETTINGS_INITIAL_WINDOW_SIZE (0x4): Sends the value above the maximum flow control window size
3: SETTINGS_MAX_FRAME_SIZE (0x5): Sends the value below the initial value
✔ 3: SETTINGS_MAX_FRAME_SIZE (0x5): Sends the value below the initial value
4: SETTINGS_MAX_FRAME_SIZE (0x5): Sends the value above the maximum allowed frame size
✔ 4: SETTINGS_MAX_FRAME_SIZE (0x5): Sends the value above the maximum allowed frame size
5: Sends a SETTINGS frame with unknown identifier
✔ 5: Sends a SETTINGS frame with unknown identifier
6.5.3. Settings Synchronization
1: Sends multiple values of SETTINGS_INITIAL_WINDOW_SIZE
✔ 1: Sends multiple values of SETTINGS_INITIAL_WINDOW_SIZE
2: Sends a SETTINGS frame without ACK flag
✔ 2: Sends a SETTINGS frame without ACK flag
6.7. PING
1: Sends a PING frame
✔ 1: Sends a PING frame
2: Sends a PING frame with ACK
✔ 2: Sends a PING frame with ACK
3: Sends a PING frame with a stream identifier field value other than 0x0
✔ 3: Sends a PING frame with a stream identifier field value other than 0x0
4: Sends a PING frame with a length field value other than 8
✔ 4: Sends a PING frame with a length field value other than 8
6.8. GOAWAY
1: Sends a GOAWAY frame with a stream identifier other than 0x0
✔ 1: Sends a GOAWAY frame with a stream identifier other than 0x0
6.9. WINDOW_UPDATE
1: Sends a WINDOW_UPDATE frame with a flow control window increment of 0
✔ 1: Sends a WINDOW_UPDATE frame with a flow control window increment of 0
2: Sends a WINDOW_UPDATE frame with a flow control window increment of 0 on a stream
✔ 2: Sends a WINDOW_UPDATE frame with a flow control window increment of 0 on a stream
3: Sends a WINDOW_UPDATE frame with a length other than 4 octets
✔ 3: Sends a WINDOW_UPDATE frame with a length other than 4 octets
6.9.1. The Flow-Control Window
1: Sends SETTINGS frame to set the initial window size to 1 and sends HEADERS frame
✔ 1: Sends SETTINGS frame to set the initial window size to 1 and sends HEADERS frame
2: Sends multiple WINDOW_UPDATE frames increasing the flow control window to above 2^31-1
✔ 2: Sends multiple WINDOW_UPDATE frames increasing the flow control window to above 2^31-1
3: Sends multiple WINDOW_UPDATE frames increasing the flow control window to above 2^31-1 on a stream
✔ 3: Sends multiple WINDOW_UPDATE frames increasing the flow control window to above 2^31-1 on a stream
6.9.2. Initial Flow-Control Window Size
1: Changes SETTINGS_INITIAL_WINDOW_SIZE after sending HEADERS frame
× 1: Changes SETTINGS_INITIAL_WINDOW_SIZE after sending HEADERS frame
-> The endpoint MUST adjust the size of all stream flow-control windows.
Expected: DATA Frame (length:1, flags:0x00, stream_id:1)
Actual: Timeout
2: Sends a SETTINGS frame for window size to be negative
× 2: Sends a SETTINGS frame for window size to be negative
-> The endpoint MUST track the negative flow-control window.
Expected: DATA Frame (length:1, flags:0x00, stream_id:1)
Actual: DATA Frame (length:2, flags:0x00, stream_id:1)
3: Sends a SETTINGS_INITIAL_WINDOW_SIZE settings with an exceeded maximum window size value
✔ 3: Sends a SETTINGS_INITIAL_WINDOW_SIZE settings with an exceeded maximum window size value
6.10. CONTINUATION
1: Sends multiple CONTINUATION frames preceded by a HEADERS frame
✔ 1: Sends multiple CONTINUATION frames preceded by a HEADERS frame
2: Sends a CONTINUATION frame followed by any frame other than CONTINUATION
✔ 2: Sends a CONTINUATION frame followed by any frame other than CONTINUATION
3: Sends a CONTINUATION frame with 0x0 stream identifier
✔ 3: Sends a CONTINUATION frame with 0x0 stream identifier
4: Sends a CONTINUATION frame preceded by a HEADERS frame with END_HEADERS flag
× 4: Sends a CONTINUATION frame preceded by a HEADERS frame with END_HEADERS flag
-> The endpoint MUST respond with a connection error of type PROTOCOL_ERROR.
Expected: GOAWAY Frame (Error Code: PROTOCOL_ERROR)
Connection closed
Actual: RST_STREAM Frame (length:4, flags:0x00, stream_id:1)
5: Sends a CONTINUATION frame preceded by a CONTINUATION frame with END_HEADERS flag
× 5: Sends a CONTINUATION frame preceded by a CONTINUATION frame with END_HEADERS flag
-> The endpoint MUST respond with a connection error of type PROTOCOL_ERROR.
Expected: GOAWAY Frame (Error Code: PROTOCOL_ERROR)
Connection closed
Actual: RST_STREAM Frame (length:4, flags:0x00, stream_id:1)
6: Sends a CONTINUATION frame preceded by a DATA frame
✔ 6: Sends a CONTINUATION frame preceded by a DATA frame
7. Error Codes
1: Sends a GOAWAY frame with unknown error code
✔ 1: Sends a GOAWAY frame with unknown error code
2: Sends a RST_STREAM frame with unknown error code
✔ 2: Sends a RST_STREAM frame with unknown error code
8. HTTP Message Exchanges
8.1. HTTP Request/Response Exchange
1: Sends a second HEADERS frame without the END_STREAM flag
✔ 1: Sends a second HEADERS frame without the END_STREAM flag
8.1.2. HTTP Header Fields
1: Sends a HEADERS frame that contains the header field name in uppercase letters
✔ 1: Sends a HEADERS frame that contains the header field name in uppercase letters
8.1.2.1. Pseudo-Header Fields
1: Sends a HEADERS frame that contains a unknown pseudo-header field
✔ 1: Sends a HEADERS frame that contains a unknown pseudo-header field
2: Sends a HEADERS frame that contains the pseudo-header field defined for response
✔ 2: Sends a HEADERS frame that contains the pseudo-header field defined for response
3: Sends a HEADERS frame that contains a pseudo-header field as trailers
✔ 3: Sends a HEADERS frame that contains a pseudo-header field as trailers
4: Sends a HEADERS frame that contains a pseudo-header field that appears in a header block after a regular header field
✔ 4: Sends a HEADERS frame that contains a pseudo-header field that appears in a header block after a regular header field
8.1.2.2. Connection-Specific Header Fields
1: Sends a HEADERS frame that contains the connection-specific header field
✔ 1: Sends a HEADERS frame that contains the connection-specific header field
2: Sends a HEADERS frame that contains the TE header field with any value other than "trailers"
✔ 2: Sends a HEADERS frame that contains the TE header field with any value other than "trailers"
8.1.2.3. Request Pseudo-Header Fields
1: Sends a HEADERS frame with empty ":path" pseudo-header field
× 1: Sends a HEADERS frame with empty ":path" pseudo-header field
-> The endpoint MUST respond with a stream error of type PROTOCOL_ERROR.
Expected: GOAWAY Frame (Error Code: PROTOCOL_ERROR)
RST_STREAM Frame (Error Code: PROTOCOL_ERROR)
Connection closed
Actual: DATA Frame (length:0, flags:0x01, stream_id:1)
2: Sends a HEADERS frame that omits ":method" pseudo-header field
✔ 2: Sends a HEADERS frame that omits ":method" pseudo-header field
3: Sends a HEADERS frame that omits ":scheme" pseudo-header field
✔ 3: Sends a HEADERS frame that omits ":scheme" pseudo-header field
4: Sends a HEADERS frame that omits ":path" pseudo-header field
✔ 4: Sends a HEADERS frame that omits ":path" pseudo-header field
5: Sends a HEADERS frame with duplicated ":method" pseudo-header field
✔ 5: Sends a HEADERS frame with duplicated ":method" pseudo-header field
6: Sends a HEADERS frame with duplicated ":scheme" pseudo-header field
✔ 6: Sends a HEADERS frame with duplicated ":scheme" pseudo-header field
7: Sends a HEADERS frame with duplicated ":path" pseudo-header field
✔ 7: Sends a HEADERS frame with duplicated ":path" pseudo-header field
8.1.2.6. Malformed Requests and Responses
1: Sends a HEADERS frame with the "content-length" header field which does not equal the DATA frame payload length
✔ 1: Sends a HEADERS frame with the "content-length" header field which does not equal the DATA frame payload length
2: Sends a HEADERS frame with the "content-length" header field which does not equal the sum of the multiple DATA frames payload length
✔ 2: Sends a HEADERS frame with the "content-length" header field which does not equal the sum of the multiple DATA frames payload length
8.2. Server Push
1: Sends a PUSH_PROMISE frame
✔ 1: Sends a PUSH_PROMISE frame
HPACK: Header Compression for HTTP/2
2. Compression Process Overview
2.3. Indexing Tables
2.3.3. Index Address Space
1: Sends a header field representation with invalid index
✔ 1: Sends a header field representation with invalid index
4. Dynamic Table Management
4.2. Maximum Table Size
1: Sends a dynamic table size update at the end of header block
✔ 1: Sends a dynamic table size update at the end of header block
5. Primitive Type Representations
5.2. String Literal Representation
1: Sends a Huffman-encoded string literal representation with padding longer than 7 bits
× 1: Sends a Huffman-encoded string literal representation with padding longer than 7 bits
-> The endpoint MUST treat this as a decoding error.
Expected: GOAWAY Frame (Error Code: COMPRESSION_ERROR)
Connection closed
Actual: DATA Frame (length:0, flags:0x01, stream_id:1)
2: Sends a Huffman-encoded string literal representation padded by zero
× 2: Sends a Huffman-encoded string literal representation padded by zero
-> The endpoint MUST treat this as a decoding error.
Expected: GOAWAY Frame (Error Code: COMPRESSION_ERROR)
Connection closed
Actual: DATA Frame (length:0, flags:0x01, stream_id:1)
3: Sends a Huffman-encoded string literal representation containing the EOS symbol
✔ 3: Sends a Huffman-encoded string literal representation containing the EOS symbol
6. Binary Format
6.1. Indexed Header Field Representation
1: Sends a indexed header field representation with index 0
✔ 1: Sends a indexed header field representation with index 0
6.3. Dynamic Table Size Update
1: Sends a dynamic table size update larger than the value of SETTINGS_HEADER_TABLE_SIZE
× 1: Sends a dynamic table size update larger than the value of SETTINGS_HEADER_TABLE_SIZE
-> The endpoint MUST treat this as a decoding error.
Expected: GOAWAY Frame (Error Code: COMPRESSION_ERROR)
Connection closed
Actual: DATA Frame (length:0, flags:0x01, stream_id:1)
Failures:
Generic tests for HTTP/2 server
2. Streams and Multiplexing
× 1: Sends a PRIORITY frame on idle stream
-> The endpoint MUST accept PRIORITY frame.
Expected: PING Frame (length:8, flags:0x01, stream_id:0, opaque_data: )
Actual: Connection closed
3. Frame Definitions
3.3. PRIORITY
× 1: Sends a PRIORITY frame with priority 1
-> The endpoint MUST accept PRIORITY frame with priority 1.
Expected: HEADERS Frame (stream_id:1)
Actual: Connection closed
× 2: Sends a PRIORITY frame with priority 256
-> The endpoint MUST accept PRIORITY frame with priority 256.
Expected: HEADERS Frame (stream_id:1)
Actual: Connection closed
× 3: Sends a PRIORITY frame with stream dependency
-> The endpoint MUST accept PRIORITY frame with stream dependency.
Expected: HEADERS Frame (stream_id:1)
Actual: Connection closed
× 4: Sends a PRIORITY frame with exclusive
-> The endpoint MUST accept PRIORITY frame with exclusive.
Expected: HEADERS Frame (stream_id:1)
Actual: Connection closed
× 5: Sends a PRIORITY frame for an idle stream, then send a HEADER frame for a lower stream ID
-> The endpoint MUST respond the HEADER frame.
Expected: HEADERS Frame (stream_id:1)
Actual: Connection closed
Hypertext Transfer Protocol Version 2 (HTTP/2)
5. Streams and Multiplexing
5.1. Stream States
× 9: closed: Sends a HEADERS frame after sending RST_STREAM frame
-> The endpoint MUST treat this as a stream error of type STREAM_CLOSED.
Expected: GOAWAY Frame (Error Code: STREAM_CLOSED)
RST_STREAM Frame (Error Code: STREAM_CLOSED)
Connection closed
Actual: Timeout
× 12: closed: Sends a HEADERS frame
-> The endpoint MUST treat this as a connection error of type STREAM_CLOSED.
Expected: GOAWAY Frame (Error Code: STREAM_CLOSED)
Connection closed
Actual: RST_STREAM Frame (length:4, flags:0x00, stream_id:1)
× 13: closed: Sends a CONTINUATION frame
-> The endpoint MUST treat this as a connection error of type STREAM_CLOSED.
Expected: GOAWAY Frame (Error Code: STREAM_CLOSED)
GOAWAY Frame (Error Code: PROTOCOL_ERROR)
Connection closed
Actual: RST_STREAM Frame (length:4, flags:0x00, stream_id:1)
5.1.1. Stream Identifiers
× 2: Sends stream identifier that is numerically smaller than previous
-> The endpoint MUST respond with a connection error of type PROTOCOL_ERROR.
Expected: GOAWAY Frame (Error Code: PROTOCOL_ERROR)
Connection closed
Actual: DATA Frame (length:0, flags:0x01, stream_id:3)
6. Frame Definitions
6.1. DATA
× 3: Sends a DATA frame with invalid pad length
-> The endpoint MUST treat this as a connection error of type PROTOCOL_ERROR.
Expected: GOAWAY Frame (Error Code: PROTOCOL_ERROR)
Connection closed
Actual: RST_STREAM Frame (length:4, flags:0x00, stream_id:1)
6.9. WINDOW_UPDATE
6.9.2. Initial Flow-Control Window Size
× 1: Changes SETTINGS_INITIAL_WINDOW_SIZE after sending HEADERS frame
-> The endpoint MUST adjust the size of all stream flow-control windows.
Expected: DATA Frame (length:1, flags:0x00, stream_id:1)
Actual: Timeout
× 2: Sends a SETTINGS frame for window size to be negative
-> The endpoint MUST track the negative flow-control window.
Expected: DATA Frame (length:1, flags:0x00, stream_id:1)
Actual: DATA Frame (length:2, flags:0x00, stream_id:1)
6.10. CONTINUATION
× 4: Sends a CONTINUATION frame preceded by a HEADERS frame with END_HEADERS flag
-> The endpoint MUST respond with a connection error of type PROTOCOL_ERROR.
Expected: GOAWAY Frame (Error Code: PROTOCOL_ERROR)
Connection closed
Actual: RST_STREAM Frame (length:4, flags:0x00, stream_id:1)
× 5: Sends a CONTINUATION frame preceded by a CONTINUATION frame with END_HEADERS flag
-> The endpoint MUST respond with a connection error of type PROTOCOL_ERROR.
Expected: GOAWAY Frame (Error Code: PROTOCOL_ERROR)
Connection closed
Actual: RST_STREAM Frame (length:4, flags:0x00, stream_id:1)
8. HTTP Message Exchanges
8.1. HTTP Request/Response Exchange
8.1.2. HTTP Header Fields
8.1.2.3. Request Pseudo-Header Fields
× 1: Sends a HEADERS frame with empty ":path" pseudo-header field
-> The endpoint MUST respond with a stream error of type PROTOCOL_ERROR.
Expected: GOAWAY Frame (Error Code: PROTOCOL_ERROR)
RST_STREAM Frame (Error Code: PROTOCOL_ERROR)
Connection closed
Actual: DATA Frame (length:0, flags:0x01, stream_id:1)
HPACK: Header Compression for HTTP/2
5. Primitive Type Representations
5.2. String Literal Representation
× 1: Sends a Huffman-encoded string literal representation with padding longer than 7 bits
-> The endpoint MUST treat this as a decoding error.
Expected: GOAWAY Frame (Error Code: COMPRESSION_ERROR)
Connection closed
Actual: DATA Frame (length:0, flags:0x01, stream_id:1)
× 2: Sends a Huffman-encoded string literal representation padded by zero
-> The endpoint MUST treat this as a decoding error.
Expected: GOAWAY Frame (Error Code: COMPRESSION_ERROR)
Connection closed
Actual: DATA Frame (length:0, flags:0x01, stream_id:1)
6. Binary Format
6.3. Dynamic Table Size Update
× 1: Sends a dynamic table size update larger than the value of SETTINGS_HEADER_TABLE_SIZE
-> The endpoint MUST treat this as a decoding error.
Expected: GOAWAY Frame (Error Code: COMPRESSION_ERROR)
Connection closed
Actual: DATA Frame (length:0, flags:0x01, stream_id:1)
Finished in 24.3959 seconds
145 tests, 125 passed, 1 skipped, 19 failed
May be good to add this test to CI, if and when that's added
Looks like h2spec has changed - we use it (https://github.com/bdarnell/tornado_http2/blob/master/tornado_http2/test/h2spec_test.py) and the tests passed last time this repo was touched (in 2017).