コード例 #1
0
    def test_case14(self):
        """

        http://httpwg.org/specs/rfc7540.html#SETTINGS
        A value of 0 for SETTINGS_MAX_CONCURRENT_STREAMS SHOULD NOT be treated as special by endpoints. 

        """

        print("[ TEST CASE 14 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_MAX_CONCURRENT_STREAMS_1]")
        self.send_data([http2.setting(SETTINGS_MAX_CONCURRENT_STREAMS = b"\x00\x00\x00\x01")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_MAX_CONCURRENT_STREAMS_0]")
        self.send_data([http2.setting(SETTINGS_MAX_CONCURRENT_STREAMS = b"\x00\x00\x00\x00")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_MAX_CONCURRENT_STREAMS_MAX]")
        self.send_data([http2.setting(SETTINGS_MAX_CONCURRENT_STREAMS = b"\xFF\xFF\xFF\xFF")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
コード例 #2
0
    def test_case18(self):
        """

        http://httpwg.org/specs/rfc7540.html#PUSH_PROMISE
        A PUSH_PROMISE frame without the END_HEADERS flag set MUST be followed by a CONTINUATION frame for the same stream.

        """

        print("[ TEST CASE 18 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [PUSH_PROMISE]")
        self.send_data([http2.push_promise(END_HEADERS = False)])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
コード例 #3
0
    def test_case12(self):
        """

        http://httpwg.org/specs/rfc7540.html#SETTINGS
        Implementations MUST support all of the parameters defined by this specification.

        """

        print("[ TEST CASE 12 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_SETTINGS_HEADER_TABLE_SIZE_FF]")
        self.send_data([http2.setting(SETTINGS_HEADER_TABLE_SIZE = b"\x00\x00\x00\xff")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_SETTINGS_ENABLE_PUSH_0]")
        self.send_data([http2.setting(SETTINGS_ENABLE_PUSH = b"\x00\x00\x00\x00")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_SETTINGS_MAX_CONCURRENT_STREAMS_FF]")
        self.send_data([http2.setting(SETTINGS_MAX_CONCURRENT_STREAMS = b"\x00\x00\xFF\xFF")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_SETTINGS_MAX_CONCURRENT_STREAMS_FF]")
        self.send_data([http2.setting(SETTINGS_MAX_CONCURRENT_STREAMS = b"\x00\x00\xFF\xFF")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
        
        print("> [SETTINGS_SETTINGS_INITIAL_WINDOW_SIZE_FF]")
        self.send_data([http2.setting(SETTINGS_INITIAL_WINDOW_SIZE = b"\x00\x00\x00\xFF")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
        
        print("> [SETTINGS_SETTINGS_INITIAL_WINDOW_SIZE_FF]")
        self.send_data([http2.setting(SETTINGS_INITIAL_WINDOW_SIZE = b"\x00\x00\x00\xFF")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_SETTINGS_MAX_FRAME_SIZE]")
        self.send_data([http2.setting(SETTINGS_MAX_FRAME_SIZE = b"\x00\x00\xFF\xFF")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_SETTINGS_MAX_HEADER_LIST_SIZE]")
        self.send_data([http2.setting(SETTINGS_MAX_HEADER_LIST_SIZE = b"\x00\x00\xFF\xFF")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
コード例 #4
0
    def test_case4(self):
        """

        http://httpwg.org/specs/rfc7540.html#PING
        PING frames MUST contain 8 octets of opaque data in the payload.
        """

        print("[ TEST CASE 4 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [PING]")
        self.send_data([http2.ping(opaque_data = "\x00\x01" * 4)])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [PING_SMALL_OPAQUE_DATA]")
        self.send_data([http2.ping(opaque_data = "\x00\x01")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [PING_LARGE_OPAQUE_DATA]")
        self.send_data([http2.ping(opaque_data = "\x01\x01" * 16)])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
        
        print("-------------------------------------------------")
コード例 #5
0
    def test_case15(self):
        """

        http://httpwg.org/specs/rfc7540.html#SETTINGS
        SETTINGS_INITIAL_WINDOW_SIZE (0x4): Values above the maximum flow-control window size of 231-1 MUST be treated as a connection error (Section 5.4.1) of type FLOW_CONTROL_ERROR.

        """

        print("[ TEST CASE 15 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_INITIAL_WINDOW_SIZE_0]")
        self.send_data([http2.setting(SETTINGS_INITIAL_WINDOW_SIZE = b"\x00\x00\x00\x00")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_INITIAL_WINDOW_SIZE_1]")
        self.send_data([http2.setting(SETTINGS_INITIAL_WINDOW_SIZE = b"\x00\x00\x00\x01")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_INITIAL_WINDOW_SIZE_FF]")
        self.send_data([http2.setting(SETTINGS_INITIAL_WINDOW_SIZE = b"\x00\x00\x00\xff")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_INITIAL_WINDOW_SIZE_FFFF]")
        self.send_data([http2.setting(SETTINGS_INITIAL_WINDOW_SIZE = b"\x00\x00\xff\xff")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_INITIAL_WINDOW_SIZE_FFFFFF]")
        self.send_data([http2.setting(SETTINGS_INITIAL_WINDOW_SIZE = b"\x00\xff\xff\xff")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
        
        print("> [SETTINGS_INITIAL_WINDOW_SIZE_FFFFFFFF]")
        self.send_data([http2.setting(SETTINGS_INITIAL_WINDOW_SIZE = b"\xff\xff\xff\xff")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
        
        print("> [SETTINGS_INITIAL_WINDOW_SIZE_0]")
        self.send_data([http2.setting(SETTINGS_INITIAL_WINDOW_SIZE = b"\x00\x00\x00\x00")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
コード例 #6
0
    def test_case17(self):
        """

        http://httpwg.org/specs/rfc7540.html#SETTINGS
        An endpoint that receives a SETTINGS frame with any unknown or unsupported identifier MUST ignore that setting.

        """

        print("[ TEST CASE 17 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_UNKNOWN_PARAM]")
        self.send_data([http2.setting(payload = b"\x00\x07\xff\xff\xff\xff"*100)])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
コード例 #7
0
    def test_case2(self):
        """

        http://httpwg.org/specs/rfc7540.html#SETTINGS
        ACK (0x1): When set, bit 0 indicates that this frame acknowledges receipt and application of the peer's SETTINGS frame. When this bit is set, the payload of the SETTINGS frame MUST be empty. Receipt of a SETTINGS frame with the ACK flag set and a length field value other than 0 MUST be treated as a connection error (Section 5.4.1) of type FRAME_SIZE_ERROR.
        """

        print("[ TEST CASE 2 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))        

        print("> [SETTINGS_ACK_PAYLOAD]")
        self.send_data([http2.setting(ack = True, SETTINGS_HEADER_TABLE_SIZE = b"\x00\x00\x11\x11")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
        print("-------------------------------------------------")
コード例 #8
0
    def test_case3(self):
        """

        http://httpwg.org/specs/rfc7540.html#SETTINGS
        The stream identifier for a SETTINGS frame MUST be zero (0x0).

        """

        print("[ TEST CASE 3 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_SID_01]")
        self.send_data([http2.setting(sid = "\x00\x00\x00\x01")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
        print("-------------------------------------------------")
コード例 #9
0
    def test_case16(self):
        """

        http://httpwg.org/specs/rfc7540.html#SETTINGS
        SETTINGS_MAX_FRAME_SIZE (0x5): The initial value is 2^14 (16,384) octets. The value advertised by an endpoint MUST be between this initial value and the maximum allowed frame size (224-1 or 16,777,215 octets), inclusive. Values outside this range MUST be treated as a connection error (Section 5.4.1) of type PROTOCOL_ERROR.

        """

        print("[ TEST CASE 16 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_MAX_FRAME_SIZE_FFFF]")
        self.send_data([http2.setting(SETTINGS_INITIAL_WINDOW_SIZE = b"\x00\x00\xff\xff")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_MAX_FRAME_SIZE_FFFFFF]")
        self.send_data([http2.setting(SETTINGS_INITIAL_WINDOW_SIZE = b"\x00\xff\xff\xff")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_MAX_FRAME_SIZE_1]")
        self.send_data([http2.setting(SETTINGS_INITIAL_WINDOW_SIZE = b"\x00\x00\x00\x01")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_MAX_FRAME_SIZE_FFFFFFFF]")
        self.send_data([http2.setting(SETTINGS_INITIAL_WINDOW_SIZE = b"\xff\xff\xff\xff")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))                
        
        print("> [SETTINGS_MAX_FRAME_SIZE_0]")
        self.send_data([http2.setting(SETTINGS_INITIAL_WINDOW_SIZE = b"\x00\x00\x00\x00")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))        
コード例 #10
0
    def test_case11(self):
        """

        http://httpwg.org/specs/rfc7540.html#RST_STREAM
        If a RST_STREAM frame is received with a stream identifier of 0x0, the recipient MUST treat this as a connection error 
        """

        print("[ TEST CASE 11 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [RST_STREAM_SID_00]")
        self.send_data([http2.rst_stream(sid = "\x00\x00\x00\x00", error_code = "\x01\x02\x03\x04")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
コード例 #11
0
    def test_case9(self):
        """

        http://httpwg.org/specs/rfc7540.html#PRIORITY
        The PRIORITY frame can be sent for a stream in the "idle" or "closed" state.
        """

        print("[ TEST CASE 9 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [PRIORITY_SID_01020304]")
        self.send_data([http2.priority(sid = "\x01\x02\x03\x04")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
コード例 #12
0
    def test_case7(self):
        """

        http://httpwg.org/specs/rfc7540.html#PRIORITY
        If a PRIORITY frame is received with a stream identifier of 0x0, the recipient MUST respond with a connection error
        """

        print("[ TEST CASE 7 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [PRIORITY_SID_00]")
        self.send_data([http2.priority(sid = "\x00\x00\x00\x00")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
コード例 #13
0
    def test_case6(self):
        """

        http://httpwg.org/specs/rfc7540.html#PING
        PING frames are not associated with any individual stream. If a PING frame is received with a stream identifier field value other than 0x0, the recipient MUST respond with a connection error
        """

        print("[ TEST CASE 6 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [PING_SID_01]")
        self.send_data([http2.ping(sid = "\x00\x00\x00\x01")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
コード例 #14
0
    def test_case5(self):
        """

        http://httpwg.org/specs/rfc7540.html#PING
        ACK(0x1) [...] An endpoint MUST NOT respond to PING frames containing this flag
        """

        print("[ TEST CASE 5 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [PING_ACK]")
        self.send_data([http2.ping(ack = True, opaque_data = "\x00\x01" * 4)])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
コード例 #15
0
    def test_case10(self):
        """

        http://httpwg.org/specs/rfc7540.html#RST_STREAM
        A RST_STREAM frame with a length other than 4 octets MUST be treated as a connection error
        """

        print("[ TEST CASE 10 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [RST_STREAM_LARGE_ERROR_CODE]")
        self.send_data([http2.rst_stream(error_code = "\x01\x02\x03\x04" * 4)])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
コード例 #16
0
    def execute_random_test(self):

        vocabulary = dict()
        vocabulary.update(http2.various_ping())
        vocabulary.update(http2.various_headers())


        print(vocabulary)
        # vocabulary.extend(http2.various_setting())

        # vocabulary.extend(http2.various_priority())
        # vocabulary.extend(http2.various_rst_stream())
        # vocabulary.extend(http2.various_push_promise())        

        to_send = [random.choice(list(vocabulary.keys())) for x in range(random.randint(4, 10))]
        test_name = ";".join(to_send)

        results = []
        self.init_target()
        self.send_data([http2.setting()])
        
        print("[ TEST CASE {} ]----------------------------------".format(test_name))
        data = self.__read_from_socket()
        recv_symbols = self.__parse_client_request(data)
        results.append(str(recv_symbols))
        
        
        for sym in to_send:
            try:
                print("SYM : {}: {}".format(sym, vocabulary[sym]))
                self.send_data([vocabulary[sym]])
                data = self.__read_from_socket()
                recv_symbols = self.__parse_client_request(data)
                results.append(str(recv_symbols))
            except Exception as e:
                results.append("ERROR")
        
        
        print(results)
        
        return test_name, results
コード例 #17
0
    def test_case8(self):
        """

        http://httpwg.org/specs/rfc7540.html#PRIORITY
        Weight: An unsigned 8-bit integer representing a priority weight for the stream
        A PRIORITY frame with a length other than 5 octets MUST be treated as a stream error 
        """

        print("[ TEST CASE 8 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [PRIORITY_WEIGHT_01020304]")
        self.send_data([http2.priority(weight = "\x01\x02\x03\x04")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
コード例 #18
0
    def test_case19(self):
        """

        http://httpwg.org/specs/rfc7540.html#StreamStates
        """

        print("[ TEST CASE 19 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [HEADERS]")


        small_get_index_html_header = {
            ":method" : "GET",
            ":scheme" : "http",
            ":path" : "/index.html",
            ":authority": "localhost",
            "host" : "localhost"   
        }

        header_data = Encoder().encode(small_get_index_html_header, huffman=False)
        
        self.send_data([http2.headers(END_HEADERS = True, header_block_fragment = header_data)])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [PUSH_PROMISE]")
        self.send_data([http2.push_promise(END_HEADERS = False)])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
コード例 #19
0
    def test_case13(self):
        """

        http://httpwg.org/specs/rfc7540.html#SETTINGS
        SETTINGS_ENABLE_PUSH (0x2): Any value other than 0 or 1 MUST be treated as a connection error

        """

        print("[ TEST CASE 13 ]----------------------------------")
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS]")
        self.send_data([http2.setting()])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_SETTINGS_ENABLE_PUSH_0]")
        self.send_data([http2.setting(SETTINGS_ENABLE_PUSH = b"\x00\x00\x00\x00")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
        
        print("> [SETTINGS_SETTINGS_ENABLE_PUSH_1]")
        self.send_data([http2.setting(SETTINGS_ENABLE_PUSH = b"\x00\x00\x00\x01")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_SETTINGS_ENABLE_PUSH_FF]")
        self.send_data([http2.setting(SETTINGS_ENABLE_PUSH = b"\x00\x00\x00\xff")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))
        
        print("> [SETTINGS_SETTINGS_ENABLE_PUSH_MAX]")
        self.send_data([http2.setting(SETTINGS_ENABLE_PUSH = b"\xff\xff\xff\xff")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))

        print("> [SETTINGS_SETTINGS_ENABLE_PUSH_RANDOM")
        self.send_data([http2.setting(SETTINGS_ENABLE_PUSH = b"\x01\x02\x03\x04")])
        data = self.__read_from_socket()
        print("< {}".format(self.__parse_client_request(data)))