tornado_http2 icon indicating copy to clipboard operation
tornado_http2 copied to clipboard

Demo.py fails h2spec testing

Open kahuang opened this issue 6 years ago • 1 comments

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

kahuang avatar Feb 20 '19 19:02 kahuang

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).

bdarnell avatar Feb 21 '19 03:02 bdarnell