You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
The text was updated successfully, but these errors were encountered:
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:
May be good to add this test to CI, if and when that's added
The text was updated successfully, but these errors were encountered: