11477Szelenkov@nginx.comimport struct 21158Szelenkov@nginx.comimport time 31477Szelenkov@nginx.com 41635Szelenkov@nginx.comimport pytest 51158Szelenkov@nginx.comfrom unit.applications.lang.java import TestApplicationJava 61158Szelenkov@nginx.comfrom unit.applications.websockets import TestApplicationWebsocket 71730Szelenkov@nginx.comfrom unit.option import option 81158Szelenkov@nginx.com 91158Szelenkov@nginx.com 101158Szelenkov@nginx.comclass TestJavaWebsockets(TestApplicationJava): 111467Szelenkov@nginx.com prerequisites = {'modules': {'java': 'any'}} 121158Szelenkov@nginx.com 131246Szelenkov@nginx.com ws = TestApplicationWebsocket() 141158Szelenkov@nginx.com 151736Szelenkov@nginx.com @pytest.fixture(autouse=True) 161736Szelenkov@nginx.com def setup_method_fixture(self, request, skip_alert): 171596Szelenkov@nginx.com assert 'success' in self.conf( 181596Szelenkov@nginx.com {'http': {'websocket': {'keepalive_interval': 0}}}, 'settings' 191596Szelenkov@nginx.com ), 'clear keepalive_interval' 201158Szelenkov@nginx.com 211596Szelenkov@nginx.com skip_alert(r'socket close\(\d+\) failed') 221158Szelenkov@nginx.com 231158Szelenkov@nginx.com def close_connection(self, sock): 241596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 251158Szelenkov@nginx.com 261158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 271158Szelenkov@nginx.com 281158Szelenkov@nginx.com self.check_close(sock) 291158Szelenkov@nginx.com 301819Smax.romanov@nginx.com def check_close(self, sock, code=1000, no_close=False, frame=None): 311819Smax.romanov@nginx.com if frame == None: 321819Smax.romanov@nginx.com frame = self.ws.frame_read(sock) 331158Szelenkov@nginx.com 341596Szelenkov@nginx.com assert frame['fin'] == True, 'close fin' 351596Szelenkov@nginx.com assert frame['opcode'] == self.ws.OP_CLOSE, 'close opcode' 361596Szelenkov@nginx.com assert frame['code'] == code, 'close code' 371158Szelenkov@nginx.com 381158Szelenkov@nginx.com if not no_close: 391158Szelenkov@nginx.com sock.close() 401158Szelenkov@nginx.com 411158Szelenkov@nginx.com def check_frame(self, frame, fin, opcode, payload, decode=True): 421158Szelenkov@nginx.com if opcode == self.ws.OP_BINARY or not decode: 431158Szelenkov@nginx.com data = frame['data'] 441158Szelenkov@nginx.com else: 451158Szelenkov@nginx.com data = frame['data'].decode('utf-8') 461158Szelenkov@nginx.com 471596Szelenkov@nginx.com assert frame['fin'] == fin, 'fin' 481596Szelenkov@nginx.com assert frame['opcode'] == opcode, 'opcode' 491596Szelenkov@nginx.com assert data == payload, 'payload' 501158Szelenkov@nginx.com 511158Szelenkov@nginx.com def test_java_websockets_handshake(self): 521158Szelenkov@nginx.com self.load('websockets_mirror') 531158Szelenkov@nginx.com 541158Szelenkov@nginx.com resp, sock, key = self.ws.upgrade() 551158Szelenkov@nginx.com sock.close() 561158Szelenkov@nginx.com 571596Szelenkov@nginx.com assert resp['status'] == 101, 'status' 581596Szelenkov@nginx.com assert resp['headers']['Upgrade'] == 'websocket', 'upgrade' 591596Szelenkov@nginx.com assert resp['headers']['Connection'] == 'Upgrade', 'connection' 601596Szelenkov@nginx.com assert resp['headers']['Sec-WebSocket-Accept'] == self.ws.accept( 611596Szelenkov@nginx.com key 621596Szelenkov@nginx.com ), 'key' 631158Szelenkov@nginx.com 641158Szelenkov@nginx.com def test_java_websockets_mirror(self): 651158Szelenkov@nginx.com self.load('websockets_mirror') 661158Szelenkov@nginx.com 671158Szelenkov@nginx.com message = 'blah' 681158Szelenkov@nginx.com 691158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 701158Szelenkov@nginx.com 711158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, message) 721158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 731158Szelenkov@nginx.com 741596Szelenkov@nginx.com assert message == frame['data'].decode('utf-8'), 'mirror' 751158Szelenkov@nginx.com 761158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, message) 771158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 781158Szelenkov@nginx.com 791596Szelenkov@nginx.com assert message == frame['data'].decode('utf-8'), 'mirror 2' 801158Szelenkov@nginx.com 811158Szelenkov@nginx.com sock.close() 821158Szelenkov@nginx.com 831158Szelenkov@nginx.com def test_java_websockets_no_mask(self): 841158Szelenkov@nginx.com self.load('websockets_mirror') 851158Szelenkov@nginx.com 861158Szelenkov@nginx.com message = 'blah' 871158Szelenkov@nginx.com 881158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 891158Szelenkov@nginx.com 901158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, message, mask=False) 911158Szelenkov@nginx.com 921158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 931158Szelenkov@nginx.com 941596Szelenkov@nginx.com assert frame['opcode'] == self.ws.OP_CLOSE, 'no mask opcode' 951596Szelenkov@nginx.com assert frame['code'] == 1002, 'no mask close code' 961158Szelenkov@nginx.com 971158Szelenkov@nginx.com sock.close() 981158Szelenkov@nginx.com 991158Szelenkov@nginx.com def test_java_websockets_fragmentation(self): 1001158Szelenkov@nginx.com self.load('websockets_mirror') 1011158Szelenkov@nginx.com 1021158Szelenkov@nginx.com message = 'blah' 1031158Szelenkov@nginx.com 1041158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 1051158Szelenkov@nginx.com 1061158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, message, fin=False) 1071158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, ' ', fin=False) 1081158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, message) 1091158Szelenkov@nginx.com 1101158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 1111158Szelenkov@nginx.com 1121596Szelenkov@nginx.com assert message + ' ' + message == frame['data'].decode( 1131596Szelenkov@nginx.com 'utf-8' 1141596Szelenkov@nginx.com ), 'mirror framing' 1151158Szelenkov@nginx.com 1161158Szelenkov@nginx.com sock.close() 1171158Szelenkov@nginx.com 1181158Szelenkov@nginx.com def test_java_websockets_frame_fragmentation_invalid(self): 1191158Szelenkov@nginx.com self.load('websockets_mirror') 1201158Szelenkov@nginx.com 1211158Szelenkov@nginx.com message = 'blah' 1221158Szelenkov@nginx.com 1231158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 1241158Szelenkov@nginx.com 1251158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, message, fin=False) 1261158Szelenkov@nginx.com 1271158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 1281158Szelenkov@nginx.com 1291158Szelenkov@nginx.com frame.pop('data') 1301596Szelenkov@nginx.com assert frame == { 1311596Szelenkov@nginx.com 'fin': True, 1321596Szelenkov@nginx.com 'rsv1': False, 1331596Szelenkov@nginx.com 'rsv2': False, 1341596Szelenkov@nginx.com 'rsv3': False, 1351596Szelenkov@nginx.com 'opcode': self.ws.OP_CLOSE, 1361596Szelenkov@nginx.com 'mask': 0, 1371596Szelenkov@nginx.com 'code': 1002, 1381596Szelenkov@nginx.com 'reason': 'Fragmented control frame', 1391596Szelenkov@nginx.com }, 'close frame' 1401158Szelenkov@nginx.com 1411158Szelenkov@nginx.com sock.close() 1421158Szelenkov@nginx.com 1431158Szelenkov@nginx.com def test_java_websockets_two_clients(self): 1441158Szelenkov@nginx.com self.load('websockets_mirror') 1451158Szelenkov@nginx.com 1461158Szelenkov@nginx.com message1 = 'blah1' 1471158Szelenkov@nginx.com message2 = 'blah2' 1481158Szelenkov@nginx.com 1491158Szelenkov@nginx.com _, sock1, _ = self.ws.upgrade() 1501158Szelenkov@nginx.com _, sock2, _ = self.ws.upgrade() 1511158Szelenkov@nginx.com 1521158Szelenkov@nginx.com self.ws.frame_write(sock1, self.ws.OP_TEXT, message1) 1531158Szelenkov@nginx.com self.ws.frame_write(sock2, self.ws.OP_TEXT, message2) 1541158Szelenkov@nginx.com 1551158Szelenkov@nginx.com frame1 = self.ws.frame_read(sock1) 1561158Szelenkov@nginx.com frame2 = self.ws.frame_read(sock2) 1571158Szelenkov@nginx.com 1581596Szelenkov@nginx.com assert message1 == frame1['data'].decode('utf-8'), 'client 1' 1591596Szelenkov@nginx.com assert message2 == frame2['data'].decode('utf-8'), 'client 2' 1601158Szelenkov@nginx.com 1611158Szelenkov@nginx.com sock1.close() 1621158Szelenkov@nginx.com sock2.close() 1631158Szelenkov@nginx.com 1641596Szelenkov@nginx.com @pytest.mark.skip('not yet') 1651158Szelenkov@nginx.com def test_java_websockets_handshake_upgrade_absent( 1661848Szelenkov@nginx.com self, 1671158Szelenkov@nginx.com ): # FAIL https://tools.ietf.org/html/rfc6455#section-4.2.1 1681158Szelenkov@nginx.com self.load('websockets_mirror') 1691158Szelenkov@nginx.com 1701158Szelenkov@nginx.com resp = self.get( 1711158Szelenkov@nginx.com headers={ 1721158Szelenkov@nginx.com 'Host': 'localhost', 1731158Szelenkov@nginx.com 'Connection': 'Upgrade', 1741262Szelenkov@nginx.com 'Sec-WebSocket-Key': self.ws.key(), 1751158Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 1761158Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 1771158Szelenkov@nginx.com }, 1781158Szelenkov@nginx.com ) 1791158Szelenkov@nginx.com 1801596Szelenkov@nginx.com assert resp['status'] == 400, 'upgrade absent' 1811158Szelenkov@nginx.com 1821158Szelenkov@nginx.com def test_java_websockets_handshake_case_insensitive(self): 1831158Szelenkov@nginx.com self.load('websockets_mirror') 1841158Szelenkov@nginx.com 1851262Szelenkov@nginx.com resp, sock, _ = self.ws.upgrade( 1861158Szelenkov@nginx.com headers={ 1871158Szelenkov@nginx.com 'Host': 'localhost', 1881158Szelenkov@nginx.com 'Upgrade': 'WEBSOCKET', 1891158Szelenkov@nginx.com 'Connection': 'UPGRADE', 1901262Szelenkov@nginx.com 'Sec-WebSocket-Key': self.ws.key(), 1911158Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 1921158Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 1931262Szelenkov@nginx.com } 1941158Szelenkov@nginx.com ) 1951262Szelenkov@nginx.com sock.close() 1961158Szelenkov@nginx.com 1971596Szelenkov@nginx.com assert resp['status'] == 101, 'status' 1981158Szelenkov@nginx.com 1991596Szelenkov@nginx.com @pytest.mark.skip('not yet') 2001158Szelenkov@nginx.com def test_java_websockets_handshake_connection_absent(self): # FAIL 2011158Szelenkov@nginx.com self.load('websockets_mirror') 2021158Szelenkov@nginx.com 2031158Szelenkov@nginx.com resp = self.get( 2041158Szelenkov@nginx.com headers={ 2051158Szelenkov@nginx.com 'Host': 'localhost', 2061158Szelenkov@nginx.com 'Upgrade': 'websocket', 2071262Szelenkov@nginx.com 'Sec-WebSocket-Key': self.ws.key(), 2081158Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2091158Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2101158Szelenkov@nginx.com }, 2111158Szelenkov@nginx.com ) 2121158Szelenkov@nginx.com 2131596Szelenkov@nginx.com assert resp['status'] == 400, 'status' 2141158Szelenkov@nginx.com 2151158Szelenkov@nginx.com def test_java_websockets_handshake_version_absent(self): 2161158Szelenkov@nginx.com self.load('websockets_mirror') 2171158Szelenkov@nginx.com 2181158Szelenkov@nginx.com resp = self.get( 2191158Szelenkov@nginx.com headers={ 2201158Szelenkov@nginx.com 'Host': 'localhost', 2211158Szelenkov@nginx.com 'Upgrade': 'websocket', 2221158Szelenkov@nginx.com 'Connection': 'Upgrade', 2231262Szelenkov@nginx.com 'Sec-WebSocket-Key': self.ws.key(), 2241158Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2251158Szelenkov@nginx.com }, 2261158Szelenkov@nginx.com ) 2271158Szelenkov@nginx.com 2281596Szelenkov@nginx.com assert resp['status'] == 426, 'status' 2291158Szelenkov@nginx.com 2301596Szelenkov@nginx.com @pytest.mark.skip('not yet') 2311158Szelenkov@nginx.com def test_java_websockets_handshake_key_invalid(self): 2321158Szelenkov@nginx.com self.load('websockets_mirror') 2331158Szelenkov@nginx.com 2341158Szelenkov@nginx.com resp = self.get( 2351158Szelenkov@nginx.com headers={ 2361158Szelenkov@nginx.com 'Host': 'localhost', 2371158Szelenkov@nginx.com 'Upgrade': 'websocket', 2381158Szelenkov@nginx.com 'Connection': 'Upgrade', 2391158Szelenkov@nginx.com 'Sec-WebSocket-Key': '!', 2401158Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2411158Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2421158Szelenkov@nginx.com }, 2431158Szelenkov@nginx.com ) 2441158Szelenkov@nginx.com 2451596Szelenkov@nginx.com assert resp['status'] == 400, 'key length' 2461158Szelenkov@nginx.com 2471158Szelenkov@nginx.com key = self.ws.key() 2481158Szelenkov@nginx.com resp = self.get( 2491158Szelenkov@nginx.com headers={ 2501158Szelenkov@nginx.com 'Host': 'localhost', 2511158Szelenkov@nginx.com 'Upgrade': 'websocket', 2521158Szelenkov@nginx.com 'Connection': 'Upgrade', 2531158Szelenkov@nginx.com 'Sec-WebSocket-Key': [key, key], 2541158Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2551158Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2561158Szelenkov@nginx.com }, 2571158Szelenkov@nginx.com ) 2581158Szelenkov@nginx.com 2591848Szelenkov@nginx.com assert ( 2601848Szelenkov@nginx.com resp['status'] == 400 2611848Szelenkov@nginx.com ), 'key double' # FAIL https://tools.ietf.org/html/rfc6455#section-11.3.1 2621158Szelenkov@nginx.com 2631158Szelenkov@nginx.com def test_java_websockets_handshake_method_invalid(self): 2641158Szelenkov@nginx.com self.load('websockets_mirror') 2651158Szelenkov@nginx.com 2661158Szelenkov@nginx.com resp = self.post( 2671158Szelenkov@nginx.com headers={ 2681158Szelenkov@nginx.com 'Host': 'localhost', 2691158Szelenkov@nginx.com 'Upgrade': 'websocket', 2701158Szelenkov@nginx.com 'Connection': 'Upgrade', 2711262Szelenkov@nginx.com 'Sec-WebSocket-Key': self.ws.key(), 2721158Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2731158Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2741158Szelenkov@nginx.com }, 2751158Szelenkov@nginx.com ) 2761158Szelenkov@nginx.com 2771596Szelenkov@nginx.com assert resp['status'] == 400, 'status' 2781158Szelenkov@nginx.com 2791158Szelenkov@nginx.com def test_java_websockets_handshake_http_10(self): 2801158Szelenkov@nginx.com self.load('websockets_mirror') 2811158Szelenkov@nginx.com 2821158Szelenkov@nginx.com resp = self.get( 2831158Szelenkov@nginx.com headers={ 2841158Szelenkov@nginx.com 'Host': 'localhost', 2851158Szelenkov@nginx.com 'Upgrade': 'websocket', 2861158Szelenkov@nginx.com 'Connection': 'Upgrade', 2871262Szelenkov@nginx.com 'Sec-WebSocket-Key': self.ws.key(), 2881158Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2891158Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2901158Szelenkov@nginx.com }, 2911158Szelenkov@nginx.com http_10=True, 2921158Szelenkov@nginx.com ) 2931158Szelenkov@nginx.com 2941596Szelenkov@nginx.com assert resp['status'] == 400, 'status' 2951158Szelenkov@nginx.com 2961158Szelenkov@nginx.com def test_java_websockets_handshake_uri_invalid(self): 2971158Szelenkov@nginx.com self.load('websockets_mirror') 2981158Szelenkov@nginx.com 2991158Szelenkov@nginx.com resp = self.get( 3001158Szelenkov@nginx.com headers={ 3011158Szelenkov@nginx.com 'Host': 'localhost', 3021158Szelenkov@nginx.com 'Upgrade': 'websocket', 3031158Szelenkov@nginx.com 'Connection': 'Upgrade', 3041262Szelenkov@nginx.com 'Sec-WebSocket-Key': self.ws.key(), 3051158Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 3061158Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 3071158Szelenkov@nginx.com }, 3081158Szelenkov@nginx.com url='!', 3091158Szelenkov@nginx.com ) 3101158Szelenkov@nginx.com 3111596Szelenkov@nginx.com assert resp['status'] == 400, 'status' 3121158Szelenkov@nginx.com 3131158Szelenkov@nginx.com def test_java_websockets_protocol_absent(self): 3141158Szelenkov@nginx.com self.load('websockets_mirror') 3151158Szelenkov@nginx.com 3161158Szelenkov@nginx.com key = self.ws.key() 3171262Szelenkov@nginx.com resp, sock, _ = self.ws.upgrade( 3181158Szelenkov@nginx.com headers={ 3191158Szelenkov@nginx.com 'Host': 'localhost', 3201158Szelenkov@nginx.com 'Upgrade': 'websocket', 3211158Szelenkov@nginx.com 'Connection': 'Upgrade', 3221158Szelenkov@nginx.com 'Sec-WebSocket-Key': key, 3231158Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 3241262Szelenkov@nginx.com } 3251158Szelenkov@nginx.com ) 3261262Szelenkov@nginx.com sock.close() 3271158Szelenkov@nginx.com 3281596Szelenkov@nginx.com assert resp['status'] == 101, 'status' 3291596Szelenkov@nginx.com assert resp['headers']['Upgrade'] == 'websocket', 'upgrade' 3301596Szelenkov@nginx.com assert resp['headers']['Connection'] == 'Upgrade', 'connection' 3311596Szelenkov@nginx.com assert resp['headers']['Sec-WebSocket-Accept'] == self.ws.accept( 3321596Szelenkov@nginx.com key 3331596Szelenkov@nginx.com ), 'key' 3341158Szelenkov@nginx.com 3351158Szelenkov@nginx.com # autobahn-testsuite 3361158Szelenkov@nginx.com # 3371158Szelenkov@nginx.com # Some following tests fail because of Unit does not support UTF-8 3381158Szelenkov@nginx.com # validation for websocket frames. It should be implemented 3391158Szelenkov@nginx.com # by application, if necessary. 3401158Szelenkov@nginx.com 3411158Szelenkov@nginx.com def test_java_websockets_1_1_1__1_1_8(self): 3421158Szelenkov@nginx.com self.load('websockets_mirror') 3431158Szelenkov@nginx.com 3441158Szelenkov@nginx.com opcode = self.ws.OP_TEXT 3451158Szelenkov@nginx.com 3461158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 3471158Szelenkov@nginx.com 3481158Szelenkov@nginx.com def check_length(length, chopsize=None): 3491158Szelenkov@nginx.com payload = '*' * length 3501158Szelenkov@nginx.com 3511158Szelenkov@nginx.com self.ws.frame_write(sock, opcode, payload, chopsize=chopsize) 3521158Szelenkov@nginx.com 3531158Szelenkov@nginx.com frame = self.ws.message_read(sock) 3541158Szelenkov@nginx.com self.check_frame(frame, True, opcode, payload) 3551158Szelenkov@nginx.com 3561848Szelenkov@nginx.com check_length(0) # 1_1_1 3571848Szelenkov@nginx.com check_length(125) # 1_1_2 3581848Szelenkov@nginx.com check_length(126) # 1_1_3 3591848Szelenkov@nginx.com check_length(127) # 1_1_4 3601848Szelenkov@nginx.com check_length(128) # 1_1_5 3611848Szelenkov@nginx.com check_length(65535) # 1_1_6 3621848Szelenkov@nginx.com check_length(65536) # 1_1_7 3631848Szelenkov@nginx.com check_length(65536, chopsize=997) # 1_1_8 3641158Szelenkov@nginx.com 3651158Szelenkov@nginx.com self.close_connection(sock) 3661158Szelenkov@nginx.com 3671158Szelenkov@nginx.com def test_java_websockets_1_2_1__1_2_8(self): 3681158Szelenkov@nginx.com self.load('websockets_mirror') 3691158Szelenkov@nginx.com 3701158Szelenkov@nginx.com opcode = self.ws.OP_BINARY 3711158Szelenkov@nginx.com 3721158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 3731158Szelenkov@nginx.com 3741158Szelenkov@nginx.com def check_length(length, chopsize=None): 3751158Szelenkov@nginx.com payload = b'\xfe' * length 3761158Szelenkov@nginx.com 3771158Szelenkov@nginx.com self.ws.frame_write(sock, opcode, payload, chopsize=chopsize) 3781158Szelenkov@nginx.com 3791158Szelenkov@nginx.com frame = self.ws.message_read(sock) 3801158Szelenkov@nginx.com self.check_frame(frame, True, opcode, payload) 3811158Szelenkov@nginx.com 3821848Szelenkov@nginx.com check_length(0) # 1_2_1 3831848Szelenkov@nginx.com check_length(125) # 1_2_2 3841848Szelenkov@nginx.com check_length(126) # 1_2_3 3851848Szelenkov@nginx.com check_length(127) # 1_2_4 3861848Szelenkov@nginx.com check_length(128) # 1_2_5 3871848Szelenkov@nginx.com check_length(65535) # 1_2_6 3881848Szelenkov@nginx.com check_length(65536) # 1_2_7 3891848Szelenkov@nginx.com check_length(65536, chopsize=997) # 1_2_8 3901158Szelenkov@nginx.com 3911158Szelenkov@nginx.com self.close_connection(sock) 3921158Szelenkov@nginx.com 3931158Szelenkov@nginx.com def test_java_websockets_2_1__2_6(self): 3941158Szelenkov@nginx.com self.load('websockets_mirror') 3951158Szelenkov@nginx.com 3961158Szelenkov@nginx.com op_ping = self.ws.OP_PING 3971158Szelenkov@nginx.com op_pong = self.ws.OP_PONG 3981158Szelenkov@nginx.com 3991158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 4001158Szelenkov@nginx.com 4011158Szelenkov@nginx.com def check_ping(payload, chopsize=None, decode=True): 4021158Szelenkov@nginx.com self.ws.frame_write(sock, op_ping, payload, chopsize=chopsize) 4031158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 4041158Szelenkov@nginx.com 4051158Szelenkov@nginx.com self.check_frame(frame, True, op_pong, payload, decode=decode) 4061158Szelenkov@nginx.com 4071848Szelenkov@nginx.com check_ping('') # 2_1 4081848Szelenkov@nginx.com check_ping('Hello, world!') # 2_2 4091158Szelenkov@nginx.com check_ping(b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff', decode=False) # 2_3 4101848Szelenkov@nginx.com check_ping(b'\xfe' * 125, decode=False) # 2_4 4111848Szelenkov@nginx.com check_ping(b'\xfe' * 125, chopsize=1, decode=False) # 2_6 4121158Szelenkov@nginx.com 4131158Szelenkov@nginx.com self.close_connection(sock) 4141158Szelenkov@nginx.com 4151158Szelenkov@nginx.com # 2_5 4161158Szelenkov@nginx.com 4171158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 4181158Szelenkov@nginx.com 4191158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, b'\xfe' * 126) 4201158Szelenkov@nginx.com self.check_close(sock, 1002) 4211158Szelenkov@nginx.com 4221158Szelenkov@nginx.com def test_java_websockets_2_7__2_9(self): 4231158Szelenkov@nginx.com self.load('websockets_mirror') 4241158Szelenkov@nginx.com 4251158Szelenkov@nginx.com # 2_7 4261158Szelenkov@nginx.com 4271158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 4281158Szelenkov@nginx.com 4291158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PONG, '') 4301596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', '2_7' 4311158Szelenkov@nginx.com 4321158Szelenkov@nginx.com # 2_8 4331158Szelenkov@nginx.com 4341158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PONG, 'unsolicited pong payload') 4351596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', '2_8' 4361158Szelenkov@nginx.com 4371158Szelenkov@nginx.com # 2_9 4381158Szelenkov@nginx.com 4391158Szelenkov@nginx.com payload = 'ping payload' 4401158Szelenkov@nginx.com 4411158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PONG, 'unsolicited pong payload') 4421158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, payload) 4431158Szelenkov@nginx.com 4441158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 4451158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, payload) 4461158Szelenkov@nginx.com 4471158Szelenkov@nginx.com self.close_connection(sock) 4481158Szelenkov@nginx.com 4491158Szelenkov@nginx.com def test_java_websockets_2_10__2_11(self): 4501158Szelenkov@nginx.com self.load('websockets_mirror') 4511158Szelenkov@nginx.com 4521158Szelenkov@nginx.com # 2_10 4531158Szelenkov@nginx.com 4541158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 4551158Szelenkov@nginx.com 4561158Szelenkov@nginx.com for i in range(0, 10): 4571158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'payload-%d' % i) 4581158Szelenkov@nginx.com 4591158Szelenkov@nginx.com for i in range(0, 10): 4601158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 4611158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, 'payload-%d' % i) 4621158Szelenkov@nginx.com 4631158Szelenkov@nginx.com # 2_11 4641158Szelenkov@nginx.com 4651158Szelenkov@nginx.com for i in range(0, 10): 4661158Szelenkov@nginx.com opcode = self.ws.OP_PING 4671158Szelenkov@nginx.com self.ws.frame_write(sock, opcode, 'payload-%d' % i, chopsize=1) 4681158Szelenkov@nginx.com 4691158Szelenkov@nginx.com for i in range(0, 10): 4701158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 4711158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, 'payload-%d' % i) 4721158Szelenkov@nginx.com 4731158Szelenkov@nginx.com self.close_connection(sock) 4741158Szelenkov@nginx.com 4751596Szelenkov@nginx.com @pytest.mark.skip('not yet') 4761158Szelenkov@nginx.com def test_java_websockets_3_1__3_7(self): 4771158Szelenkov@nginx.com self.load('websockets_mirror') 4781158Szelenkov@nginx.com 4791158Szelenkov@nginx.com payload = 'Hello, world!' 4801158Szelenkov@nginx.com 4811158Szelenkov@nginx.com # 3_1 4821158Szelenkov@nginx.com 4831158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 4841158Szelenkov@nginx.com 4851158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload, rsv1=True) 4861158Szelenkov@nginx.com self.check_close(sock, 1002) 4871158Szelenkov@nginx.com 4881158Szelenkov@nginx.com # 3_2 4891158Szelenkov@nginx.com 4901158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 4911158Szelenkov@nginx.com 4921158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 4931158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload, rsv2=True) 4941158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 4951158Szelenkov@nginx.com 4961158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 4971158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 4981158Szelenkov@nginx.com 4991158Szelenkov@nginx.com self.check_close(sock, 1002, no_close=True) 5001158Szelenkov@nginx.com 5011596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', 'empty 3_2' 5021158Szelenkov@nginx.com sock.close() 5031158Szelenkov@nginx.com 5041158Szelenkov@nginx.com # 3_3 5051158Szelenkov@nginx.com 5061158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5071158Szelenkov@nginx.com 5081158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 5091158Szelenkov@nginx.com 5101158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 5111158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 5121158Szelenkov@nginx.com 5131158Szelenkov@nginx.com self.ws.frame_write( 5141158Szelenkov@nginx.com sock, self.ws.OP_TEXT, payload, rsv1=True, rsv2=True 5151158Szelenkov@nginx.com ) 5161158Szelenkov@nginx.com 5171158Szelenkov@nginx.com self.check_close(sock, 1002, no_close=True) 5181158Szelenkov@nginx.com 5191596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', 'empty 3_3' 5201158Szelenkov@nginx.com sock.close() 5211158Szelenkov@nginx.com 5221158Szelenkov@nginx.com # 3_4 5231158Szelenkov@nginx.com 5241158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5251158Szelenkov@nginx.com 5261158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1) 5271158Szelenkov@nginx.com self.ws.frame_write( 5281158Szelenkov@nginx.com sock, self.ws.OP_TEXT, payload, rsv3=True, chopsize=1 5291158Szelenkov@nginx.com ) 5301158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 5311158Szelenkov@nginx.com 5321158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 5331158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 5341158Szelenkov@nginx.com 5351158Szelenkov@nginx.com self.check_close(sock, 1002, no_close=True) 5361158Szelenkov@nginx.com 5371596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', 'empty 3_4' 5381158Szelenkov@nginx.com sock.close() 5391158Szelenkov@nginx.com 5401158Szelenkov@nginx.com # 3_5 5411158Szelenkov@nginx.com 5421158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5431158Szelenkov@nginx.com 5441158Szelenkov@nginx.com self.ws.frame_write( 5451158Szelenkov@nginx.com sock, 5461158Szelenkov@nginx.com self.ws.OP_BINARY, 5471158Szelenkov@nginx.com b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff', 5481158Szelenkov@nginx.com rsv1=True, 5491158Szelenkov@nginx.com rsv3=True, 5501158Szelenkov@nginx.com ) 5511158Szelenkov@nginx.com 5521158Szelenkov@nginx.com self.check_close(sock, 1002) 5531158Szelenkov@nginx.com 5541158Szelenkov@nginx.com # 3_6 5551158Szelenkov@nginx.com 5561158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5571158Szelenkov@nginx.com 5581158Szelenkov@nginx.com self.ws.frame_write( 5591158Szelenkov@nginx.com sock, self.ws.OP_PING, payload, rsv2=True, rsv3=True 5601158Szelenkov@nginx.com ) 5611158Szelenkov@nginx.com 5621158Szelenkov@nginx.com self.check_close(sock, 1002) 5631158Szelenkov@nginx.com 5641158Szelenkov@nginx.com # 3_7 5651158Szelenkov@nginx.com 5661158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5671158Szelenkov@nginx.com 5681158Szelenkov@nginx.com self.ws.frame_write( 5691158Szelenkov@nginx.com sock, self.ws.OP_CLOSE, payload, rsv1=True, rsv2=True, rsv3=True 5701158Szelenkov@nginx.com ) 5711158Szelenkov@nginx.com 5721158Szelenkov@nginx.com self.check_close(sock, 1002) 5731158Szelenkov@nginx.com 5741158Szelenkov@nginx.com def test_java_websockets_4_1_1__4_2_5(self): 5751158Szelenkov@nginx.com self.load('websockets_mirror') 5761158Szelenkov@nginx.com 5771158Szelenkov@nginx.com payload = 'Hello, world!' 5781158Szelenkov@nginx.com 5791158Szelenkov@nginx.com # 4_1_1 5801158Szelenkov@nginx.com 5811158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5821158Szelenkov@nginx.com 5831158Szelenkov@nginx.com self.ws.frame_write(sock, 0x03, '') 5841158Szelenkov@nginx.com self.check_close(sock, 1002) 5851158Szelenkov@nginx.com 5861158Szelenkov@nginx.com # 4_1_2 5871158Szelenkov@nginx.com 5881158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5891158Szelenkov@nginx.com 5901158Szelenkov@nginx.com self.ws.frame_write(sock, 0x04, 'reserved opcode payload') 5911158Szelenkov@nginx.com self.check_close(sock, 1002) 5921158Szelenkov@nginx.com 5931158Szelenkov@nginx.com # 4_1_3 5941158Szelenkov@nginx.com 5951158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5961158Szelenkov@nginx.com 5971158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 5981158Szelenkov@nginx.com 5991158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 6001158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 6011158Szelenkov@nginx.com 6021158Szelenkov@nginx.com self.ws.frame_write(sock, 0x05, '') 6031158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 6041158Szelenkov@nginx.com 6051158Szelenkov@nginx.com self.check_close(sock, 1002) 6061158Szelenkov@nginx.com 6071158Szelenkov@nginx.com # 4_1_4 6081158Szelenkov@nginx.com 6091158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6101158Szelenkov@nginx.com 6111158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 6121158Szelenkov@nginx.com 6131158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 6141158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 6151158Szelenkov@nginx.com 6161158Szelenkov@nginx.com self.ws.frame_write(sock, 0x06, payload) 6171158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 6181158Szelenkov@nginx.com 6191158Szelenkov@nginx.com self.check_close(sock, 1002) 6201158Szelenkov@nginx.com 6211158Szelenkov@nginx.com # 4_1_5 6221158Szelenkov@nginx.com 6231158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6241158Szelenkov@nginx.com 6251158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1) 6261158Szelenkov@nginx.com 6271158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 6281158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 6291158Szelenkov@nginx.com 6301158Szelenkov@nginx.com self.ws.frame_write(sock, 0x07, payload, chopsize=1) 6311158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 6321158Szelenkov@nginx.com 6331158Szelenkov@nginx.com self.check_close(sock, 1002) 6341158Szelenkov@nginx.com 6351158Szelenkov@nginx.com # 4_2_1 6361158Szelenkov@nginx.com 6371158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6381158Szelenkov@nginx.com 6391158Szelenkov@nginx.com self.ws.frame_write(sock, 0x0B, '') 6401158Szelenkov@nginx.com self.check_close(sock, 1002) 6411158Szelenkov@nginx.com 6421158Szelenkov@nginx.com # 4_2_2 6431158Szelenkov@nginx.com 6441158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6451158Szelenkov@nginx.com 6461158Szelenkov@nginx.com self.ws.frame_write(sock, 0x0C, 'reserved opcode payload') 6471158Szelenkov@nginx.com self.check_close(sock, 1002) 6481158Szelenkov@nginx.com 6491158Szelenkov@nginx.com # 4_2_3 6501158Szelenkov@nginx.com 6511158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6521158Szelenkov@nginx.com 6531158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 6541158Szelenkov@nginx.com 6551158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 6561158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 6571158Szelenkov@nginx.com 6581158Szelenkov@nginx.com self.ws.frame_write(sock, 0x0D, '') 6591158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 6601158Szelenkov@nginx.com 6611158Szelenkov@nginx.com self.check_close(sock, 1002) 6621158Szelenkov@nginx.com 6631158Szelenkov@nginx.com # 4_2_4 6641158Szelenkov@nginx.com 6651158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6661158Szelenkov@nginx.com 6671158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 6681158Szelenkov@nginx.com 6691158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 6701158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 6711158Szelenkov@nginx.com 6721158Szelenkov@nginx.com self.ws.frame_write(sock, 0x0E, payload) 6731158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 6741158Szelenkov@nginx.com 6751158Szelenkov@nginx.com self.check_close(sock, 1002) 6761158Szelenkov@nginx.com 6771158Szelenkov@nginx.com # 4_2_5 6781158Szelenkov@nginx.com 6791158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6801158Szelenkov@nginx.com 6811158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1) 6821158Szelenkov@nginx.com 6831158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 6841158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 6851158Szelenkov@nginx.com 6861158Szelenkov@nginx.com self.ws.frame_write(sock, 0x0F, payload, chopsize=1) 6871158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 6881158Szelenkov@nginx.com 6891158Szelenkov@nginx.com self.check_close(sock, 1002) 6901158Szelenkov@nginx.com 6911158Szelenkov@nginx.com def test_java_websockets_5_1__5_20(self): 6921158Szelenkov@nginx.com self.load('websockets_mirror') 6931158Szelenkov@nginx.com 6941158Szelenkov@nginx.com # 5_1 6951158Szelenkov@nginx.com 6961158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6971158Szelenkov@nginx.com 6981158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'fragment1', fin=False) 6991158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 7001158Szelenkov@nginx.com self.check_close(sock, 1002) 7011158Szelenkov@nginx.com 7021158Szelenkov@nginx.com # 5_2 7031158Szelenkov@nginx.com 7041158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 7051158Szelenkov@nginx.com 7061158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PONG, 'fragment1', fin=False) 7071158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 7081158Szelenkov@nginx.com self.check_close(sock, 1002) 7091158Szelenkov@nginx.com 7101158Szelenkov@nginx.com # 5_3 7111158Szelenkov@nginx.com 7121158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 7131158Szelenkov@nginx.com 7141158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 7151158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 7161158Szelenkov@nginx.com 7171158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7181158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 7191158Szelenkov@nginx.com 7201158Szelenkov@nginx.com # 5_4 7211158Szelenkov@nginx.com 7221158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 7231596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', '5_4' 7241158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 7251158Szelenkov@nginx.com 7261158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7271158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 7281158Szelenkov@nginx.com 7291158Szelenkov@nginx.com # 5_5 7301158Szelenkov@nginx.com 7311158Szelenkov@nginx.com self.ws.frame_write( 7321158Szelenkov@nginx.com sock, self.ws.OP_TEXT, 'fragment1', fin=False, chopsize=1 7331158Szelenkov@nginx.com ) 7341158Szelenkov@nginx.com self.ws.frame_write( 7351158Szelenkov@nginx.com sock, self.ws.OP_CONT, 'fragment2', fin=True, chopsize=1 7361158Szelenkov@nginx.com ) 7371158Szelenkov@nginx.com 7381158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7391158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 7401158Szelenkov@nginx.com 7411158Szelenkov@nginx.com # 5_6 7421158Szelenkov@nginx.com 7431158Szelenkov@nginx.com ping_payload = 'ping payload' 7441158Szelenkov@nginx.com 7451158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 7461158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, ping_payload) 7471158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 7481158Szelenkov@nginx.com 7491158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7501158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, ping_payload) 7511158Szelenkov@nginx.com 7521158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7531158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 7541158Szelenkov@nginx.com 7551158Szelenkov@nginx.com # 5_7 7561158Szelenkov@nginx.com 7571158Szelenkov@nginx.com ping_payload = 'ping payload' 7581158Szelenkov@nginx.com 7591158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 7601596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', '5_7' 7611158Szelenkov@nginx.com 7621158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, ping_payload) 7631158Szelenkov@nginx.com 7641158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7651158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, ping_payload) 7661158Szelenkov@nginx.com 7671158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 7681158Szelenkov@nginx.com 7691158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7701158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 7711158Szelenkov@nginx.com 7721158Szelenkov@nginx.com # 5_8 7731158Szelenkov@nginx.com 7741158Szelenkov@nginx.com ping_payload = 'ping payload' 7751158Szelenkov@nginx.com 7761158Szelenkov@nginx.com self.ws.frame_write( 7771158Szelenkov@nginx.com sock, self.ws.OP_TEXT, 'fragment1', fin=False, chopsize=1 7781158Szelenkov@nginx.com ) 7791158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, ping_payload, chopsize=1) 7801158Szelenkov@nginx.com self.ws.frame_write( 7811158Szelenkov@nginx.com sock, self.ws.OP_CONT, 'fragment2', fin=True, chopsize=1 7821158Szelenkov@nginx.com ) 7831158Szelenkov@nginx.com 7841158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7851158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, ping_payload) 7861158Szelenkov@nginx.com 7871158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7881158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 7891158Szelenkov@nginx.com 7901158Szelenkov@nginx.com # 5_9 7911158Szelenkov@nginx.com 7921158Szelenkov@nginx.com self.ws.frame_write( 7931158Szelenkov@nginx.com sock, self.ws.OP_CONT, 'non-continuation payload', fin=True 7941158Szelenkov@nginx.com ) 7951158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True) 7961158Szelenkov@nginx.com self.check_close(sock, 1002) 7971158Szelenkov@nginx.com 7981158Szelenkov@nginx.com # 5_10 7991158Szelenkov@nginx.com 8001158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8011158Szelenkov@nginx.com 8021158Szelenkov@nginx.com self.ws.frame_write( 8031158Szelenkov@nginx.com sock, self.ws.OP_CONT, 'non-continuation payload', fin=True 8041158Szelenkov@nginx.com ) 8051158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True) 8061158Szelenkov@nginx.com self.check_close(sock, 1002) 8071158Szelenkov@nginx.com 8081158Szelenkov@nginx.com # 5_11 8091158Szelenkov@nginx.com 8101158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8111158Szelenkov@nginx.com 8121158Szelenkov@nginx.com self.ws.frame_write( 8131158Szelenkov@nginx.com sock, 8141158Szelenkov@nginx.com self.ws.OP_CONT, 8151158Szelenkov@nginx.com 'non-continuation payload', 8161158Szelenkov@nginx.com fin=True, 8171158Szelenkov@nginx.com chopsize=1, 8181158Szelenkov@nginx.com ) 8191158Szelenkov@nginx.com self.ws.frame_write( 8201158Szelenkov@nginx.com sock, self.ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1 8211158Szelenkov@nginx.com ) 8221158Szelenkov@nginx.com self.check_close(sock, 1002) 8231158Szelenkov@nginx.com 8241158Szelenkov@nginx.com # 5_12 8251158Szelenkov@nginx.com 8261158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8271158Szelenkov@nginx.com 8281158Szelenkov@nginx.com self.ws.frame_write( 8291158Szelenkov@nginx.com sock, self.ws.OP_CONT, 'non-continuation payload', fin=False 8301158Szelenkov@nginx.com ) 8311158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True) 8321158Szelenkov@nginx.com self.check_close(sock, 1002) 8331158Szelenkov@nginx.com 8341158Szelenkov@nginx.com # 5_13 8351158Szelenkov@nginx.com 8361158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8371158Szelenkov@nginx.com 8381158Szelenkov@nginx.com self.ws.frame_write( 8391158Szelenkov@nginx.com sock, self.ws.OP_CONT, 'non-continuation payload', fin=False 8401158Szelenkov@nginx.com ) 8411158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True) 8421158Szelenkov@nginx.com self.check_close(sock, 1002) 8431158Szelenkov@nginx.com 8441158Szelenkov@nginx.com # 5_14 8451158Szelenkov@nginx.com 8461158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8471158Szelenkov@nginx.com 8481158Szelenkov@nginx.com self.ws.frame_write( 8491158Szelenkov@nginx.com sock, 8501158Szelenkov@nginx.com self.ws.OP_CONT, 8511158Szelenkov@nginx.com 'non-continuation payload', 8521158Szelenkov@nginx.com fin=False, 8531158Szelenkov@nginx.com chopsize=1, 8541158Szelenkov@nginx.com ) 8551158Szelenkov@nginx.com self.ws.frame_write( 8561158Szelenkov@nginx.com sock, self.ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1 8571158Szelenkov@nginx.com ) 8581158Szelenkov@nginx.com self.check_close(sock, 1002) 8591158Szelenkov@nginx.com 8601158Szelenkov@nginx.com # 5_15 8611158Szelenkov@nginx.com 8621158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8631158Szelenkov@nginx.com 8641158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 8651158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 8661158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False) 8671158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment4', fin=True) 8681819Smax.romanov@nginx.com 8691819Smax.romanov@nginx.com frame = self.ws.frame_read(sock) 8701819Smax.romanov@nginx.com 8711819Smax.romanov@nginx.com if frame['opcode'] == self.ws.OP_TEXT: 872*2073Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 8731819Smax.romanov@nginx.com frame = None 8741819Smax.romanov@nginx.com 8751819Smax.romanov@nginx.com self.check_close(sock, 1002, frame=frame) 8761158Szelenkov@nginx.com 8771158Szelenkov@nginx.com # 5_16 8781158Szelenkov@nginx.com 8791158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8801158Szelenkov@nginx.com 8811158Szelenkov@nginx.com for i in range(0, 2): 8821158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment1', fin=False) 8831158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2', fin=False) 8841158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=True) 8851158Szelenkov@nginx.com self.check_close(sock, 1002) 8861158Szelenkov@nginx.com 8871158Szelenkov@nginx.com # 5_17 8881158Szelenkov@nginx.com 8891158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8901158Szelenkov@nginx.com 8911158Szelenkov@nginx.com for i in range(0, 2): 8921158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment1', fin=True) 8931158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2', fin=False) 8941158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=True) 8951158Szelenkov@nginx.com self.check_close(sock, 1002) 8961158Szelenkov@nginx.com 8971158Szelenkov@nginx.com # 5_18 8981158Szelenkov@nginx.com 8991158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 9001158Szelenkov@nginx.com 9011158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 9021158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2') 9031158Szelenkov@nginx.com self.check_close(sock, 1002) 9041158Szelenkov@nginx.com 9051158Szelenkov@nginx.com # 5_19 9061158Szelenkov@nginx.com 9071158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 9081158Szelenkov@nginx.com 9091158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 9101158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=False) 9111158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 1!') 9121158Szelenkov@nginx.com 9131158Szelenkov@nginx.com time.sleep(1) 9141158Szelenkov@nginx.com 9151158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False) 9161158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment4', fin=False) 9171158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 2!') 9181158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment5') 9191158Szelenkov@nginx.com 9201158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 9211158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 1!') 9221158Szelenkov@nginx.com 9231158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 9241158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 2!') 9251158Szelenkov@nginx.com 9261158Szelenkov@nginx.com self.check_frame( 9271158Szelenkov@nginx.com self.ws.frame_read(sock), 9281158Szelenkov@nginx.com True, 9291158Szelenkov@nginx.com self.ws.OP_TEXT, 9301158Szelenkov@nginx.com 'fragment1fragment2fragment3fragment4fragment5', 9311158Szelenkov@nginx.com ) 9321158Szelenkov@nginx.com 9331158Szelenkov@nginx.com # 5_20 9341158Szelenkov@nginx.com 9351158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 9361158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=False) 9371158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 1!') 9381158Szelenkov@nginx.com 9391158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 9401158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 1!') 9411158Szelenkov@nginx.com 9421158Szelenkov@nginx.com time.sleep(1) 9431158Szelenkov@nginx.com 9441158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False) 9451158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment4', fin=False) 9461158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 2!') 9471158Szelenkov@nginx.com 9481158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 9491158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 2!') 9501158Szelenkov@nginx.com 9511596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', '5_20' 9521158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment5') 9531158Szelenkov@nginx.com 9541158Szelenkov@nginx.com self.check_frame( 9551158Szelenkov@nginx.com self.ws.frame_read(sock), 9561158Szelenkov@nginx.com True, 9571158Szelenkov@nginx.com self.ws.OP_TEXT, 9581158Szelenkov@nginx.com 'fragment1fragment2fragment3fragment4fragment5', 9591158Szelenkov@nginx.com ) 9601158Szelenkov@nginx.com 9611158Szelenkov@nginx.com self.close_connection(sock) 9621158Szelenkov@nginx.com 9631158Szelenkov@nginx.com def test_java_websockets_6_1_1__6_4_4(self): 9641158Szelenkov@nginx.com self.load('websockets_mirror') 9651158Szelenkov@nginx.com 9661158Szelenkov@nginx.com # 6_1_1 9671158Szelenkov@nginx.com 9681158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 9691158Szelenkov@nginx.com 9701158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, '') 9711158Szelenkov@nginx.com frame = self.ws.frame_read(sock, read_timeout=3) 9721158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, '') 9731158Szelenkov@nginx.com 9741158Szelenkov@nginx.com # 6_1_2 9751158Szelenkov@nginx.com 9761158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, '', fin=False) 9771158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, '', fin=False) 9781158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, '') 9791158Szelenkov@nginx.com 9801158Szelenkov@nginx.com frame = self.ws.frame_read(sock, read_timeout=3) 9811158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, '') 9821158Szelenkov@nginx.com 9831158Szelenkov@nginx.com # 6_1_3 9841158Szelenkov@nginx.com 9851158Szelenkov@nginx.com payload = 'middle frame payload' 9861158Szelenkov@nginx.com 9871158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, '', fin=False) 9881158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, payload, fin=False) 9891158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, '') 9901158Szelenkov@nginx.com 9911158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 9921158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 9931158Szelenkov@nginx.com 9941158Szelenkov@nginx.com # 6_2_1 9951158Szelenkov@nginx.com 9961158Szelenkov@nginx.com payload = 'Hello-µ@ßöäüàá-UTF-8!!' 9971158Szelenkov@nginx.com 9981158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 9991158Szelenkov@nginx.com 10001158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 10011158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 10021158Szelenkov@nginx.com 10031158Szelenkov@nginx.com # 6_2_2 10041158Szelenkov@nginx.com 10051158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload[:12], fin=False) 10061158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, payload[12:]) 10071158Szelenkov@nginx.com 10081158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 10091158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 10101158Szelenkov@nginx.com 10111158Szelenkov@nginx.com # 6_2_3 10121158Szelenkov@nginx.com 10131158Szelenkov@nginx.com self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1) 10141158Szelenkov@nginx.com 10151158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 10161158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 10171158Szelenkov@nginx.com 10181158Szelenkov@nginx.com # 6_2_4 10191158Szelenkov@nginx.com 10201158Szelenkov@nginx.com payload = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5' 10211158Szelenkov@nginx.com 10221158Szelenkov@nginx.com self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1) 10231158Szelenkov@nginx.com 10241158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 10251158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 10261158Szelenkov@nginx.com 10271158Szelenkov@nginx.com self.close_connection(sock) 10281158Szelenkov@nginx.com 10291848Szelenkov@nginx.com # Unit does not support UTF-8 validation 10301848Szelenkov@nginx.com # 10311848Szelenkov@nginx.com # # 6_3_1 FAIL 10321848Szelenkov@nginx.com # 10331848Szelenkov@nginx.com # payload_1 = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5' 10341848Szelenkov@nginx.com # payload_2 = '\xed\xa0\x80' 10351848Szelenkov@nginx.com # payload_3 = '\x65\x64\x69\x74\x65\x64' 10361848Szelenkov@nginx.com # 10371848Szelenkov@nginx.com # payload = payload_1 + payload_2 + payload_3 10381848Szelenkov@nginx.com # 10391848Szelenkov@nginx.com # self.ws.message(sock, self.ws.OP_TEXT, payload) 10401848Szelenkov@nginx.com # self.check_close(sock, 1007) 10411848Szelenkov@nginx.com # 10421848Szelenkov@nginx.com # # 6_3_2 FAIL 10431848Szelenkov@nginx.com # 10441848Szelenkov@nginx.com # _, sock, _ = self.ws.upgrade() 10451848Szelenkov@nginx.com # 10461848Szelenkov@nginx.com # self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1) 10471848Szelenkov@nginx.com # self.check_close(sock, 1007) 10481848Szelenkov@nginx.com # 10491848Szelenkov@nginx.com # # 6_4_1 ... 6_4_4 FAIL 10501158Szelenkov@nginx.com 10511158Szelenkov@nginx.com def test_java_websockets_7_1_1__7_5_1(self): 10521158Szelenkov@nginx.com self.load('websockets_mirror') 10531158Szelenkov@nginx.com 10541158Szelenkov@nginx.com # 7_1_1 10551158Szelenkov@nginx.com 10561158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 10571158Szelenkov@nginx.com 10581158Szelenkov@nginx.com payload = "Hello World!" 10591158Szelenkov@nginx.com 10601158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 10611158Szelenkov@nginx.com 10621158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 10631158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 10641158Szelenkov@nginx.com 10651158Szelenkov@nginx.com self.close_connection(sock) 10661158Szelenkov@nginx.com 10671158Szelenkov@nginx.com # 7_1_2 10681158Szelenkov@nginx.com 10691158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 10701158Szelenkov@nginx.com 10711158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 10721158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 10731158Szelenkov@nginx.com 10741158Szelenkov@nginx.com self.check_close(sock) 10751158Szelenkov@nginx.com 10761158Szelenkov@nginx.com # 7_1_3 10771158Szelenkov@nginx.com 10781158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 10791158Szelenkov@nginx.com 10801158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 10811158Szelenkov@nginx.com self.check_close(sock, no_close=True) 10821158Szelenkov@nginx.com 10831158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 10841596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 10851158Szelenkov@nginx.com 10861158Szelenkov@nginx.com sock.close() 10871158Szelenkov@nginx.com 10881158Szelenkov@nginx.com # 7_1_4 10891158Szelenkov@nginx.com 10901158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 10911158Szelenkov@nginx.com 10921158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 10931158Szelenkov@nginx.com self.check_close(sock, no_close=True) 10941158Szelenkov@nginx.com 10951158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 10961596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 10971158Szelenkov@nginx.com 10981158Szelenkov@nginx.com sock.close() 10991158Szelenkov@nginx.com 11001158Szelenkov@nginx.com # 7_1_5 11011158Szelenkov@nginx.com 11021158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11031158Szelenkov@nginx.com 11041158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 11051158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 11061158Szelenkov@nginx.com self.check_close(sock, no_close=True) 11071158Szelenkov@nginx.com 11081158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2') 11091596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 11101158Szelenkov@nginx.com 11111158Szelenkov@nginx.com sock.close() 11121158Szelenkov@nginx.com 11131158Szelenkov@nginx.com # 7_1_6 11141158Szelenkov@nginx.com 11151158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11161158Szelenkov@nginx.com 1117*2073Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'BAsd7&jh23' * 26 * 2**10) 11181158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 11191158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 11201158Szelenkov@nginx.com 11211158Szelenkov@nginx.com self.recvall(sock, read_timeout=1) 11221158Szelenkov@nginx.com 11231158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 11241596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 11251158Szelenkov@nginx.com 11261158Szelenkov@nginx.com sock.close() 11271158Szelenkov@nginx.com 11281262Szelenkov@nginx.com # 7_3_1 11291158Szelenkov@nginx.com 11301158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11311158Szelenkov@nginx.com 11321158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, '') 11331158Szelenkov@nginx.com self.check_close(sock) 11341158Szelenkov@nginx.com 11351158Szelenkov@nginx.com # 7_3_2 11361158Szelenkov@nginx.com 11371158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11381158Szelenkov@nginx.com 11391158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, 'a') 11401158Szelenkov@nginx.com self.check_close(sock, 1002) 11411158Szelenkov@nginx.com 11421158Szelenkov@nginx.com # 7_3_3 11431158Szelenkov@nginx.com 11441158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11451158Szelenkov@nginx.com 11461158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 11471158Szelenkov@nginx.com self.check_close(sock) 11481158Szelenkov@nginx.com 11491158Szelenkov@nginx.com # 7_3_4 11501158Szelenkov@nginx.com 11511158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11521158Szelenkov@nginx.com 11531158Szelenkov@nginx.com payload = self.ws.serialize_close(reason='Hello World!') 11541158Szelenkov@nginx.com 11551158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 11561158Szelenkov@nginx.com self.check_close(sock) 11571158Szelenkov@nginx.com 11581158Szelenkov@nginx.com # 7_3_5 11591158Szelenkov@nginx.com 11601158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11611158Szelenkov@nginx.com 11621158Szelenkov@nginx.com payload = self.ws.serialize_close(reason='*' * 123) 11631158Szelenkov@nginx.com 11641158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 11651158Szelenkov@nginx.com self.check_close(sock) 11661158Szelenkov@nginx.com 11671158Szelenkov@nginx.com # 7_3_6 11681158Szelenkov@nginx.com 11691158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11701158Szelenkov@nginx.com 11711158Szelenkov@nginx.com payload = self.ws.serialize_close(reason='*' * 124) 11721158Szelenkov@nginx.com 11731158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 11741158Szelenkov@nginx.com self.check_close(sock, 1002) 11751158Szelenkov@nginx.com 11761848Szelenkov@nginx.com # # 7_5_1 FAIL Unit does not support UTF-8 validation 11771848Szelenkov@nginx.com # 11781848Szelenkov@nginx.com # _, sock, _ = self.ws.upgrade() 11791848Szelenkov@nginx.com # 11801848Szelenkov@nginx.com # payload = self.ws.serialize_close(reason = '\xce\xba\xe1\xbd\xb9\xcf' \ 11811848Szelenkov@nginx.com # '\x83\xce\xbc\xce\xb5\xed\xa0\x80\x65\x64\x69\x74\x65\x64') 11821848Szelenkov@nginx.com # 11831848Szelenkov@nginx.com # self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 11841848Szelenkov@nginx.com # self.check_close(sock, 1007) 11851158Szelenkov@nginx.com 11861158Szelenkov@nginx.com def test_java_websockets_7_7_X__7_9_X(self): 11871158Szelenkov@nginx.com self.load('websockets_mirror') 11881158Szelenkov@nginx.com 11891158Szelenkov@nginx.com valid_codes = [ 11901158Szelenkov@nginx.com 1000, 11911158Szelenkov@nginx.com 1001, 11921158Szelenkov@nginx.com 1002, 11931158Szelenkov@nginx.com 1003, 11941158Szelenkov@nginx.com 1007, 11951158Szelenkov@nginx.com 1008, 11961158Szelenkov@nginx.com 1009, 11971158Szelenkov@nginx.com 1010, 11981158Szelenkov@nginx.com 1011, 11991158Szelenkov@nginx.com 3000, 12001158Szelenkov@nginx.com 3999, 12011158Szelenkov@nginx.com 4000, 12021158Szelenkov@nginx.com 4999, 12031158Szelenkov@nginx.com ] 12041158Szelenkov@nginx.com 12051158Szelenkov@nginx.com invalid_codes = [0, 999, 1004, 1005, 1006, 1016, 1100, 2000, 2999] 12061158Szelenkov@nginx.com 12071158Szelenkov@nginx.com for code in valid_codes: 12081158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 12091158Szelenkov@nginx.com 12101158Szelenkov@nginx.com payload = self.ws.serialize_close(code=code) 12111158Szelenkov@nginx.com 12121158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 12131158Szelenkov@nginx.com self.check_close(sock, code=code) 12141158Szelenkov@nginx.com 12151158Szelenkov@nginx.com for code in invalid_codes: 12161158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 12171158Szelenkov@nginx.com 12181158Szelenkov@nginx.com payload = self.ws.serialize_close(code=code) 12191158Szelenkov@nginx.com 12201158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 12211158Szelenkov@nginx.com self.check_close(sock, 1002) 12221158Szelenkov@nginx.com 12231158Szelenkov@nginx.com def test_java_websockets_7_13_1__7_13_2(self): 12241158Szelenkov@nginx.com self.load('websockets_mirror') 12251158Szelenkov@nginx.com 12261158Szelenkov@nginx.com # 7_13_1 12271158Szelenkov@nginx.com 12281158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 12291158Szelenkov@nginx.com 12301158Szelenkov@nginx.com payload = self.ws.serialize_close(code=5000) 12311158Szelenkov@nginx.com 12321158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 12331158Szelenkov@nginx.com self.check_close(sock, 1002) 12341158Szelenkov@nginx.com 12351158Szelenkov@nginx.com # 7_13_2 12361158Szelenkov@nginx.com 12371158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 12381158Szelenkov@nginx.com 12391158Szelenkov@nginx.com payload = struct.pack('!I', 65536) + ''.encode('utf-8') 12401158Szelenkov@nginx.com 12411158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 12421158Szelenkov@nginx.com self.check_close(sock, 1002) 12431158Szelenkov@nginx.com 12441596Szelenkov@nginx.com def test_java_websockets_9_1_1__9_6_6(self, is_unsafe): 12451596Szelenkov@nginx.com if not is_unsafe: 12461596Szelenkov@nginx.com pytest.skip('unsafe, long run') 12471158Szelenkov@nginx.com 12481158Szelenkov@nginx.com self.load('websockets_mirror') 12491158Szelenkov@nginx.com 12501596Szelenkov@nginx.com assert 'success' in self.conf( 12511596Szelenkov@nginx.com { 12521596Szelenkov@nginx.com 'http': { 12531596Szelenkov@nginx.com 'websocket': { 12541596Szelenkov@nginx.com 'max_frame_size': 33554432, 12551596Szelenkov@nginx.com 'keepalive_interval': 0, 12561158Szelenkov@nginx.com } 12571596Szelenkov@nginx.com } 12581596Szelenkov@nginx.com }, 12591596Szelenkov@nginx.com 'settings', 12601596Szelenkov@nginx.com ), 'increase max_frame_size and keepalive_interval' 12611158Szelenkov@nginx.com 12621158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 12631158Szelenkov@nginx.com 12641158Szelenkov@nginx.com op_text = self.ws.OP_TEXT 12651158Szelenkov@nginx.com op_binary = self.ws.OP_BINARY 12661158Szelenkov@nginx.com 12671158Szelenkov@nginx.com def check_payload(opcode, length, chopsize=None): 12681158Szelenkov@nginx.com if opcode == self.ws.OP_TEXT: 12691158Szelenkov@nginx.com payload = '*' * length 12701158Szelenkov@nginx.com else: 12711158Szelenkov@nginx.com payload = b'*' * length 12721158Szelenkov@nginx.com 12731158Szelenkov@nginx.com self.ws.frame_write(sock, opcode, payload, chopsize=chopsize) 12741158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 12751158Szelenkov@nginx.com self.check_frame(frame, True, opcode, payload) 12761158Szelenkov@nginx.com 12771158Szelenkov@nginx.com def check_message(opcode, f_size): 12781158Szelenkov@nginx.com if opcode == self.ws.OP_TEXT: 1279*2073Szelenkov@nginx.com payload = '*' * 4 * 2**20 12801158Szelenkov@nginx.com else: 1281*2073Szelenkov@nginx.com payload = b'*' * 4 * 2**20 12821158Szelenkov@nginx.com 12831158Szelenkov@nginx.com self.ws.message(sock, opcode, payload, fragmention_size=f_size) 12841158Szelenkov@nginx.com frame = self.ws.frame_read(sock, read_timeout=5) 12851158Szelenkov@nginx.com self.check_frame(frame, True, opcode, payload) 12861158Szelenkov@nginx.com 1287*2073Szelenkov@nginx.com check_payload(op_text, 64 * 2**10) # 9_1_1 1288*2073Szelenkov@nginx.com check_payload(op_text, 256 * 2**10) # 9_1_2 1289*2073Szelenkov@nginx.com check_payload(op_text, 2**20) # 9_1_3 1290*2073Szelenkov@nginx.com check_payload(op_text, 4 * 2**20) # 9_1_4 1291*2073Szelenkov@nginx.com check_payload(op_text, 8 * 2**20) # 9_1_5 1292*2073Szelenkov@nginx.com check_payload(op_text, 16 * 2**20) # 9_1_6 12931158Szelenkov@nginx.com 1294*2073Szelenkov@nginx.com check_payload(op_binary, 64 * 2**10) # 9_2_1 1295*2073Szelenkov@nginx.com check_payload(op_binary, 256 * 2**10) # 9_2_2 1296*2073Szelenkov@nginx.com check_payload(op_binary, 2**20) # 9_2_3 1297*2073Szelenkov@nginx.com check_payload(op_binary, 4 * 2**20) # 9_2_4 1298*2073Szelenkov@nginx.com check_payload(op_binary, 8 * 2**20) # 9_2_5 1299*2073Szelenkov@nginx.com check_payload(op_binary, 16 * 2**20) # 9_2_6 13001158Szelenkov@nginx.com 13011596Szelenkov@nginx.com if option.system != 'Darwin' and option.system != 'FreeBSD': 13021848Szelenkov@nginx.com check_message(op_text, 64) # 9_3_1 13031848Szelenkov@nginx.com check_message(op_text, 256) # 9_3_2 1304*2073Szelenkov@nginx.com check_message(op_text, 2**10) # 9_3_3 1305*2073Szelenkov@nginx.com check_message(op_text, 4 * 2**10) # 9_3_4 1306*2073Szelenkov@nginx.com check_message(op_text, 16 * 2**10) # 9_3_5 1307*2073Szelenkov@nginx.com check_message(op_text, 64 * 2**10) # 9_3_6 1308*2073Szelenkov@nginx.com check_message(op_text, 256 * 2**10) # 9_3_7 1309*2073Szelenkov@nginx.com check_message(op_text, 2**20) # 9_3_8 1310*2073Szelenkov@nginx.com check_message(op_text, 4 * 2**20) # 9_3_9 13111158Szelenkov@nginx.com 13121848Szelenkov@nginx.com check_message(op_binary, 64) # 9_4_1 13131848Szelenkov@nginx.com check_message(op_binary, 256) # 9_4_2 1314*2073Szelenkov@nginx.com check_message(op_binary, 2**10) # 9_4_3 1315*2073Szelenkov@nginx.com check_message(op_binary, 4 * 2**10) # 9_4_4 1316*2073Szelenkov@nginx.com check_message(op_binary, 16 * 2**10) # 9_4_5 1317*2073Szelenkov@nginx.com check_message(op_binary, 64 * 2**10) # 9_4_6 1318*2073Szelenkov@nginx.com check_message(op_binary, 256 * 2**10) # 9_4_7 1319*2073Szelenkov@nginx.com check_message(op_binary, 2**20) # 9_4_8 1320*2073Szelenkov@nginx.com check_message(op_binary, 4 * 2**20) # 9_4_9 13211158Szelenkov@nginx.com 1322*2073Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=64) # 9_5_1 1323*2073Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=128) # 9_5_2 1324*2073Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=256) # 9_5_3 1325*2073Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=512) # 9_5_4 1326*2073Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=1024) # 9_5_5 1327*2073Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=2048) # 9_5_6 13281158Szelenkov@nginx.com 1329*2073Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=64) # 9_6_1 1330*2073Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=128) # 9_6_2 1331*2073Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=256) # 9_6_3 1332*2073Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=512) # 9_6_4 1333*2073Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=1024) # 9_6_5 1334*2073Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=2048) # 9_6_6 13351158Szelenkov@nginx.com 13361158Szelenkov@nginx.com self.close_connection(sock) 13371158Szelenkov@nginx.com 13381158Szelenkov@nginx.com def test_java_websockets_10_1_1(self): 13391158Szelenkov@nginx.com self.load('websockets_mirror') 13401158Szelenkov@nginx.com 13411158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 13421158Szelenkov@nginx.com 13431158Szelenkov@nginx.com payload = '*' * 65536 13441158Szelenkov@nginx.com 13451158Szelenkov@nginx.com self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1300) 13461158Szelenkov@nginx.com 13471158Szelenkov@nginx.com frame = self.ws.message_read(sock) 13481158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 13491158Szelenkov@nginx.com 13501158Szelenkov@nginx.com self.close_connection(sock) 13511158Szelenkov@nginx.com 13521158Szelenkov@nginx.com # settings 13531158Szelenkov@nginx.com 13541158Szelenkov@nginx.com def test_java_websockets_max_frame_size(self): 13551158Szelenkov@nginx.com self.load('websockets_mirror') 13561158Szelenkov@nginx.com 13571596Szelenkov@nginx.com assert 'success' in self.conf( 13581596Szelenkov@nginx.com {'http': {'websocket': {'max_frame_size': 100}}}, 'settings' 13591596Szelenkov@nginx.com ), 'configure max_frame_size' 13601158Szelenkov@nginx.com 13611158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 13621158Szelenkov@nginx.com 13631158Szelenkov@nginx.com payload = '*' * 94 13641158Szelenkov@nginx.com opcode = self.ws.OP_TEXT 13651158Szelenkov@nginx.com 13661158Szelenkov@nginx.com self.ws.frame_write(sock, opcode, payload) # frame length is 100 13671158Szelenkov@nginx.com 13681158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 13691158Szelenkov@nginx.com self.check_frame(frame, True, opcode, payload) 13701158Szelenkov@nginx.com 13711158Szelenkov@nginx.com payload = '*' * 95 13721158Szelenkov@nginx.com 13731158Szelenkov@nginx.com self.ws.frame_write(sock, opcode, payload) # frame length is 101 13741158Szelenkov@nginx.com self.check_close(sock, 1009) # 1009 - CLOSE_TOO_LARGE 13751158Szelenkov@nginx.com 13761158Szelenkov@nginx.com def test_java_websockets_read_timeout(self): 13771158Szelenkov@nginx.com self.load('websockets_mirror') 13781158Szelenkov@nginx.com 13791596Szelenkov@nginx.com assert 'success' in self.conf( 13801596Szelenkov@nginx.com {'http': {'websocket': {'read_timeout': 5}}}, 'settings' 13811596Szelenkov@nginx.com ), 'configure read_timeout' 13821158Szelenkov@nginx.com 13831158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 13841158Szelenkov@nginx.com 13851158Szelenkov@nginx.com frame = self.ws.frame_to_send(self.ws.OP_TEXT, 'blah') 13861158Szelenkov@nginx.com sock.sendall(frame[:2]) 13871158Szelenkov@nginx.com 13881158Szelenkov@nginx.com time.sleep(2) 13891158Szelenkov@nginx.com 13901158Szelenkov@nginx.com self.check_close(sock, 1001) # 1001 - CLOSE_GOING_AWAY 13911158Szelenkov@nginx.com 13921158Szelenkov@nginx.com def test_java_websockets_keepalive_interval(self): 13931158Szelenkov@nginx.com self.load('websockets_mirror') 13941158Szelenkov@nginx.com 13951596Szelenkov@nginx.com assert 'success' in self.conf( 13961596Szelenkov@nginx.com {'http': {'websocket': {'keepalive_interval': 5}}}, 'settings' 13971596Szelenkov@nginx.com ), 'configure keepalive_interval' 13981158Szelenkov@nginx.com 13991158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 14001158Szelenkov@nginx.com 14011158Szelenkov@nginx.com frame = self.ws.frame_to_send(self.ws.OP_TEXT, 'blah') 14021158Szelenkov@nginx.com sock.sendall(frame[:2]) 14031158Szelenkov@nginx.com 14041158Szelenkov@nginx.com time.sleep(2) 14051158Szelenkov@nginx.com 14061158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 14071158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PING, '') # PING frame 14081158Szelenkov@nginx.com 14091158Szelenkov@nginx.com sock.close() 1410