1*1596Szelenkov@nginx.comimport pytest 21477Szelenkov@nginx.comimport struct 31158Szelenkov@nginx.comimport time 41477Szelenkov@nginx.com 51158Szelenkov@nginx.comfrom unit.applications.lang.java import TestApplicationJava 61158Szelenkov@nginx.comfrom unit.applications.websockets import TestApplicationWebsocket 7*1596Szelenkov@nginx.comfrom conftest import option, skip_alert 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 15*1596Szelenkov@nginx.com def setup_method(self): 16*1596Szelenkov@nginx.com super().setup_method() 171158Szelenkov@nginx.com 18*1596Szelenkov@nginx.com assert 'success' in self.conf( 19*1596Szelenkov@nginx.com {'http': {'websocket': {'keepalive_interval': 0}}}, 'settings' 20*1596Szelenkov@nginx.com ), 'clear keepalive_interval' 211158Szelenkov@nginx.com 22*1596Szelenkov@nginx.com skip_alert(r'socket close\(\d+\) failed') 231158Szelenkov@nginx.com 241158Szelenkov@nginx.com def close_connection(self, sock): 25*1596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 261158Szelenkov@nginx.com 271158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 281158Szelenkov@nginx.com 291158Szelenkov@nginx.com self.check_close(sock) 301158Szelenkov@nginx.com 311158Szelenkov@nginx.com def check_close(self, sock, code=1000, no_close=False): 321158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 331158Szelenkov@nginx.com 34*1596Szelenkov@nginx.com assert frame['fin'] == True, 'close fin' 35*1596Szelenkov@nginx.com assert frame['opcode'] == self.ws.OP_CLOSE, 'close opcode' 36*1596Szelenkov@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 47*1596Szelenkov@nginx.com assert frame['fin'] == fin, 'fin' 48*1596Szelenkov@nginx.com assert frame['opcode'] == opcode, 'opcode' 49*1596Szelenkov@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 57*1596Szelenkov@nginx.com assert resp['status'] == 101, 'status' 58*1596Szelenkov@nginx.com assert resp['headers']['Upgrade'] == 'websocket', 'upgrade' 59*1596Szelenkov@nginx.com assert resp['headers']['Connection'] == 'Upgrade', 'connection' 60*1596Szelenkov@nginx.com assert resp['headers']['Sec-WebSocket-Accept'] == self.ws.accept( 61*1596Szelenkov@nginx.com key 62*1596Szelenkov@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 74*1596Szelenkov@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 79*1596Szelenkov@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 94*1596Szelenkov@nginx.com assert frame['opcode'] == self.ws.OP_CLOSE, 'no mask opcode' 95*1596Szelenkov@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 112*1596Szelenkov@nginx.com assert message + ' ' + message == frame['data'].decode( 113*1596Szelenkov@nginx.com 'utf-8' 114*1596Szelenkov@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') 130*1596Szelenkov@nginx.com assert frame == { 131*1596Szelenkov@nginx.com 'fin': True, 132*1596Szelenkov@nginx.com 'rsv1': False, 133*1596Szelenkov@nginx.com 'rsv2': False, 134*1596Szelenkov@nginx.com 'rsv3': False, 135*1596Szelenkov@nginx.com 'opcode': self.ws.OP_CLOSE, 136*1596Szelenkov@nginx.com 'mask': 0, 137*1596Szelenkov@nginx.com 'code': 1002, 138*1596Szelenkov@nginx.com 'reason': 'Fragmented control frame', 139*1596Szelenkov@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 158*1596Szelenkov@nginx.com assert message1 == frame1['data'].decode('utf-8'), 'client 1' 159*1596Szelenkov@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 164*1596Szelenkov@nginx.com @pytest.mark.skip('not yet') 1651158Szelenkov@nginx.com def test_java_websockets_handshake_upgrade_absent( 1661158Szelenkov@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 180*1596Szelenkov@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 197*1596Szelenkov@nginx.com assert resp['status'] == 101, 'status' 1981158Szelenkov@nginx.com 199*1596Szelenkov@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 213*1596Szelenkov@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 228*1596Szelenkov@nginx.com assert resp['status'] == 426, 'status' 2291158Szelenkov@nginx.com 230*1596Szelenkov@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 245*1596Szelenkov@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 259*1596Szelenkov@nginx.com assert resp['status'] == 400, 'key double' # FAIL https://tools.ietf.org/html/rfc6455#section-11.3.1 2601158Szelenkov@nginx.com 2611158Szelenkov@nginx.com def test_java_websockets_handshake_method_invalid(self): 2621158Szelenkov@nginx.com self.load('websockets_mirror') 2631158Szelenkov@nginx.com 2641158Szelenkov@nginx.com resp = self.post( 2651158Szelenkov@nginx.com headers={ 2661158Szelenkov@nginx.com 'Host': 'localhost', 2671158Szelenkov@nginx.com 'Upgrade': 'websocket', 2681158Szelenkov@nginx.com 'Connection': 'Upgrade', 2691262Szelenkov@nginx.com 'Sec-WebSocket-Key': self.ws.key(), 2701158Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2711158Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2721158Szelenkov@nginx.com }, 2731158Szelenkov@nginx.com ) 2741158Szelenkov@nginx.com 275*1596Szelenkov@nginx.com assert resp['status'] == 400, 'status' 2761158Szelenkov@nginx.com 2771158Szelenkov@nginx.com def test_java_websockets_handshake_http_10(self): 2781158Szelenkov@nginx.com self.load('websockets_mirror') 2791158Szelenkov@nginx.com 2801158Szelenkov@nginx.com resp = self.get( 2811158Szelenkov@nginx.com headers={ 2821158Szelenkov@nginx.com 'Host': 'localhost', 2831158Szelenkov@nginx.com 'Upgrade': 'websocket', 2841158Szelenkov@nginx.com 'Connection': 'Upgrade', 2851262Szelenkov@nginx.com 'Sec-WebSocket-Key': self.ws.key(), 2861158Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2871158Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2881158Szelenkov@nginx.com }, 2891158Szelenkov@nginx.com http_10=True, 2901158Szelenkov@nginx.com ) 2911158Szelenkov@nginx.com 292*1596Szelenkov@nginx.com assert resp['status'] == 400, 'status' 2931158Szelenkov@nginx.com 2941158Szelenkov@nginx.com def test_java_websockets_handshake_uri_invalid(self): 2951158Szelenkov@nginx.com self.load('websockets_mirror') 2961158Szelenkov@nginx.com 2971158Szelenkov@nginx.com resp = self.get( 2981158Szelenkov@nginx.com headers={ 2991158Szelenkov@nginx.com 'Host': 'localhost', 3001158Szelenkov@nginx.com 'Upgrade': 'websocket', 3011158Szelenkov@nginx.com 'Connection': 'Upgrade', 3021262Szelenkov@nginx.com 'Sec-WebSocket-Key': self.ws.key(), 3031158Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 3041158Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 3051158Szelenkov@nginx.com }, 3061158Szelenkov@nginx.com url='!', 3071158Szelenkov@nginx.com ) 3081158Szelenkov@nginx.com 309*1596Szelenkov@nginx.com assert resp['status'] == 400, 'status' 3101158Szelenkov@nginx.com 3111158Szelenkov@nginx.com def test_java_websockets_protocol_absent(self): 3121158Szelenkov@nginx.com self.load('websockets_mirror') 3131158Szelenkov@nginx.com 3141158Szelenkov@nginx.com key = self.ws.key() 3151262Szelenkov@nginx.com resp, sock, _ = self.ws.upgrade( 3161158Szelenkov@nginx.com headers={ 3171158Szelenkov@nginx.com 'Host': 'localhost', 3181158Szelenkov@nginx.com 'Upgrade': 'websocket', 3191158Szelenkov@nginx.com 'Connection': 'Upgrade', 3201158Szelenkov@nginx.com 'Sec-WebSocket-Key': key, 3211158Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 3221262Szelenkov@nginx.com } 3231158Szelenkov@nginx.com ) 3241262Szelenkov@nginx.com sock.close() 3251158Szelenkov@nginx.com 326*1596Szelenkov@nginx.com assert resp['status'] == 101, 'status' 327*1596Szelenkov@nginx.com assert resp['headers']['Upgrade'] == 'websocket', 'upgrade' 328*1596Szelenkov@nginx.com assert resp['headers']['Connection'] == 'Upgrade', 'connection' 329*1596Szelenkov@nginx.com assert resp['headers']['Sec-WebSocket-Accept'] == self.ws.accept( 330*1596Szelenkov@nginx.com key 331*1596Szelenkov@nginx.com ), 'key' 3321158Szelenkov@nginx.com 3331158Szelenkov@nginx.com # autobahn-testsuite 3341158Szelenkov@nginx.com # 3351158Szelenkov@nginx.com # Some following tests fail because of Unit does not support UTF-8 3361158Szelenkov@nginx.com # validation for websocket frames. It should be implemented 3371158Szelenkov@nginx.com # by application, if necessary. 3381158Szelenkov@nginx.com 3391158Szelenkov@nginx.com def test_java_websockets_1_1_1__1_1_8(self): 3401158Szelenkov@nginx.com self.load('websockets_mirror') 3411158Szelenkov@nginx.com 3421158Szelenkov@nginx.com opcode = self.ws.OP_TEXT 3431158Szelenkov@nginx.com 3441158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 3451158Szelenkov@nginx.com 3461158Szelenkov@nginx.com def check_length(length, chopsize=None): 3471158Szelenkov@nginx.com payload = '*' * length 3481158Szelenkov@nginx.com 3491158Szelenkov@nginx.com self.ws.frame_write(sock, opcode, payload, chopsize=chopsize) 3501158Szelenkov@nginx.com 3511158Szelenkov@nginx.com frame = self.ws.message_read(sock) 3521158Szelenkov@nginx.com self.check_frame(frame, True, opcode, payload) 3531158Szelenkov@nginx.com 3541158Szelenkov@nginx.com check_length(0) # 1_1_1 3551158Szelenkov@nginx.com check_length(125) # 1_1_2 3561158Szelenkov@nginx.com check_length(126) # 1_1_3 3571158Szelenkov@nginx.com check_length(127) # 1_1_4 3581158Szelenkov@nginx.com check_length(128) # 1_1_5 3591158Szelenkov@nginx.com check_length(65535) # 1_1_6 3601158Szelenkov@nginx.com check_length(65536) # 1_1_7 3611158Szelenkov@nginx.com check_length(65536, chopsize = 997) # 1_1_8 3621158Szelenkov@nginx.com 3631158Szelenkov@nginx.com self.close_connection(sock) 3641158Szelenkov@nginx.com 3651158Szelenkov@nginx.com def test_java_websockets_1_2_1__1_2_8(self): 3661158Szelenkov@nginx.com self.load('websockets_mirror') 3671158Szelenkov@nginx.com 3681158Szelenkov@nginx.com opcode = self.ws.OP_BINARY 3691158Szelenkov@nginx.com 3701158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 3711158Szelenkov@nginx.com 3721158Szelenkov@nginx.com def check_length(length, chopsize=None): 3731158Szelenkov@nginx.com payload = b'\xfe' * length 3741158Szelenkov@nginx.com 3751158Szelenkov@nginx.com self.ws.frame_write(sock, opcode, payload, chopsize=chopsize) 3761158Szelenkov@nginx.com 3771158Szelenkov@nginx.com frame = self.ws.message_read(sock) 3781158Szelenkov@nginx.com self.check_frame(frame, True, opcode, payload) 3791158Szelenkov@nginx.com 3801158Szelenkov@nginx.com check_length(0) # 1_2_1 3811158Szelenkov@nginx.com check_length(125) # 1_2_2 3821158Szelenkov@nginx.com check_length(126) # 1_2_3 3831158Szelenkov@nginx.com check_length(127) # 1_2_4 3841158Szelenkov@nginx.com check_length(128) # 1_2_5 3851158Szelenkov@nginx.com check_length(65535) # 1_2_6 3861158Szelenkov@nginx.com check_length(65536) # 1_2_7 3871158Szelenkov@nginx.com check_length(65536, chopsize = 997) # 1_2_8 3881158Szelenkov@nginx.com 3891158Szelenkov@nginx.com self.close_connection(sock) 3901158Szelenkov@nginx.com 3911158Szelenkov@nginx.com def test_java_websockets_2_1__2_6(self): 3921158Szelenkov@nginx.com self.load('websockets_mirror') 3931158Szelenkov@nginx.com 3941158Szelenkov@nginx.com op_ping = self.ws.OP_PING 3951158Szelenkov@nginx.com op_pong = self.ws.OP_PONG 3961158Szelenkov@nginx.com 3971158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 3981158Szelenkov@nginx.com 3991158Szelenkov@nginx.com def check_ping(payload, chopsize=None, decode=True): 4001158Szelenkov@nginx.com self.ws.frame_write(sock, op_ping, payload, chopsize=chopsize) 4011158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 4021158Szelenkov@nginx.com 4031158Szelenkov@nginx.com self.check_frame(frame, True, op_pong, payload, decode=decode) 4041158Szelenkov@nginx.com 4051158Szelenkov@nginx.com check_ping('') # 2_1 4061158Szelenkov@nginx.com check_ping('Hello, world!') # 2_2 4071158Szelenkov@nginx.com check_ping(b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff', decode=False) # 2_3 4081158Szelenkov@nginx.com check_ping(b'\xfe' * 125, decode=False) # 2_4 4091158Szelenkov@nginx.com check_ping(b'\xfe' * 125, chopsize=1, decode=False) # 2_6 4101158Szelenkov@nginx.com 4111158Szelenkov@nginx.com self.close_connection(sock) 4121158Szelenkov@nginx.com 4131158Szelenkov@nginx.com # 2_5 4141158Szelenkov@nginx.com 4151158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 4161158Szelenkov@nginx.com 4171158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, b'\xfe' * 126) 4181158Szelenkov@nginx.com self.check_close(sock, 1002) 4191158Szelenkov@nginx.com 4201158Szelenkov@nginx.com def test_java_websockets_2_7__2_9(self): 4211158Szelenkov@nginx.com self.load('websockets_mirror') 4221158Szelenkov@nginx.com 4231158Szelenkov@nginx.com # 2_7 4241158Szelenkov@nginx.com 4251158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 4261158Szelenkov@nginx.com 4271158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PONG, '') 428*1596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', '2_7' 4291158Szelenkov@nginx.com 4301158Szelenkov@nginx.com # 2_8 4311158Szelenkov@nginx.com 4321158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PONG, 'unsolicited pong payload') 433*1596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', '2_8' 4341158Szelenkov@nginx.com 4351158Szelenkov@nginx.com # 2_9 4361158Szelenkov@nginx.com 4371158Szelenkov@nginx.com payload = 'ping payload' 4381158Szelenkov@nginx.com 4391158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PONG, 'unsolicited pong payload') 4401158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, payload) 4411158Szelenkov@nginx.com 4421158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 4431158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, payload) 4441158Szelenkov@nginx.com 4451158Szelenkov@nginx.com self.close_connection(sock) 4461158Szelenkov@nginx.com 4471158Szelenkov@nginx.com def test_java_websockets_2_10__2_11(self): 4481158Szelenkov@nginx.com self.load('websockets_mirror') 4491158Szelenkov@nginx.com 4501158Szelenkov@nginx.com # 2_10 4511158Szelenkov@nginx.com 4521158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 4531158Szelenkov@nginx.com 4541158Szelenkov@nginx.com for i in range(0, 10): 4551158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'payload-%d' % i) 4561158Szelenkov@nginx.com 4571158Szelenkov@nginx.com for i in range(0, 10): 4581158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 4591158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, 'payload-%d' % i) 4601158Szelenkov@nginx.com 4611158Szelenkov@nginx.com # 2_11 4621158Szelenkov@nginx.com 4631158Szelenkov@nginx.com for i in range(0, 10): 4641158Szelenkov@nginx.com opcode = self.ws.OP_PING 4651158Szelenkov@nginx.com self.ws.frame_write(sock, opcode, 'payload-%d' % i, chopsize=1) 4661158Szelenkov@nginx.com 4671158Szelenkov@nginx.com for i in range(0, 10): 4681158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 4691158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, 'payload-%d' % i) 4701158Szelenkov@nginx.com 4711158Szelenkov@nginx.com self.close_connection(sock) 4721158Szelenkov@nginx.com 473*1596Szelenkov@nginx.com @pytest.mark.skip('not yet') 4741158Szelenkov@nginx.com def test_java_websockets_3_1__3_7(self): 4751158Szelenkov@nginx.com self.load('websockets_mirror') 4761158Szelenkov@nginx.com 4771158Szelenkov@nginx.com payload = 'Hello, world!' 4781158Szelenkov@nginx.com 4791158Szelenkov@nginx.com # 3_1 4801158Szelenkov@nginx.com 4811158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 4821158Szelenkov@nginx.com 4831158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload, rsv1=True) 4841158Szelenkov@nginx.com self.check_close(sock, 1002) 4851158Szelenkov@nginx.com 4861158Szelenkov@nginx.com # 3_2 4871158Szelenkov@nginx.com 4881158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 4891158Szelenkov@nginx.com 4901158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 4911158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload, rsv2=True) 4921158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 4931158Szelenkov@nginx.com 4941158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 4951158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 4961158Szelenkov@nginx.com 4971158Szelenkov@nginx.com self.check_close(sock, 1002, no_close=True) 4981158Szelenkov@nginx.com 499*1596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', 'empty 3_2' 5001158Szelenkov@nginx.com sock.close() 5011158Szelenkov@nginx.com 5021158Szelenkov@nginx.com # 3_3 5031158Szelenkov@nginx.com 5041158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5051158Szelenkov@nginx.com 5061158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 5071158Szelenkov@nginx.com 5081158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 5091158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 5101158Szelenkov@nginx.com 5111158Szelenkov@nginx.com self.ws.frame_write( 5121158Szelenkov@nginx.com sock, self.ws.OP_TEXT, payload, rsv1=True, rsv2=True 5131158Szelenkov@nginx.com ) 5141158Szelenkov@nginx.com 5151158Szelenkov@nginx.com self.check_close(sock, 1002, no_close=True) 5161158Szelenkov@nginx.com 517*1596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', 'empty 3_3' 5181158Szelenkov@nginx.com sock.close() 5191158Szelenkov@nginx.com 5201158Szelenkov@nginx.com # 3_4 5211158Szelenkov@nginx.com 5221158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5231158Szelenkov@nginx.com 5241158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1) 5251158Szelenkov@nginx.com self.ws.frame_write( 5261158Szelenkov@nginx.com sock, self.ws.OP_TEXT, payload, rsv3=True, chopsize=1 5271158Szelenkov@nginx.com ) 5281158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 5291158Szelenkov@nginx.com 5301158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 5311158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 5321158Szelenkov@nginx.com 5331158Szelenkov@nginx.com self.check_close(sock, 1002, no_close=True) 5341158Szelenkov@nginx.com 535*1596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', 'empty 3_4' 5361158Szelenkov@nginx.com sock.close() 5371158Szelenkov@nginx.com 5381158Szelenkov@nginx.com # 3_5 5391158Szelenkov@nginx.com 5401158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5411158Szelenkov@nginx.com 5421158Szelenkov@nginx.com self.ws.frame_write( 5431158Szelenkov@nginx.com sock, 5441158Szelenkov@nginx.com self.ws.OP_BINARY, 5451158Szelenkov@nginx.com b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff', 5461158Szelenkov@nginx.com rsv1=True, 5471158Szelenkov@nginx.com rsv3=True, 5481158Szelenkov@nginx.com ) 5491158Szelenkov@nginx.com 5501158Szelenkov@nginx.com self.check_close(sock, 1002) 5511158Szelenkov@nginx.com 5521158Szelenkov@nginx.com # 3_6 5531158Szelenkov@nginx.com 5541158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5551158Szelenkov@nginx.com 5561158Szelenkov@nginx.com self.ws.frame_write( 5571158Szelenkov@nginx.com sock, self.ws.OP_PING, payload, rsv2=True, rsv3=True 5581158Szelenkov@nginx.com ) 5591158Szelenkov@nginx.com 5601158Szelenkov@nginx.com self.check_close(sock, 1002) 5611158Szelenkov@nginx.com 5621158Szelenkov@nginx.com # 3_7 5631158Szelenkov@nginx.com 5641158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5651158Szelenkov@nginx.com 5661158Szelenkov@nginx.com self.ws.frame_write( 5671158Szelenkov@nginx.com sock, self.ws.OP_CLOSE, payload, rsv1=True, rsv2=True, rsv3=True 5681158Szelenkov@nginx.com ) 5691158Szelenkov@nginx.com 5701158Szelenkov@nginx.com self.check_close(sock, 1002) 5711158Szelenkov@nginx.com 5721158Szelenkov@nginx.com def test_java_websockets_4_1_1__4_2_5(self): 5731158Szelenkov@nginx.com self.load('websockets_mirror') 5741158Szelenkov@nginx.com 5751158Szelenkov@nginx.com payload = 'Hello, world!' 5761158Szelenkov@nginx.com 5771158Szelenkov@nginx.com # 4_1_1 5781158Szelenkov@nginx.com 5791158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5801158Szelenkov@nginx.com 5811158Szelenkov@nginx.com self.ws.frame_write(sock, 0x03, '') 5821158Szelenkov@nginx.com self.check_close(sock, 1002) 5831158Szelenkov@nginx.com 5841158Szelenkov@nginx.com # 4_1_2 5851158Szelenkov@nginx.com 5861158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5871158Szelenkov@nginx.com 5881158Szelenkov@nginx.com self.ws.frame_write(sock, 0x04, 'reserved opcode payload') 5891158Szelenkov@nginx.com self.check_close(sock, 1002) 5901158Szelenkov@nginx.com 5911158Szelenkov@nginx.com # 4_1_3 5921158Szelenkov@nginx.com 5931158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5941158Szelenkov@nginx.com 5951158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 5961158Szelenkov@nginx.com 5971158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 5981158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 5991158Szelenkov@nginx.com 6001158Szelenkov@nginx.com self.ws.frame_write(sock, 0x05, '') 6011158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 6021158Szelenkov@nginx.com 6031158Szelenkov@nginx.com self.check_close(sock, 1002) 6041158Szelenkov@nginx.com 6051158Szelenkov@nginx.com # 4_1_4 6061158Szelenkov@nginx.com 6071158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6081158Szelenkov@nginx.com 6091158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 6101158Szelenkov@nginx.com 6111158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 6121158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 6131158Szelenkov@nginx.com 6141158Szelenkov@nginx.com self.ws.frame_write(sock, 0x06, payload) 6151158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 6161158Szelenkov@nginx.com 6171158Szelenkov@nginx.com self.check_close(sock, 1002) 6181158Szelenkov@nginx.com 6191158Szelenkov@nginx.com # 4_1_5 6201158Szelenkov@nginx.com 6211158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6221158Szelenkov@nginx.com 6231158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1) 6241158Szelenkov@nginx.com 6251158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 6261158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 6271158Szelenkov@nginx.com 6281158Szelenkov@nginx.com self.ws.frame_write(sock, 0x07, payload, chopsize=1) 6291158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 6301158Szelenkov@nginx.com 6311158Szelenkov@nginx.com self.check_close(sock, 1002) 6321158Szelenkov@nginx.com 6331158Szelenkov@nginx.com # 4_2_1 6341158Szelenkov@nginx.com 6351158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6361158Szelenkov@nginx.com 6371158Szelenkov@nginx.com self.ws.frame_write(sock, 0x0B, '') 6381158Szelenkov@nginx.com self.check_close(sock, 1002) 6391158Szelenkov@nginx.com 6401158Szelenkov@nginx.com # 4_2_2 6411158Szelenkov@nginx.com 6421158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6431158Szelenkov@nginx.com 6441158Szelenkov@nginx.com self.ws.frame_write(sock, 0x0C, 'reserved opcode payload') 6451158Szelenkov@nginx.com self.check_close(sock, 1002) 6461158Szelenkov@nginx.com 6471158Szelenkov@nginx.com # 4_2_3 6481158Szelenkov@nginx.com 6491158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6501158Szelenkov@nginx.com 6511158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 6521158Szelenkov@nginx.com 6531158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 6541158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 6551158Szelenkov@nginx.com 6561158Szelenkov@nginx.com self.ws.frame_write(sock, 0x0D, '') 6571158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 6581158Szelenkov@nginx.com 6591158Szelenkov@nginx.com self.check_close(sock, 1002) 6601158Szelenkov@nginx.com 6611158Szelenkov@nginx.com # 4_2_4 6621158Szelenkov@nginx.com 6631158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6641158Szelenkov@nginx.com 6651158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 6661158Szelenkov@nginx.com 6671158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 6681158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 6691158Szelenkov@nginx.com 6701158Szelenkov@nginx.com self.ws.frame_write(sock, 0x0E, payload) 6711158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 6721158Szelenkov@nginx.com 6731158Szelenkov@nginx.com self.check_close(sock, 1002) 6741158Szelenkov@nginx.com 6751158Szelenkov@nginx.com # 4_2_5 6761158Szelenkov@nginx.com 6771158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6781158Szelenkov@nginx.com 6791158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1) 6801158Szelenkov@nginx.com 6811158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 6821158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 6831158Szelenkov@nginx.com 6841158Szelenkov@nginx.com self.ws.frame_write(sock, 0x0F, payload, chopsize=1) 6851158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 6861158Szelenkov@nginx.com 6871158Szelenkov@nginx.com self.check_close(sock, 1002) 6881158Szelenkov@nginx.com 6891158Szelenkov@nginx.com def test_java_websockets_5_1__5_20(self): 6901158Szelenkov@nginx.com self.load('websockets_mirror') 6911158Szelenkov@nginx.com 6921158Szelenkov@nginx.com # 5_1 6931158Szelenkov@nginx.com 6941158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6951158Szelenkov@nginx.com 6961158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'fragment1', fin=False) 6971158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 6981158Szelenkov@nginx.com self.check_close(sock, 1002) 6991158Szelenkov@nginx.com 7001158Szelenkov@nginx.com # 5_2 7011158Szelenkov@nginx.com 7021158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 7031158Szelenkov@nginx.com 7041158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PONG, 'fragment1', fin=False) 7051158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 7061158Szelenkov@nginx.com self.check_close(sock, 1002) 7071158Szelenkov@nginx.com 7081158Szelenkov@nginx.com # 5_3 7091158Szelenkov@nginx.com 7101158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 7111158Szelenkov@nginx.com 7121158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 7131158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 7141158Szelenkov@nginx.com 7151158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7161158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 7171158Szelenkov@nginx.com 7181158Szelenkov@nginx.com # 5_4 7191158Szelenkov@nginx.com 7201158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 721*1596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', '5_4' 7221158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 7231158Szelenkov@nginx.com 7241158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7251158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 7261158Szelenkov@nginx.com 7271158Szelenkov@nginx.com # 5_5 7281158Szelenkov@nginx.com 7291158Szelenkov@nginx.com self.ws.frame_write( 7301158Szelenkov@nginx.com sock, self.ws.OP_TEXT, 'fragment1', fin=False, chopsize=1 7311158Szelenkov@nginx.com ) 7321158Szelenkov@nginx.com self.ws.frame_write( 7331158Szelenkov@nginx.com sock, self.ws.OP_CONT, 'fragment2', fin=True, chopsize=1 7341158Szelenkov@nginx.com ) 7351158Szelenkov@nginx.com 7361158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7371158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 7381158Szelenkov@nginx.com 7391158Szelenkov@nginx.com # 5_6 7401158Szelenkov@nginx.com 7411158Szelenkov@nginx.com ping_payload = 'ping payload' 7421158Szelenkov@nginx.com 7431158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 7441158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, ping_payload) 7451158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 7461158Szelenkov@nginx.com 7471158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7481158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, ping_payload) 7491158Szelenkov@nginx.com 7501158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7511158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 7521158Szelenkov@nginx.com 7531158Szelenkov@nginx.com # 5_7 7541158Szelenkov@nginx.com 7551158Szelenkov@nginx.com ping_payload = 'ping payload' 7561158Szelenkov@nginx.com 7571158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 758*1596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', '5_7' 7591158Szelenkov@nginx.com 7601158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, ping_payload) 7611158Szelenkov@nginx.com 7621158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7631158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, ping_payload) 7641158Szelenkov@nginx.com 7651158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 7661158Szelenkov@nginx.com 7671158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7681158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 7691158Szelenkov@nginx.com 7701158Szelenkov@nginx.com # 5_8 7711158Szelenkov@nginx.com 7721158Szelenkov@nginx.com ping_payload = 'ping payload' 7731158Szelenkov@nginx.com 7741158Szelenkov@nginx.com self.ws.frame_write( 7751158Szelenkov@nginx.com sock, self.ws.OP_TEXT, 'fragment1', fin=False, chopsize=1 7761158Szelenkov@nginx.com ) 7771158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, ping_payload, chopsize=1) 7781158Szelenkov@nginx.com self.ws.frame_write( 7791158Szelenkov@nginx.com sock, self.ws.OP_CONT, 'fragment2', fin=True, chopsize=1 7801158Szelenkov@nginx.com ) 7811158Szelenkov@nginx.com 7821158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7831158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, ping_payload) 7841158Szelenkov@nginx.com 7851158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7861158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 7871158Szelenkov@nginx.com 7881158Szelenkov@nginx.com # 5_9 7891158Szelenkov@nginx.com 7901158Szelenkov@nginx.com self.ws.frame_write( 7911158Szelenkov@nginx.com sock, self.ws.OP_CONT, 'non-continuation payload', fin=True 7921158Szelenkov@nginx.com ) 7931158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True) 7941158Szelenkov@nginx.com self.check_close(sock, 1002) 7951158Szelenkov@nginx.com 7961158Szelenkov@nginx.com # 5_10 7971158Szelenkov@nginx.com 7981158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 7991158Szelenkov@nginx.com 8001158Szelenkov@nginx.com self.ws.frame_write( 8011158Szelenkov@nginx.com sock, self.ws.OP_CONT, 'non-continuation payload', fin=True 8021158Szelenkov@nginx.com ) 8031158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True) 8041158Szelenkov@nginx.com self.check_close(sock, 1002) 8051158Szelenkov@nginx.com 8061158Szelenkov@nginx.com # 5_11 8071158Szelenkov@nginx.com 8081158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8091158Szelenkov@nginx.com 8101158Szelenkov@nginx.com self.ws.frame_write( 8111158Szelenkov@nginx.com sock, 8121158Szelenkov@nginx.com self.ws.OP_CONT, 8131158Szelenkov@nginx.com 'non-continuation payload', 8141158Szelenkov@nginx.com fin=True, 8151158Szelenkov@nginx.com chopsize=1, 8161158Szelenkov@nginx.com ) 8171158Szelenkov@nginx.com self.ws.frame_write( 8181158Szelenkov@nginx.com sock, self.ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1 8191158Szelenkov@nginx.com ) 8201158Szelenkov@nginx.com self.check_close(sock, 1002) 8211158Szelenkov@nginx.com 8221158Szelenkov@nginx.com # 5_12 8231158Szelenkov@nginx.com 8241158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8251158Szelenkov@nginx.com 8261158Szelenkov@nginx.com self.ws.frame_write( 8271158Szelenkov@nginx.com sock, self.ws.OP_CONT, 'non-continuation payload', fin=False 8281158Szelenkov@nginx.com ) 8291158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True) 8301158Szelenkov@nginx.com self.check_close(sock, 1002) 8311158Szelenkov@nginx.com 8321158Szelenkov@nginx.com # 5_13 8331158Szelenkov@nginx.com 8341158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8351158Szelenkov@nginx.com 8361158Szelenkov@nginx.com self.ws.frame_write( 8371158Szelenkov@nginx.com sock, self.ws.OP_CONT, 'non-continuation payload', fin=False 8381158Szelenkov@nginx.com ) 8391158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True) 8401158Szelenkov@nginx.com self.check_close(sock, 1002) 8411158Szelenkov@nginx.com 8421158Szelenkov@nginx.com # 5_14 8431158Szelenkov@nginx.com 8441158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8451158Szelenkov@nginx.com 8461158Szelenkov@nginx.com self.ws.frame_write( 8471158Szelenkov@nginx.com sock, 8481158Szelenkov@nginx.com self.ws.OP_CONT, 8491158Szelenkov@nginx.com 'non-continuation payload', 8501158Szelenkov@nginx.com fin=False, 8511158Szelenkov@nginx.com chopsize=1, 8521158Szelenkov@nginx.com ) 8531158Szelenkov@nginx.com self.ws.frame_write( 8541158Szelenkov@nginx.com sock, self.ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1 8551158Szelenkov@nginx.com ) 8561158Szelenkov@nginx.com self.check_close(sock, 1002) 8571158Szelenkov@nginx.com 8581158Szelenkov@nginx.com # 5_15 8591158Szelenkov@nginx.com 8601158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8611158Szelenkov@nginx.com 8621158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 8631158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 8641158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False) 8651158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment4', fin=True) 8661158Szelenkov@nginx.com self.check_close(sock, 1002) 8671158Szelenkov@nginx.com 8681158Szelenkov@nginx.com # 5_16 8691158Szelenkov@nginx.com 8701158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8711158Szelenkov@nginx.com 8721158Szelenkov@nginx.com for i in range(0, 2): 8731158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment1', fin=False) 8741158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2', fin=False) 8751158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=True) 8761158Szelenkov@nginx.com self.check_close(sock, 1002) 8771158Szelenkov@nginx.com 8781158Szelenkov@nginx.com # 5_17 8791158Szelenkov@nginx.com 8801158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8811158Szelenkov@nginx.com 8821158Szelenkov@nginx.com for i in range(0, 2): 8831158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment1', fin=True) 8841158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2', fin=False) 8851158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=True) 8861158Szelenkov@nginx.com self.check_close(sock, 1002) 8871158Szelenkov@nginx.com 8881158Szelenkov@nginx.com # 5_18 8891158Szelenkov@nginx.com 8901158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8911158Szelenkov@nginx.com 8921158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 8931158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2') 8941158Szelenkov@nginx.com self.check_close(sock, 1002) 8951158Szelenkov@nginx.com 8961158Szelenkov@nginx.com # 5_19 8971158Szelenkov@nginx.com 8981158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8991158Szelenkov@nginx.com 9001158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 9011158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=False) 9021158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 1!') 9031158Szelenkov@nginx.com 9041158Szelenkov@nginx.com time.sleep(1) 9051158Szelenkov@nginx.com 9061158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False) 9071158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment4', fin=False) 9081158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 2!') 9091158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment5') 9101158Szelenkov@nginx.com 9111158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 9121158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 1!') 9131158Szelenkov@nginx.com 9141158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 9151158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 2!') 9161158Szelenkov@nginx.com 9171158Szelenkov@nginx.com self.check_frame( 9181158Szelenkov@nginx.com self.ws.frame_read(sock), 9191158Szelenkov@nginx.com True, 9201158Szelenkov@nginx.com self.ws.OP_TEXT, 9211158Szelenkov@nginx.com 'fragment1fragment2fragment3fragment4fragment5', 9221158Szelenkov@nginx.com ) 9231158Szelenkov@nginx.com 9241158Szelenkov@nginx.com # 5_20 9251158Szelenkov@nginx.com 9261158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 9271158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=False) 9281158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 1!') 9291158Szelenkov@nginx.com 9301158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 9311158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 1!') 9321158Szelenkov@nginx.com 9331158Szelenkov@nginx.com time.sleep(1) 9341158Szelenkov@nginx.com 9351158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False) 9361158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment4', fin=False) 9371158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 2!') 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 2!') 9411158Szelenkov@nginx.com 942*1596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', '5_20' 9431158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment5') 9441158Szelenkov@nginx.com 9451158Szelenkov@nginx.com self.check_frame( 9461158Szelenkov@nginx.com self.ws.frame_read(sock), 9471158Szelenkov@nginx.com True, 9481158Szelenkov@nginx.com self.ws.OP_TEXT, 9491158Szelenkov@nginx.com 'fragment1fragment2fragment3fragment4fragment5', 9501158Szelenkov@nginx.com ) 9511158Szelenkov@nginx.com 9521158Szelenkov@nginx.com self.close_connection(sock) 9531158Szelenkov@nginx.com 9541158Szelenkov@nginx.com def test_java_websockets_6_1_1__6_4_4(self): 9551158Szelenkov@nginx.com self.load('websockets_mirror') 9561158Szelenkov@nginx.com 9571158Szelenkov@nginx.com # 6_1_1 9581158Szelenkov@nginx.com 9591158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 9601158Szelenkov@nginx.com 9611158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, '') 9621158Szelenkov@nginx.com frame = self.ws.frame_read(sock, read_timeout=3) 9631158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, '') 9641158Szelenkov@nginx.com 9651158Szelenkov@nginx.com # 6_1_2 9661158Szelenkov@nginx.com 9671158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, '', fin=False) 9681158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, '', fin=False) 9691158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, '') 9701158Szelenkov@nginx.com 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_3 9751158Szelenkov@nginx.com 9761158Szelenkov@nginx.com payload = 'middle frame payload' 9771158Szelenkov@nginx.com 9781158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, '', fin=False) 9791158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, payload, fin=False) 9801158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, '') 9811158Szelenkov@nginx.com 9821158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 9831158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 9841158Szelenkov@nginx.com 9851158Szelenkov@nginx.com # 6_2_1 9861158Szelenkov@nginx.com 9871158Szelenkov@nginx.com payload = 'Hello-µ@ßöäüàá-UTF-8!!' 9881158Szelenkov@nginx.com 9891158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 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_2 9951158Szelenkov@nginx.com 9961158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload[:12], fin=False) 9971158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, payload[12:]) 9981158Szelenkov@nginx.com 9991158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 10001158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 10011158Szelenkov@nginx.com 10021158Szelenkov@nginx.com # 6_2_3 10031158Szelenkov@nginx.com 10041158Szelenkov@nginx.com self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1) 10051158Szelenkov@nginx.com 10061158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 10071158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 10081158Szelenkov@nginx.com 10091158Szelenkov@nginx.com # 6_2_4 10101158Szelenkov@nginx.com 10111158Szelenkov@nginx.com payload = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5' 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 self.close_connection(sock) 10191158Szelenkov@nginx.com 10201158Szelenkov@nginx.com# Unit does not support UTF-8 validation 10211158Szelenkov@nginx.com# 10221158Szelenkov@nginx.com# # 6_3_1 FAIL 10231158Szelenkov@nginx.com# 10241158Szelenkov@nginx.com# payload_1 = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5' 10251158Szelenkov@nginx.com# payload_2 = '\xed\xa0\x80' 10261158Szelenkov@nginx.com# payload_3 = '\x65\x64\x69\x74\x65\x64' 10271158Szelenkov@nginx.com# 10281158Szelenkov@nginx.com# payload = payload_1 + payload_2 + payload_3 10291158Szelenkov@nginx.com# 10301158Szelenkov@nginx.com# self.ws.message(sock, self.ws.OP_TEXT, payload) 10311158Szelenkov@nginx.com# self.check_close(sock, 1007) 10321158Szelenkov@nginx.com# 10331158Szelenkov@nginx.com# # 6_3_2 FAIL 10341158Szelenkov@nginx.com# 10351158Szelenkov@nginx.com# _, sock, _ = self.ws.upgrade() 10361158Szelenkov@nginx.com# 10371158Szelenkov@nginx.com# self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1) 10381158Szelenkov@nginx.com# self.check_close(sock, 1007) 10391158Szelenkov@nginx.com# 10401158Szelenkov@nginx.com# # 6_4_1 ... 6_4_4 FAIL 10411158Szelenkov@nginx.com 10421158Szelenkov@nginx.com def test_java_websockets_7_1_1__7_5_1(self): 10431158Szelenkov@nginx.com self.load('websockets_mirror') 10441158Szelenkov@nginx.com 10451158Szelenkov@nginx.com # 7_1_1 10461158Szelenkov@nginx.com 10471158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 10481158Szelenkov@nginx.com 10491158Szelenkov@nginx.com payload = "Hello World!" 10501158Szelenkov@nginx.com 10511158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 10521158Szelenkov@nginx.com 10531158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 10541158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 10551158Szelenkov@nginx.com 10561158Szelenkov@nginx.com self.close_connection(sock) 10571158Szelenkov@nginx.com 10581158Szelenkov@nginx.com # 7_1_2 10591158Szelenkov@nginx.com 10601158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 10611158Szelenkov@nginx.com 10621158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 10631158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 10641158Szelenkov@nginx.com 10651158Szelenkov@nginx.com self.check_close(sock) 10661158Szelenkov@nginx.com 10671158Szelenkov@nginx.com # 7_1_3 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.check_close(sock, no_close=True) 10731158Szelenkov@nginx.com 10741158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 1075*1596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 10761158Szelenkov@nginx.com 10771158Szelenkov@nginx.com sock.close() 10781158Szelenkov@nginx.com 10791158Szelenkov@nginx.com # 7_1_4 10801158Szelenkov@nginx.com 10811158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 10821158Szelenkov@nginx.com 10831158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 10841158Szelenkov@nginx.com self.check_close(sock, no_close=True) 10851158Szelenkov@nginx.com 10861158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 1087*1596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 10881158Szelenkov@nginx.com 10891158Szelenkov@nginx.com sock.close() 10901158Szelenkov@nginx.com 10911158Szelenkov@nginx.com # 7_1_5 10921158Szelenkov@nginx.com 10931158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 10941158Szelenkov@nginx.com 10951158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 10961158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 10971158Szelenkov@nginx.com self.check_close(sock, no_close=True) 10981158Szelenkov@nginx.com 10991158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2') 1100*1596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 11011158Szelenkov@nginx.com 11021158Szelenkov@nginx.com sock.close() 11031158Szelenkov@nginx.com 11041158Szelenkov@nginx.com # 7_1_6 11051158Szelenkov@nginx.com 11061158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11071158Szelenkov@nginx.com 11081158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'BAsd7&jh23' * 26 * 2 ** 10) 11091158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 11101158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 11111158Szelenkov@nginx.com 11121158Szelenkov@nginx.com self.recvall(sock, read_timeout=1) 11131158Szelenkov@nginx.com 11141158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 1115*1596Szelenkov@nginx.com assert self.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 11161158Szelenkov@nginx.com 11171158Szelenkov@nginx.com sock.close() 11181158Szelenkov@nginx.com 11191262Szelenkov@nginx.com # 7_3_1 11201158Szelenkov@nginx.com 11211158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11221158Szelenkov@nginx.com 11231158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, '') 11241158Szelenkov@nginx.com self.check_close(sock) 11251158Szelenkov@nginx.com 11261158Szelenkov@nginx.com # 7_3_2 11271158Szelenkov@nginx.com 11281158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11291158Szelenkov@nginx.com 11301158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, 'a') 11311158Szelenkov@nginx.com self.check_close(sock, 1002) 11321158Szelenkov@nginx.com 11331158Szelenkov@nginx.com # 7_3_3 11341158Szelenkov@nginx.com 11351158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11361158Szelenkov@nginx.com 11371158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 11381158Szelenkov@nginx.com self.check_close(sock) 11391158Szelenkov@nginx.com 11401158Szelenkov@nginx.com # 7_3_4 11411158Szelenkov@nginx.com 11421158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11431158Szelenkov@nginx.com 11441158Szelenkov@nginx.com payload = self.ws.serialize_close(reason='Hello World!') 11451158Szelenkov@nginx.com 11461158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 11471158Szelenkov@nginx.com self.check_close(sock) 11481158Szelenkov@nginx.com 11491158Szelenkov@nginx.com # 7_3_5 11501158Szelenkov@nginx.com 11511158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11521158Szelenkov@nginx.com 11531158Szelenkov@nginx.com payload = self.ws.serialize_close(reason='*' * 123) 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_6 11591158Szelenkov@nginx.com 11601158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11611158Szelenkov@nginx.com 11621158Szelenkov@nginx.com payload = self.ws.serialize_close(reason='*' * 124) 11631158Szelenkov@nginx.com 11641158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 11651158Szelenkov@nginx.com self.check_close(sock, 1002) 11661158Szelenkov@nginx.com 11671158Szelenkov@nginx.com# # 7_5_1 FAIL Unit does not support UTF-8 validation 11681158Szelenkov@nginx.com# 11691158Szelenkov@nginx.com# _, sock, _ = self.ws.upgrade() 11701158Szelenkov@nginx.com# 11711158Szelenkov@nginx.com# payload = self.ws.serialize_close(reason = '\xce\xba\xe1\xbd\xb9\xcf' \ 11721158Szelenkov@nginx.com# '\x83\xce\xbc\xce\xb5\xed\xa0\x80\x65\x64\x69\x74\x65\x64') 11731158Szelenkov@nginx.com# 11741158Szelenkov@nginx.com# self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 11751158Szelenkov@nginx.com# self.check_close(sock, 1007) 11761158Szelenkov@nginx.com 11771158Szelenkov@nginx.com def test_java_websockets_7_7_X__7_9_X(self): 11781158Szelenkov@nginx.com self.load('websockets_mirror') 11791158Szelenkov@nginx.com 11801158Szelenkov@nginx.com valid_codes = [ 11811158Szelenkov@nginx.com 1000, 11821158Szelenkov@nginx.com 1001, 11831158Szelenkov@nginx.com 1002, 11841158Szelenkov@nginx.com 1003, 11851158Szelenkov@nginx.com 1007, 11861158Szelenkov@nginx.com 1008, 11871158Szelenkov@nginx.com 1009, 11881158Szelenkov@nginx.com 1010, 11891158Szelenkov@nginx.com 1011, 11901158Szelenkov@nginx.com 3000, 11911158Szelenkov@nginx.com 3999, 11921158Szelenkov@nginx.com 4000, 11931158Szelenkov@nginx.com 4999, 11941158Szelenkov@nginx.com ] 11951158Szelenkov@nginx.com 11961158Szelenkov@nginx.com invalid_codes = [0, 999, 1004, 1005, 1006, 1016, 1100, 2000, 2999] 11971158Szelenkov@nginx.com 11981158Szelenkov@nginx.com for code in valid_codes: 11991158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 12001158Szelenkov@nginx.com 12011158Szelenkov@nginx.com payload = self.ws.serialize_close(code=code) 12021158Szelenkov@nginx.com 12031158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 12041158Szelenkov@nginx.com self.check_close(sock, code=code) 12051158Szelenkov@nginx.com 12061158Szelenkov@nginx.com for code in invalid_codes: 12071158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 12081158Szelenkov@nginx.com 12091158Szelenkov@nginx.com payload = self.ws.serialize_close(code=code) 12101158Szelenkov@nginx.com 12111158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 12121158Szelenkov@nginx.com self.check_close(sock, 1002) 12131158Szelenkov@nginx.com 12141158Szelenkov@nginx.com def test_java_websockets_7_13_1__7_13_2(self): 12151158Szelenkov@nginx.com self.load('websockets_mirror') 12161158Szelenkov@nginx.com 12171158Szelenkov@nginx.com # 7_13_1 12181158Szelenkov@nginx.com 12191158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 12201158Szelenkov@nginx.com 12211158Szelenkov@nginx.com payload = self.ws.serialize_close(code=5000) 12221158Szelenkov@nginx.com 12231158Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 12241158Szelenkov@nginx.com self.check_close(sock, 1002) 12251158Szelenkov@nginx.com 12261158Szelenkov@nginx.com # 7_13_2 12271158Szelenkov@nginx.com 12281158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 12291158Szelenkov@nginx.com 12301158Szelenkov@nginx.com payload = struct.pack('!I', 65536) + ''.encode('utf-8') 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 1235*1596Szelenkov@nginx.com def test_java_websockets_9_1_1__9_6_6(self, is_unsafe): 1236*1596Szelenkov@nginx.com if not is_unsafe: 1237*1596Szelenkov@nginx.com pytest.skip('unsafe, long run') 12381158Szelenkov@nginx.com 12391158Szelenkov@nginx.com self.load('websockets_mirror') 12401158Szelenkov@nginx.com 1241*1596Szelenkov@nginx.com assert 'success' in self.conf( 1242*1596Szelenkov@nginx.com { 1243*1596Szelenkov@nginx.com 'http': { 1244*1596Szelenkov@nginx.com 'websocket': { 1245*1596Szelenkov@nginx.com 'max_frame_size': 33554432, 1246*1596Szelenkov@nginx.com 'keepalive_interval': 0, 12471158Szelenkov@nginx.com } 1248*1596Szelenkov@nginx.com } 1249*1596Szelenkov@nginx.com }, 1250*1596Szelenkov@nginx.com 'settings', 1251*1596Szelenkov@nginx.com ), 'increase max_frame_size and keepalive_interval' 12521158Szelenkov@nginx.com 12531158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 12541158Szelenkov@nginx.com 12551158Szelenkov@nginx.com op_text = self.ws.OP_TEXT 12561158Szelenkov@nginx.com op_binary = self.ws.OP_BINARY 12571158Szelenkov@nginx.com 12581158Szelenkov@nginx.com def check_payload(opcode, length, chopsize=None): 12591158Szelenkov@nginx.com if opcode == self.ws.OP_TEXT: 12601158Szelenkov@nginx.com payload = '*' * length 12611158Szelenkov@nginx.com else: 12621158Szelenkov@nginx.com payload = b'*' * length 12631158Szelenkov@nginx.com 12641158Szelenkov@nginx.com self.ws.frame_write(sock, opcode, payload, chopsize=chopsize) 12651158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 12661158Szelenkov@nginx.com self.check_frame(frame, True, opcode, payload) 12671158Szelenkov@nginx.com 12681158Szelenkov@nginx.com def check_message(opcode, f_size): 12691158Szelenkov@nginx.com if opcode == self.ws.OP_TEXT: 12701158Szelenkov@nginx.com payload = '*' * 4 * 2 ** 20 12711158Szelenkov@nginx.com else: 12721158Szelenkov@nginx.com payload = b'*' * 4 * 2 ** 20 12731158Szelenkov@nginx.com 12741158Szelenkov@nginx.com self.ws.message(sock, opcode, payload, fragmention_size=f_size) 12751158Szelenkov@nginx.com frame = self.ws.frame_read(sock, read_timeout=5) 12761158Szelenkov@nginx.com self.check_frame(frame, True, opcode, payload) 12771158Szelenkov@nginx.com 12781158Szelenkov@nginx.com check_payload(op_text, 64 * 2 ** 10) # 9_1_1 12791158Szelenkov@nginx.com check_payload(op_text, 256 * 2 ** 10) # 9_1_2 12801158Szelenkov@nginx.com check_payload(op_text, 2 ** 20) # 9_1_3 12811158Szelenkov@nginx.com check_payload(op_text, 4 * 2 ** 20) # 9_1_4 12821158Szelenkov@nginx.com check_payload(op_text, 8 * 2 ** 20) # 9_1_5 12831158Szelenkov@nginx.com check_payload(op_text, 16 * 2 ** 20) # 9_1_6 12841158Szelenkov@nginx.com 12851158Szelenkov@nginx.com check_payload(op_binary, 64 * 2 ** 10) # 9_2_1 12861158Szelenkov@nginx.com check_payload(op_binary, 256 * 2 ** 10) # 9_2_2 12871158Szelenkov@nginx.com check_payload(op_binary, 2 ** 20) # 9_2_3 12881158Szelenkov@nginx.com check_payload(op_binary, 4 * 2 ** 20) # 9_2_4 12891158Szelenkov@nginx.com check_payload(op_binary, 8 * 2 ** 20) # 9_2_5 12901158Szelenkov@nginx.com check_payload(op_binary, 16 * 2 ** 20) # 9_2_6 12911158Szelenkov@nginx.com 1292*1596Szelenkov@nginx.com if option.system != 'Darwin' and option.system != 'FreeBSD': 12931158Szelenkov@nginx.com check_message(op_text, 64) # 9_3_1 12941158Szelenkov@nginx.com check_message(op_text, 256) # 9_3_2 12951158Szelenkov@nginx.com check_message(op_text, 2 ** 10) # 9_3_3 12961158Szelenkov@nginx.com check_message(op_text, 4 * 2 ** 10) # 9_3_4 12971158Szelenkov@nginx.com check_message(op_text, 16 * 2 ** 10) # 9_3_5 12981158Szelenkov@nginx.com check_message(op_text, 64 * 2 ** 10) # 9_3_6 12991158Szelenkov@nginx.com check_message(op_text, 256 * 2 ** 10) # 9_3_7 13001158Szelenkov@nginx.com check_message(op_text, 2 ** 20) # 9_3_8 13011158Szelenkov@nginx.com check_message(op_text, 4 * 2 ** 20) # 9_3_9 13021158Szelenkov@nginx.com 13031158Szelenkov@nginx.com check_message(op_binary, 64) # 9_4_1 13041158Szelenkov@nginx.com check_message(op_binary, 256) # 9_4_2 13051158Szelenkov@nginx.com check_message(op_binary, 2 ** 10) # 9_4_3 13061158Szelenkov@nginx.com check_message(op_binary, 4 * 2 ** 10) # 9_4_4 13071158Szelenkov@nginx.com check_message(op_binary, 16 * 2 ** 10) # 9_4_5 13081158Szelenkov@nginx.com check_message(op_binary, 64 * 2 ** 10) # 9_4_6 13091158Szelenkov@nginx.com check_message(op_binary, 256 * 2 ** 10) # 9_4_7 13101158Szelenkov@nginx.com check_message(op_binary, 2 ** 20) # 9_4_8 13111158Szelenkov@nginx.com check_message(op_binary, 4 * 2 ** 20) # 9_4_9 13121158Szelenkov@nginx.com 13131158Szelenkov@nginx.com check_payload(op_text, 2 ** 20, chopsize=64) # 9_5_1 13141158Szelenkov@nginx.com check_payload(op_text, 2 ** 20, chopsize=128) # 9_5_2 13151158Szelenkov@nginx.com check_payload(op_text, 2 ** 20, chopsize=256) # 9_5_3 13161158Szelenkov@nginx.com check_payload(op_text, 2 ** 20, chopsize=512) # 9_5_4 13171158Szelenkov@nginx.com check_payload(op_text, 2 ** 20, chopsize=1024) # 9_5_5 13181158Szelenkov@nginx.com check_payload(op_text, 2 ** 20, chopsize=2048) # 9_5_6 13191158Szelenkov@nginx.com 13201158Szelenkov@nginx.com check_payload(op_binary, 2 ** 20, chopsize=64) # 9_6_1 13211158Szelenkov@nginx.com check_payload(op_binary, 2 ** 20, chopsize=128) # 9_6_2 13221158Szelenkov@nginx.com check_payload(op_binary, 2 ** 20, chopsize=256) # 9_6_3 13231158Szelenkov@nginx.com check_payload(op_binary, 2 ** 20, chopsize=512) # 9_6_4 13241158Szelenkov@nginx.com check_payload(op_binary, 2 ** 20, chopsize=1024) # 9_6_5 13251158Szelenkov@nginx.com check_payload(op_binary, 2 ** 20, chopsize=2048) # 9_6_6 13261158Szelenkov@nginx.com 13271158Szelenkov@nginx.com self.close_connection(sock) 13281158Szelenkov@nginx.com 13291158Szelenkov@nginx.com def test_java_websockets_10_1_1(self): 13301158Szelenkov@nginx.com self.load('websockets_mirror') 13311158Szelenkov@nginx.com 13321158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 13331158Szelenkov@nginx.com 13341158Szelenkov@nginx.com payload = '*' * 65536 13351158Szelenkov@nginx.com 13361158Szelenkov@nginx.com self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1300) 13371158Szelenkov@nginx.com 13381158Szelenkov@nginx.com frame = self.ws.message_read(sock) 13391158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 13401158Szelenkov@nginx.com 13411158Szelenkov@nginx.com self.close_connection(sock) 13421158Szelenkov@nginx.com 13431158Szelenkov@nginx.com # settings 13441158Szelenkov@nginx.com 13451158Szelenkov@nginx.com def test_java_websockets_max_frame_size(self): 13461158Szelenkov@nginx.com self.load('websockets_mirror') 13471158Szelenkov@nginx.com 1348*1596Szelenkov@nginx.com assert 'success' in self.conf( 1349*1596Szelenkov@nginx.com {'http': {'websocket': {'max_frame_size': 100}}}, 'settings' 1350*1596Szelenkov@nginx.com ), 'configure max_frame_size' 13511158Szelenkov@nginx.com 13521158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 13531158Szelenkov@nginx.com 13541158Szelenkov@nginx.com payload = '*' * 94 13551158Szelenkov@nginx.com opcode = self.ws.OP_TEXT 13561158Szelenkov@nginx.com 13571158Szelenkov@nginx.com self.ws.frame_write(sock, opcode, payload) # frame length is 100 13581158Szelenkov@nginx.com 13591158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 13601158Szelenkov@nginx.com self.check_frame(frame, True, opcode, payload) 13611158Szelenkov@nginx.com 13621158Szelenkov@nginx.com payload = '*' * 95 13631158Szelenkov@nginx.com 13641158Szelenkov@nginx.com self.ws.frame_write(sock, opcode, payload) # frame length is 101 13651158Szelenkov@nginx.com self.check_close(sock, 1009) # 1009 - CLOSE_TOO_LARGE 13661158Szelenkov@nginx.com 13671158Szelenkov@nginx.com def test_java_websockets_read_timeout(self): 13681158Szelenkov@nginx.com self.load('websockets_mirror') 13691158Szelenkov@nginx.com 1370*1596Szelenkov@nginx.com assert 'success' in self.conf( 1371*1596Szelenkov@nginx.com {'http': {'websocket': {'read_timeout': 5}}}, 'settings' 1372*1596Szelenkov@nginx.com ), 'configure read_timeout' 13731158Szelenkov@nginx.com 13741158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 13751158Szelenkov@nginx.com 13761158Szelenkov@nginx.com frame = self.ws.frame_to_send(self.ws.OP_TEXT, 'blah') 13771158Szelenkov@nginx.com sock.sendall(frame[:2]) 13781158Szelenkov@nginx.com 13791158Szelenkov@nginx.com time.sleep(2) 13801158Szelenkov@nginx.com 13811158Szelenkov@nginx.com self.check_close(sock, 1001) # 1001 - CLOSE_GOING_AWAY 13821158Szelenkov@nginx.com 13831158Szelenkov@nginx.com def test_java_websockets_keepalive_interval(self): 13841158Szelenkov@nginx.com self.load('websockets_mirror') 13851158Szelenkov@nginx.com 1386*1596Szelenkov@nginx.com assert 'success' in self.conf( 1387*1596Szelenkov@nginx.com {'http': {'websocket': {'keepalive_interval': 5}}}, 'settings' 1388*1596Szelenkov@nginx.com ), 'configure keepalive_interval' 13891158Szelenkov@nginx.com 13901158Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 13911158Szelenkov@nginx.com 13921158Szelenkov@nginx.com frame = self.ws.frame_to_send(self.ws.OP_TEXT, 'blah') 13931158Szelenkov@nginx.com sock.sendall(frame[:2]) 13941158Szelenkov@nginx.com 13951158Szelenkov@nginx.com time.sleep(2) 13961158Szelenkov@nginx.com 13971158Szelenkov@nginx.com frame = self.ws.frame_read(sock) 13981158Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PING, '') # PING frame 13991158Szelenkov@nginx.com 14001158Szelenkov@nginx.com sock.close() 1401