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)))
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)))
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)))
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("-------------------------------------------------")
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)))
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)))
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("-------------------------------------------------")
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("-------------------------------------------------")
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)))
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)))
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)))
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)))
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)))
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)))
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)))
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
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)))
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)))
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)))