11130Szelenkov@nginx.comimport time 21130Szelenkov@nginx.comimport struct 31130Szelenkov@nginx.comimport unittest 41130Szelenkov@nginx.comfrom unit.applications.lang.node import TestApplicationNode 51130Szelenkov@nginx.comfrom unit.applications.websockets import TestApplicationWebsocket 61130Szelenkov@nginx.com 71150Szelenkov@nginx.com 81130Szelenkov@nginx.comclass TestNodeWebsockets(TestApplicationNode): 9*1165Szelenkov@nginx.com prerequisites = {'modules': ['node']} 101130Szelenkov@nginx.com 111130Szelenkov@nginx.com ws = TestApplicationWebsocket() 121130Szelenkov@nginx.com 131133Szelenkov@nginx.com def setUp(self): 141133Szelenkov@nginx.com super().setUp() 151133Szelenkov@nginx.com 161138Szelenkov@nginx.com self.assertIn( 171138Szelenkov@nginx.com 'success', 181138Szelenkov@nginx.com self.conf( 191138Szelenkov@nginx.com {'http': {'websocket': {'keepalive_interval': 0}}}, 'settings' 201138Szelenkov@nginx.com ), 211138Szelenkov@nginx.com 'clear keepalive_interval', 221138Szelenkov@nginx.com ) 231138Szelenkov@nginx.com 241133Szelenkov@nginx.com self.skip_alerts.extend( 251150Szelenkov@nginx.com [r'last message send failed', r'socket close\(\d+\) failed'] 261133Szelenkov@nginx.com ) 271130Szelenkov@nginx.com 281130Szelenkov@nginx.com def close_connection(self, sock): 291130Szelenkov@nginx.com self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock') 301130Szelenkov@nginx.com 311130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 321130Szelenkov@nginx.com 331130Szelenkov@nginx.com self.check_close(sock) 341130Szelenkov@nginx.com 351150Szelenkov@nginx.com def check_close(self, sock, code=1000, no_close=False): 361130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 371130Szelenkov@nginx.com 381130Szelenkov@nginx.com self.assertEqual(frame['fin'], True, 'close fin') 391130Szelenkov@nginx.com self.assertEqual(frame['opcode'], self.ws.OP_CLOSE, 'close opcode') 401130Szelenkov@nginx.com self.assertEqual(frame['code'], code, 'close code') 411130Szelenkov@nginx.com 421130Szelenkov@nginx.com if not no_close: 431130Szelenkov@nginx.com sock.close() 441130Szelenkov@nginx.com 451130Szelenkov@nginx.com def check_frame(self, frame, fin, opcode, payload, decode=True): 461130Szelenkov@nginx.com if opcode == self.ws.OP_BINARY or not decode: 471130Szelenkov@nginx.com data = frame['data'] 481130Szelenkov@nginx.com else: 491130Szelenkov@nginx.com data = frame['data'].decode('utf-8') 501130Szelenkov@nginx.com 511130Szelenkov@nginx.com self.assertEqual(frame['fin'], fin, 'fin') 521130Szelenkov@nginx.com self.assertEqual(frame['opcode'], opcode, 'opcode') 531130Szelenkov@nginx.com self.assertEqual(data, payload, 'payload') 541130Szelenkov@nginx.com 551130Szelenkov@nginx.com def test_node_websockets_handshake(self): 561130Szelenkov@nginx.com self.load('websockets/mirror') 571130Szelenkov@nginx.com 581130Szelenkov@nginx.com resp, sock, key = self.ws.upgrade() 591130Szelenkov@nginx.com sock.close() 601130Szelenkov@nginx.com 611130Szelenkov@nginx.com self.assertEqual(resp['status'], 101, 'status') 621150Szelenkov@nginx.com self.assertEqual(resp['headers']['Upgrade'], 'websocket', 'upgrade') 631130Szelenkov@nginx.com self.assertEqual( 641130Szelenkov@nginx.com resp['headers']['Connection'], 'Upgrade', 'connection' 651130Szelenkov@nginx.com ) 661130Szelenkov@nginx.com self.assertEqual( 671130Szelenkov@nginx.com resp['headers']['Sec-WebSocket-Accept'], self.ws.accept(key), 'key' 681130Szelenkov@nginx.com ) 691130Szelenkov@nginx.com 701130Szelenkov@nginx.com def test_node_websockets_mirror(self): 711130Szelenkov@nginx.com self.load('websockets/mirror') 721130Szelenkov@nginx.com 731130Szelenkov@nginx.com message = 'blah' 741130Szelenkov@nginx.com 751130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 761130Szelenkov@nginx.com 771130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, message) 781130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 791130Szelenkov@nginx.com 801150Szelenkov@nginx.com self.assertEqual(message, frame['data'].decode('utf-8'), 'mirror') 811130Szelenkov@nginx.com 821130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, message) 831130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 841130Szelenkov@nginx.com 851150Szelenkov@nginx.com self.assertEqual(message, frame['data'].decode('utf-8'), 'mirror 2') 861130Szelenkov@nginx.com 871130Szelenkov@nginx.com sock.close() 881130Szelenkov@nginx.com 891130Szelenkov@nginx.com def test_node_websockets_no_mask(self): 901130Szelenkov@nginx.com self.load('websockets/mirror') 911130Szelenkov@nginx.com 921130Szelenkov@nginx.com message = 'blah' 931130Szelenkov@nginx.com 941130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 951130Szelenkov@nginx.com 961130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, message, mask=False) 971130Szelenkov@nginx.com 981130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 991130Szelenkov@nginx.com 1001130Szelenkov@nginx.com self.assertEqual(frame['opcode'], self.ws.OP_CLOSE, 'no mask opcode') 1011130Szelenkov@nginx.com self.assertEqual(frame['code'], 1002, 'no mask close code') 1021130Szelenkov@nginx.com 1031130Szelenkov@nginx.com sock.close() 1041130Szelenkov@nginx.com 1051130Szelenkov@nginx.com def test_node_websockets_fragmentation(self): 1061130Szelenkov@nginx.com self.load('websockets/mirror') 1071130Szelenkov@nginx.com 1081130Szelenkov@nginx.com message = 'blah' 1091130Szelenkov@nginx.com 1101130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 1111130Szelenkov@nginx.com 1121130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, message, fin=False) 1131130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, ' ', fin=False) 1141130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, message) 1151130Szelenkov@nginx.com 1161130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 1171130Szelenkov@nginx.com 1181130Szelenkov@nginx.com self.assertEqual( 1191130Szelenkov@nginx.com message + ' ' + message, 1201130Szelenkov@nginx.com frame['data'].decode('utf-8'), 1211130Szelenkov@nginx.com 'mirror framing', 1221130Szelenkov@nginx.com ) 1231130Szelenkov@nginx.com 1241130Szelenkov@nginx.com sock.close() 1251130Szelenkov@nginx.com 1261130Szelenkov@nginx.com def test_node_websockets_frame_fragmentation_invalid(self): 1271130Szelenkov@nginx.com self.load('websockets/mirror') 1281130Szelenkov@nginx.com 1291130Szelenkov@nginx.com message = 'blah' 1301130Szelenkov@nginx.com 1311130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 1321130Szelenkov@nginx.com 1331130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, message, fin=False) 1341130Szelenkov@nginx.com 1351130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 1361130Szelenkov@nginx.com 1371130Szelenkov@nginx.com frame.pop('data') 1381130Szelenkov@nginx.com self.assertDictEqual( 1391130Szelenkov@nginx.com frame, 1401130Szelenkov@nginx.com { 1411130Szelenkov@nginx.com 'fin': True, 1421130Szelenkov@nginx.com 'rsv1': False, 1431130Szelenkov@nginx.com 'rsv2': False, 1441130Szelenkov@nginx.com 'rsv3': False, 1451130Szelenkov@nginx.com 'opcode': self.ws.OP_CLOSE, 1461130Szelenkov@nginx.com 'mask': 0, 1471130Szelenkov@nginx.com 'code': 1002, 1481130Szelenkov@nginx.com 'reason': 'Fragmented control frame', 1491130Szelenkov@nginx.com }, 1501130Szelenkov@nginx.com 'close frame', 1511130Szelenkov@nginx.com ) 1521130Szelenkov@nginx.com 1531130Szelenkov@nginx.com sock.close() 1541130Szelenkov@nginx.com 1551130Szelenkov@nginx.com def test_node_websockets_large(self): 1561130Szelenkov@nginx.com self.load('websockets/mirror_fragmentation') 1571130Szelenkov@nginx.com 1581130Szelenkov@nginx.com message = '0123456789' * 3000 1591130Szelenkov@nginx.com 1601130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 1611130Szelenkov@nginx.com 1621130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, message) 1631130Szelenkov@nginx.com 1641130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 1651130Szelenkov@nginx.com data = frame['data'].decode('utf-8') 1661130Szelenkov@nginx.com 1671130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 1681130Szelenkov@nginx.com data += frame['data'].decode('utf-8') 1691130Szelenkov@nginx.com 1701130Szelenkov@nginx.com self.assertEqual(message, data, 'large') 1711130Szelenkov@nginx.com 1721130Szelenkov@nginx.com sock.close() 1731130Szelenkov@nginx.com 1741130Szelenkov@nginx.com def test_node_websockets_two_clients(self): 1751130Szelenkov@nginx.com self.load('websockets/mirror') 1761130Szelenkov@nginx.com 1771130Szelenkov@nginx.com message1 = 'blah1' 1781130Szelenkov@nginx.com message2 = 'blah2' 1791130Szelenkov@nginx.com 1801130Szelenkov@nginx.com _, sock1, _ = self.ws.upgrade() 1811130Szelenkov@nginx.com _, sock2, _ = self.ws.upgrade() 1821130Szelenkov@nginx.com 1831130Szelenkov@nginx.com self.ws.frame_write(sock1, self.ws.OP_TEXT, message1) 1841130Szelenkov@nginx.com self.ws.frame_write(sock2, self.ws.OP_TEXT, message2) 1851130Szelenkov@nginx.com 1861130Szelenkov@nginx.com frame1 = self.ws.frame_read(sock1) 1871130Szelenkov@nginx.com frame2 = self.ws.frame_read(sock2) 1881130Szelenkov@nginx.com 1891150Szelenkov@nginx.com self.assertEqual(message1, frame1['data'].decode('utf-8'), 'client 1') 1901150Szelenkov@nginx.com self.assertEqual(message2, frame2['data'].decode('utf-8'), 'client 2') 1911130Szelenkov@nginx.com 1921130Szelenkov@nginx.com sock1.close() 1931130Szelenkov@nginx.com sock2.close() 1941130Szelenkov@nginx.com 1951130Szelenkov@nginx.com @unittest.skip('not yet') 1961150Szelenkov@nginx.com def test_node_websockets_handshake_upgrade_absent( 1971150Szelenkov@nginx.com self 1981150Szelenkov@nginx.com ): # FAIL https://tools.ietf.org/html/rfc6455#section-4.2.1 1991130Szelenkov@nginx.com self.load('websockets/mirror') 2001130Szelenkov@nginx.com 2011130Szelenkov@nginx.com key = self.ws.key() 2021150Szelenkov@nginx.com resp = self.get( 2031150Szelenkov@nginx.com headers={ 2041150Szelenkov@nginx.com 'Host': 'localhost', 2051150Szelenkov@nginx.com 'Connection': 'Upgrade', 2061150Szelenkov@nginx.com 'Sec-WebSocket-Key': key, 2071150Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2081150Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2091150Szelenkov@nginx.com }, 2101150Szelenkov@nginx.com read_timeout=1, 2111150Szelenkov@nginx.com ) 2121130Szelenkov@nginx.com 2131130Szelenkov@nginx.com self.assertEqual(resp['status'], 400, 'upgrade absent') 2141130Szelenkov@nginx.com 2151130Szelenkov@nginx.com def test_node_websockets_handshake_case_insensitive(self): 2161130Szelenkov@nginx.com self.load('websockets/mirror') 2171130Szelenkov@nginx.com 2181130Szelenkov@nginx.com key = self.ws.key() 2191150Szelenkov@nginx.com resp = self.get( 2201150Szelenkov@nginx.com headers={ 2211150Szelenkov@nginx.com 'Host': 'localhost', 2221150Szelenkov@nginx.com 'Upgrade': 'WEBSOCKET', 2231150Szelenkov@nginx.com 'Connection': 'UPGRADE', 2241150Szelenkov@nginx.com 'Sec-WebSocket-Key': key, 2251150Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2261150Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2271150Szelenkov@nginx.com }, 2281150Szelenkov@nginx.com read_timeout=1, 2291150Szelenkov@nginx.com ) 2301130Szelenkov@nginx.com 2311130Szelenkov@nginx.com self.assertEqual(resp['status'], 101, 'status') 2321130Szelenkov@nginx.com 2331130Szelenkov@nginx.com @unittest.skip('not yet') 2341150Szelenkov@nginx.com def test_node_websockets_handshake_connection_absent(self): # FAIL 2351130Szelenkov@nginx.com self.load('websockets/mirror') 2361130Szelenkov@nginx.com 2371130Szelenkov@nginx.com key = self.ws.key() 2381150Szelenkov@nginx.com resp = self.get( 2391150Szelenkov@nginx.com headers={ 2401150Szelenkov@nginx.com 'Host': 'localhost', 2411150Szelenkov@nginx.com 'Upgrade': 'websocket', 2421150Szelenkov@nginx.com 'Sec-WebSocket-Key': key, 2431150Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2441150Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2451150Szelenkov@nginx.com }, 2461150Szelenkov@nginx.com read_timeout=1, 2471150Szelenkov@nginx.com ) 2481130Szelenkov@nginx.com 2491130Szelenkov@nginx.com self.assertEqual(resp['status'], 400, 'status') 2501130Szelenkov@nginx.com 2511130Szelenkov@nginx.com def test_node_websockets_handshake_version_absent(self): 2521130Szelenkov@nginx.com self.load('websockets/mirror') 2531130Szelenkov@nginx.com 2541130Szelenkov@nginx.com key = self.ws.key() 2551150Szelenkov@nginx.com resp = self.get( 2561150Szelenkov@nginx.com headers={ 2571150Szelenkov@nginx.com 'Host': 'localhost', 2581150Szelenkov@nginx.com 'Upgrade': 'websocket', 2591150Szelenkov@nginx.com 'Connection': 'Upgrade', 2601150Szelenkov@nginx.com 'Sec-WebSocket-Key': key, 2611150Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2621150Szelenkov@nginx.com }, 2631150Szelenkov@nginx.com read_timeout=1, 2641150Szelenkov@nginx.com ) 2651130Szelenkov@nginx.com 2661130Szelenkov@nginx.com self.assertEqual(resp['status'], 426, 'status') 2671130Szelenkov@nginx.com 2681130Szelenkov@nginx.com @unittest.skip('not yet') 2691130Szelenkov@nginx.com def test_node_websockets_handshake_key_invalid(self): 2701130Szelenkov@nginx.com self.load('websockets/mirror') 2711130Szelenkov@nginx.com 2721150Szelenkov@nginx.com resp = self.get( 2731150Szelenkov@nginx.com headers={ 2741150Szelenkov@nginx.com 'Host': 'localhost', 2751150Szelenkov@nginx.com 'Upgrade': 'websocket', 2761150Szelenkov@nginx.com 'Connection': 'Upgrade', 2771150Szelenkov@nginx.com 'Sec-WebSocket-Key': '!', 2781150Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2791150Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2801150Szelenkov@nginx.com }, 2811150Szelenkov@nginx.com read_timeout=1, 2821150Szelenkov@nginx.com ) 2831130Szelenkov@nginx.com 2841130Szelenkov@nginx.com self.assertEqual(resp['status'], 400, 'key length') 2851130Szelenkov@nginx.com 2861130Szelenkov@nginx.com key = self.ws.key() 2871150Szelenkov@nginx.com resp = self.get( 2881150Szelenkov@nginx.com headers={ 2891150Szelenkov@nginx.com 'Host': 'localhost', 2901150Szelenkov@nginx.com 'Upgrade': 'websocket', 2911150Szelenkov@nginx.com 'Connection': 'Upgrade', 2921150Szelenkov@nginx.com 'Sec-WebSocket-Key': [key, key], 2931150Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2941150Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2951150Szelenkov@nginx.com }, 2961150Szelenkov@nginx.com read_timeout=1, 2971150Szelenkov@nginx.com ) 2981130Szelenkov@nginx.com 2991150Szelenkov@nginx.com self.assertEqual( 3001150Szelenkov@nginx.com resp['status'], 400, 'key double' 3011150Szelenkov@nginx.com ) # FAIL https://tools.ietf.org/html/rfc6455#section-11.3.1 3021130Szelenkov@nginx.com 3031130Szelenkov@nginx.com def test_node_websockets_handshake_method_invalid(self): 3041130Szelenkov@nginx.com self.load('websockets/mirror') 3051130Szelenkov@nginx.com 3061130Szelenkov@nginx.com key = self.ws.key() 3071150Szelenkov@nginx.com resp = self.post( 3081150Szelenkov@nginx.com headers={ 3091150Szelenkov@nginx.com 'Host': 'localhost', 3101150Szelenkov@nginx.com 'Upgrade': 'websocket', 3111150Szelenkov@nginx.com 'Connection': 'Upgrade', 3121150Szelenkov@nginx.com 'Sec-WebSocket-Key': key, 3131150Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 3141150Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 3151150Szelenkov@nginx.com }, 3161150Szelenkov@nginx.com read_timeout=1, 3171150Szelenkov@nginx.com ) 3181130Szelenkov@nginx.com 3191130Szelenkov@nginx.com self.assertEqual(resp['status'], 400, 'status') 3201130Szelenkov@nginx.com 3211130Szelenkov@nginx.com def test_node_websockets_handshake_http_10(self): 3221130Szelenkov@nginx.com self.load('websockets/mirror') 3231130Szelenkov@nginx.com 3241130Szelenkov@nginx.com key = self.ws.key() 3251150Szelenkov@nginx.com resp = self.get( 3261150Szelenkov@nginx.com headers={ 3271150Szelenkov@nginx.com 'Host': 'localhost', 3281150Szelenkov@nginx.com 'Upgrade': 'websocket', 3291150Szelenkov@nginx.com 'Connection': 'Upgrade', 3301150Szelenkov@nginx.com 'Sec-WebSocket-Key': key, 3311150Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 3321150Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 3331150Szelenkov@nginx.com }, 3341150Szelenkov@nginx.com http_10=True, 3351150Szelenkov@nginx.com read_timeout=1, 3361150Szelenkov@nginx.com ) 3371130Szelenkov@nginx.com 3381130Szelenkov@nginx.com self.assertEqual(resp['status'], 400, 'status') 3391130Szelenkov@nginx.com 3401130Szelenkov@nginx.com def test_node_websockets_handshake_uri_invalid(self): 3411130Szelenkov@nginx.com self.load('websockets/mirror') 3421130Szelenkov@nginx.com 3431130Szelenkov@nginx.com key = self.ws.key() 3441150Szelenkov@nginx.com resp = self.get( 3451150Szelenkov@nginx.com headers={ 3461150Szelenkov@nginx.com 'Host': 'localhost', 3471150Szelenkov@nginx.com 'Upgrade': 'websocket', 3481150Szelenkov@nginx.com 'Connection': 'Upgrade', 3491150Szelenkov@nginx.com 'Sec-WebSocket-Key': key, 3501150Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 3511150Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 3521150Szelenkov@nginx.com }, 3531150Szelenkov@nginx.com url='!', 3541150Szelenkov@nginx.com read_timeout=1, 3551150Szelenkov@nginx.com ) 3561130Szelenkov@nginx.com 3571130Szelenkov@nginx.com self.assertEqual(resp['status'], 400, 'status') 3581130Szelenkov@nginx.com 3591130Szelenkov@nginx.com def test_node_websockets_protocol_absent(self): 3601130Szelenkov@nginx.com self.load('websockets/mirror') 3611130Szelenkov@nginx.com 3621130Szelenkov@nginx.com key = self.ws.key() 3631150Szelenkov@nginx.com resp = self.get( 3641150Szelenkov@nginx.com headers={ 3651150Szelenkov@nginx.com 'Host': 'localhost', 3661150Szelenkov@nginx.com 'Upgrade': 'websocket', 3671150Szelenkov@nginx.com 'Connection': 'Upgrade', 3681150Szelenkov@nginx.com 'Sec-WebSocket-Key': key, 3691150Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 3701150Szelenkov@nginx.com }, 3711150Szelenkov@nginx.com read_timeout=1, 3721150Szelenkov@nginx.com ) 3731130Szelenkov@nginx.com 3741130Szelenkov@nginx.com self.assertEqual(resp['status'], 101, 'status') 3751150Szelenkov@nginx.com self.assertEqual(resp['headers']['Upgrade'], 'websocket', 'upgrade') 3761130Szelenkov@nginx.com self.assertEqual( 3771130Szelenkov@nginx.com resp['headers']['Connection'], 'Upgrade', 'connection' 3781130Szelenkov@nginx.com ) 3791130Szelenkov@nginx.com self.assertEqual( 3801130Szelenkov@nginx.com resp['headers']['Sec-WebSocket-Accept'], self.ws.accept(key), 'key' 3811130Szelenkov@nginx.com ) 3821130Szelenkov@nginx.com 3831130Szelenkov@nginx.com # autobahn-testsuite 3841150Szelenkov@nginx.com # 3851130Szelenkov@nginx.com # Some following tests fail because of Unit does not support UTF-8 3861130Szelenkov@nginx.com # validation for websocket frames. It should be implemented 3871130Szelenkov@nginx.com # by application, if necessary. 3881130Szelenkov@nginx.com 3891130Szelenkov@nginx.com def test_node_websockets_1_1_1__1_1_8(self): 3901130Szelenkov@nginx.com self.load('websockets/mirror') 3911130Szelenkov@nginx.com 3921130Szelenkov@nginx.com opcode = self.ws.OP_TEXT 3931130Szelenkov@nginx.com 3941130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 3951130Szelenkov@nginx.com 3961130Szelenkov@nginx.com def check_length(length, chopsize=None): 3971130Szelenkov@nginx.com payload = '*' * length 3981130Szelenkov@nginx.com 3991130Szelenkov@nginx.com self.ws.frame_write(sock, opcode, payload, chopsize=chopsize) 4001130Szelenkov@nginx.com 4011130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 4021130Szelenkov@nginx.com self.check_frame(frame, True, opcode, payload) 4031130Szelenkov@nginx.com 4041130Szelenkov@nginx.com check_length(0) # 1_1_1 4051130Szelenkov@nginx.com check_length(125) # 1_1_2 4061130Szelenkov@nginx.com check_length(126) # 1_1_3 4071130Szelenkov@nginx.com check_length(127) # 1_1_4 4081130Szelenkov@nginx.com check_length(128) # 1_1_5 4091130Szelenkov@nginx.com check_length(65535) # 1_1_6 4101130Szelenkov@nginx.com check_length(65536) # 1_1_7 4111130Szelenkov@nginx.com check_length(65536, chopsize = 997) # 1_1_8 4121130Szelenkov@nginx.com 4131130Szelenkov@nginx.com self.close_connection(sock) 4141130Szelenkov@nginx.com 4151130Szelenkov@nginx.com def test_node_websockets_1_2_1__1_2_8(self): 4161130Szelenkov@nginx.com self.load('websockets/mirror') 4171130Szelenkov@nginx.com 4181130Szelenkov@nginx.com opcode = self.ws.OP_BINARY 4191130Szelenkov@nginx.com 4201130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 4211130Szelenkov@nginx.com 4221130Szelenkov@nginx.com def check_length(length, chopsize=None): 4231130Szelenkov@nginx.com payload = b'\xfe' * length 4241130Szelenkov@nginx.com 4251130Szelenkov@nginx.com self.ws.frame_write(sock, opcode, payload, chopsize=chopsize) 4261130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 4271130Szelenkov@nginx.com 4281130Szelenkov@nginx.com self.check_frame(frame, True, opcode, payload) 4291130Szelenkov@nginx.com 4301130Szelenkov@nginx.com check_length(0) # 1_2_1 4311130Szelenkov@nginx.com check_length(125) # 1_2_2 4321130Szelenkov@nginx.com check_length(126) # 1_2_3 4331130Szelenkov@nginx.com check_length(127) # 1_2_4 4341130Szelenkov@nginx.com check_length(128) # 1_2_5 4351130Szelenkov@nginx.com check_length(65535) # 1_2_6 4361130Szelenkov@nginx.com check_length(65536) # 1_2_7 4371130Szelenkov@nginx.com check_length(65536, chopsize = 997) # 1_2_8 4381130Szelenkov@nginx.com 4391130Szelenkov@nginx.com self.close_connection(sock) 4401130Szelenkov@nginx.com 4411130Szelenkov@nginx.com def test_node_websockets_2_1__2_6(self): 4421130Szelenkov@nginx.com self.load('websockets/mirror') 4431130Szelenkov@nginx.com 4441130Szelenkov@nginx.com op_ping = self.ws.OP_PING 4451130Szelenkov@nginx.com op_pong = self.ws.OP_PONG 4461130Szelenkov@nginx.com 4471130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 4481130Szelenkov@nginx.com 4491130Szelenkov@nginx.com def check_ping(payload, chopsize=None, decode=True): 4501130Szelenkov@nginx.com self.ws.frame_write(sock, op_ping, payload, chopsize=chopsize) 4511130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 4521130Szelenkov@nginx.com 4531130Szelenkov@nginx.com self.check_frame(frame, True, op_pong, payload, decode=decode) 4541130Szelenkov@nginx.com 4551130Szelenkov@nginx.com check_ping('') # 2_1 4561130Szelenkov@nginx.com check_ping('Hello, world!') # 2_2 4571130Szelenkov@nginx.com check_ping(b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff', decode=False) # 2_3 4581130Szelenkov@nginx.com check_ping(b'\xfe' * 125, decode=False) # 2_4 4591130Szelenkov@nginx.com check_ping(b'\xfe' * 125, chopsize=1, decode=False) # 2_6 4601130Szelenkov@nginx.com 4611130Szelenkov@nginx.com self.close_connection(sock) 4621130Szelenkov@nginx.com 4631130Szelenkov@nginx.com # 2_5 4641130Szelenkov@nginx.com 4651130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 4661130Szelenkov@nginx.com 4671130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, b'\xfe' * 126) 4681130Szelenkov@nginx.com self.check_close(sock, 1002) 4691130Szelenkov@nginx.com 4701130Szelenkov@nginx.com def test_node_websockets_2_7__2_9(self): 4711130Szelenkov@nginx.com self.load('websockets/mirror') 4721130Szelenkov@nginx.com 4731130Szelenkov@nginx.com # 2_7 4741130Szelenkov@nginx.com 4751130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 4761130Szelenkov@nginx.com 4771130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PONG, '') 4781130Szelenkov@nginx.com self.assertEqual(self.recvall(sock, read_timeout=1), b'', '2_7') 4791130Szelenkov@nginx.com 4801130Szelenkov@nginx.com # 2_8 4811130Szelenkov@nginx.com 4821130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PONG, 'unsolicited pong payload') 4831130Szelenkov@nginx.com self.assertEqual(self.recvall(sock, read_timeout=1), b'', '2_8') 4841130Szelenkov@nginx.com 4851130Szelenkov@nginx.com # 2_9 4861130Szelenkov@nginx.com 4871130Szelenkov@nginx.com payload = 'ping payload' 4881130Szelenkov@nginx.com 4891130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PONG, 'unsolicited pong payload') 4901130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, payload) 4911130Szelenkov@nginx.com 4921130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 4931130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, payload) 4941130Szelenkov@nginx.com 4951130Szelenkov@nginx.com self.close_connection(sock) 4961130Szelenkov@nginx.com 4971130Szelenkov@nginx.com def test_node_websockets_2_10__2_11(self): 4981130Szelenkov@nginx.com self.load('websockets/mirror') 4991130Szelenkov@nginx.com 5001130Szelenkov@nginx.com # 2_10 5011130Szelenkov@nginx.com 5021130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5031130Szelenkov@nginx.com 5041130Szelenkov@nginx.com for i in range(0, 10): 5051130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'payload-%d' % i) 5061130Szelenkov@nginx.com 5071130Szelenkov@nginx.com for i in range(0, 10): 5081130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 5091130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, 'payload-%d' % i) 5101130Szelenkov@nginx.com 5111130Szelenkov@nginx.com # 2_11 5121130Szelenkov@nginx.com 5131130Szelenkov@nginx.com for i in range(0, 10): 5141130Szelenkov@nginx.com opcode = self.ws.OP_PING 5151130Szelenkov@nginx.com self.ws.frame_write(sock, opcode, 'payload-%d' % i, chopsize=1) 5161130Szelenkov@nginx.com 5171130Szelenkov@nginx.com for i in range(0, 10): 5181130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 5191130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, 'payload-%d' % i) 5201130Szelenkov@nginx.com 5211130Szelenkov@nginx.com self.close_connection(sock) 5221130Szelenkov@nginx.com 5231130Szelenkov@nginx.com @unittest.skip('not yet') 5241130Szelenkov@nginx.com def test_node_websockets_3_1__3_7(self): 5251130Szelenkov@nginx.com self.load('websockets/mirror') 5261130Szelenkov@nginx.com 5271130Szelenkov@nginx.com payload = 'Hello, world!' 5281130Szelenkov@nginx.com 5291130Szelenkov@nginx.com # 3_1 5301130Szelenkov@nginx.com 5311130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5321130Szelenkov@nginx.com 5331130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload, rsv1=True) 5341130Szelenkov@nginx.com self.check_close(sock, 1002) 5351130Szelenkov@nginx.com 5361130Szelenkov@nginx.com # 3_2 5371130Szelenkov@nginx.com 5381130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5391130Szelenkov@nginx.com 5401130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 5411130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload, rsv2=True) 5421130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 5431130Szelenkov@nginx.com 5441130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 5451130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 5461130Szelenkov@nginx.com 5471150Szelenkov@nginx.com self.check_close(sock, 1002, no_close=True) 5481130Szelenkov@nginx.com 5491130Szelenkov@nginx.com self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty 3_2') 5501130Szelenkov@nginx.com sock.close() 5511130Szelenkov@nginx.com 5521130Szelenkov@nginx.com # 3_3 5531130Szelenkov@nginx.com 5541130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5551130Szelenkov@nginx.com 5561130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 5571130Szelenkov@nginx.com 5581130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 5591130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 5601130Szelenkov@nginx.com 5611130Szelenkov@nginx.com self.ws.frame_write( 5621150Szelenkov@nginx.com sock, self.ws.OP_TEXT, payload, rsv1=True, rsv2=True 5631130Szelenkov@nginx.com ) 5641130Szelenkov@nginx.com 5651150Szelenkov@nginx.com self.check_close(sock, 1002, no_close=True) 5661130Szelenkov@nginx.com 5671130Szelenkov@nginx.com self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty 3_3') 5681130Szelenkov@nginx.com sock.close() 5691130Szelenkov@nginx.com 5701130Szelenkov@nginx.com # 3_4 5711130Szelenkov@nginx.com 5721130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5731130Szelenkov@nginx.com 5741130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1) 5751130Szelenkov@nginx.com self.ws.frame_write( 5761150Szelenkov@nginx.com sock, self.ws.OP_TEXT, payload, rsv3=True, chopsize=1 5771130Szelenkov@nginx.com ) 5781130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 5791130Szelenkov@nginx.com 5801130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 5811130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 5821130Szelenkov@nginx.com 5831150Szelenkov@nginx.com self.check_close(sock, 1002, no_close=True) 5841130Szelenkov@nginx.com 5851130Szelenkov@nginx.com self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty 3_4') 5861130Szelenkov@nginx.com sock.close() 5871130Szelenkov@nginx.com 5881130Szelenkov@nginx.com # 3_5 5891130Szelenkov@nginx.com 5901130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 5911130Szelenkov@nginx.com 5921130Szelenkov@nginx.com self.ws.frame_write( 5931130Szelenkov@nginx.com sock, 5941130Szelenkov@nginx.com self.ws.OP_BINARY, 5951130Szelenkov@nginx.com b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff', 5961130Szelenkov@nginx.com rsv1=True, 5971130Szelenkov@nginx.com rsv3=True, 5981130Szelenkov@nginx.com ) 5991130Szelenkov@nginx.com 6001130Szelenkov@nginx.com self.check_close(sock, 1002) 6011130Szelenkov@nginx.com 6021130Szelenkov@nginx.com # 3_6 6031130Szelenkov@nginx.com 6041130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6051130Szelenkov@nginx.com 6061130Szelenkov@nginx.com self.ws.frame_write( 6071150Szelenkov@nginx.com sock, self.ws.OP_PING, payload, rsv2=True, rsv3=True 6081130Szelenkov@nginx.com ) 6091130Szelenkov@nginx.com 6101130Szelenkov@nginx.com self.check_close(sock, 1002) 6111130Szelenkov@nginx.com 6121130Szelenkov@nginx.com # 3_7 6131130Szelenkov@nginx.com 6141130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6151130Szelenkov@nginx.com 6161130Szelenkov@nginx.com self.ws.frame_write( 6171150Szelenkov@nginx.com sock, self.ws.OP_CLOSE, payload, rsv1=True, rsv2=True, rsv3=True 6181130Szelenkov@nginx.com ) 6191130Szelenkov@nginx.com 6201130Szelenkov@nginx.com self.check_close(sock, 1002) 6211130Szelenkov@nginx.com 6221130Szelenkov@nginx.com def test_node_websockets_4_1_1__4_2_5(self): 6231130Szelenkov@nginx.com self.load('websockets/mirror') 6241130Szelenkov@nginx.com 6251130Szelenkov@nginx.com payload = 'Hello, world!' 6261130Szelenkov@nginx.com 6271130Szelenkov@nginx.com # 4_1_1 6281130Szelenkov@nginx.com 6291130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6301130Szelenkov@nginx.com 6311130Szelenkov@nginx.com self.ws.frame_write(sock, 0x03, '') 6321130Szelenkov@nginx.com self.check_close(sock, 1002) 6331130Szelenkov@nginx.com 6341130Szelenkov@nginx.com # 4_1_2 6351130Szelenkov@nginx.com 6361130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6371130Szelenkov@nginx.com 6381130Szelenkov@nginx.com self.ws.frame_write(sock, 0x04, 'reserved opcode payload') 6391130Szelenkov@nginx.com self.check_close(sock, 1002) 6401130Szelenkov@nginx.com 6411130Szelenkov@nginx.com # 4_1_3 6421130Szelenkov@nginx.com 6431130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6441130Szelenkov@nginx.com 6451130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 6461130Szelenkov@nginx.com 6471130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 6481130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 6491130Szelenkov@nginx.com 6501130Szelenkov@nginx.com self.ws.frame_write(sock, 0x05, '') 6511130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 6521130Szelenkov@nginx.com 6531130Szelenkov@nginx.com self.check_close(sock, 1002) 6541130Szelenkov@nginx.com 6551130Szelenkov@nginx.com # 4_1_4 6561130Szelenkov@nginx.com 6571130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6581130Szelenkov@nginx.com 6591130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 6601130Szelenkov@nginx.com 6611130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 6621130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 6631130Szelenkov@nginx.com 6641130Szelenkov@nginx.com self.ws.frame_write(sock, 0x06, payload) 6651130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 6661130Szelenkov@nginx.com 6671130Szelenkov@nginx.com self.check_close(sock, 1002) 6681130Szelenkov@nginx.com 6691130Szelenkov@nginx.com # 4_1_5 6701130Szelenkov@nginx.com 6711130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6721130Szelenkov@nginx.com 6731130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1) 6741130Szelenkov@nginx.com 6751130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 6761130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 6771130Szelenkov@nginx.com 6781130Szelenkov@nginx.com self.ws.frame_write(sock, 0x07, payload, chopsize=1) 6791130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 6801130Szelenkov@nginx.com 6811130Szelenkov@nginx.com self.check_close(sock, 1002) 6821130Szelenkov@nginx.com 6831130Szelenkov@nginx.com # 4_2_1 6841130Szelenkov@nginx.com 6851130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6861130Szelenkov@nginx.com 6871130Szelenkov@nginx.com self.ws.frame_write(sock, 0x0B, '') 6881130Szelenkov@nginx.com self.check_close(sock, 1002) 6891130Szelenkov@nginx.com 6901130Szelenkov@nginx.com # 4_2_2 6911130Szelenkov@nginx.com 6921130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 6931130Szelenkov@nginx.com 6941130Szelenkov@nginx.com self.ws.frame_write(sock, 0x0C, 'reserved opcode payload') 6951130Szelenkov@nginx.com self.check_close(sock, 1002) 6961130Szelenkov@nginx.com 6971130Szelenkov@nginx.com # 4_2_3 6981130Szelenkov@nginx.com 6991130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 7001130Szelenkov@nginx.com 7011130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 7021130Szelenkov@nginx.com 7031130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7041130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 7051130Szelenkov@nginx.com 7061130Szelenkov@nginx.com self.ws.frame_write(sock, 0x0D, '') 7071130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 7081130Szelenkov@nginx.com 7091130Szelenkov@nginx.com self.check_close(sock, 1002) 7101130Szelenkov@nginx.com 7111130Szelenkov@nginx.com # 4_2_4 7121130Szelenkov@nginx.com 7131130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 7141130Szelenkov@nginx.com 7151130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 7161130Szelenkov@nginx.com 7171130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7181130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 7191130Szelenkov@nginx.com 7201130Szelenkov@nginx.com self.ws.frame_write(sock, 0x0E, payload) 7211130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 7221130Szelenkov@nginx.com 7231130Szelenkov@nginx.com self.check_close(sock, 1002) 7241130Szelenkov@nginx.com 7251130Szelenkov@nginx.com # 4_2_5 7261130Szelenkov@nginx.com 7271130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 7281130Szelenkov@nginx.com 7291130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1) 7301130Szelenkov@nginx.com 7311130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7321130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 7331130Szelenkov@nginx.com 7341130Szelenkov@nginx.com self.ws.frame_write(sock, 0x0F, payload, chopsize=1) 7351130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 7361130Szelenkov@nginx.com 7371130Szelenkov@nginx.com self.check_close(sock, 1002) 7381130Szelenkov@nginx.com 7391130Szelenkov@nginx.com def test_node_websockets_5_1__5_20(self): 7401130Szelenkov@nginx.com self.load('websockets/mirror') 7411130Szelenkov@nginx.com 7421130Szelenkov@nginx.com # 5_1 7431130Szelenkov@nginx.com 7441130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 7451130Szelenkov@nginx.com 7461130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'fragment1', fin=False) 7471130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 7481130Szelenkov@nginx.com self.check_close(sock, 1002) 7491130Szelenkov@nginx.com 7501130Szelenkov@nginx.com # 5_2 7511130Szelenkov@nginx.com 7521130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 7531130Szelenkov@nginx.com 7541130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PONG, 'fragment1', fin=False) 7551130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 7561130Szelenkov@nginx.com self.check_close(sock, 1002) 7571130Szelenkov@nginx.com 7581130Szelenkov@nginx.com # 5_3 7591130Szelenkov@nginx.com 7601130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 7611130Szelenkov@nginx.com 7621130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 7631130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 7641130Szelenkov@nginx.com 7651130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7661130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 7671130Szelenkov@nginx.com 7681130Szelenkov@nginx.com # 5_4 7691130Szelenkov@nginx.com 7701130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 7711130Szelenkov@nginx.com self.assertEqual(self.recvall(sock, read_timeout=1), b'', '5_4') 7721130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 7731130Szelenkov@nginx.com 7741130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7751130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 7761130Szelenkov@nginx.com 7771130Szelenkov@nginx.com # 5_5 7781130Szelenkov@nginx.com 7791130Szelenkov@nginx.com self.ws.frame_write( 7801150Szelenkov@nginx.com sock, self.ws.OP_TEXT, 'fragment1', fin=False, chopsize=1 7811130Szelenkov@nginx.com ) 7821130Szelenkov@nginx.com self.ws.frame_write( 7831150Szelenkov@nginx.com sock, self.ws.OP_CONT, 'fragment2', fin=True, chopsize=1 7841130Szelenkov@nginx.com ) 7851130Szelenkov@nginx.com 7861130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7871130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 7881130Szelenkov@nginx.com 7891130Szelenkov@nginx.com # 5_6 7901130Szelenkov@nginx.com 7911130Szelenkov@nginx.com ping_payload = 'ping payload' 7921130Szelenkov@nginx.com 7931130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 7941130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, ping_payload) 7951130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 7961130Szelenkov@nginx.com 7971130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 7981130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, ping_payload) 7991130Szelenkov@nginx.com 8001130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 8011130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 8021130Szelenkov@nginx.com 8031130Szelenkov@nginx.com # 5_7 8041130Szelenkov@nginx.com 8051130Szelenkov@nginx.com ping_payload = 'ping payload' 8061130Szelenkov@nginx.com 8071130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 8081130Szelenkov@nginx.com self.assertEqual(self.recvall(sock, read_timeout=1), b'', '5_7') 8091130Szelenkov@nginx.com 8101130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, ping_payload) 8111130Szelenkov@nginx.com 8121130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 8131130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, ping_payload) 8141130Szelenkov@nginx.com 8151130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 8161130Szelenkov@nginx.com 8171130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 8181130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 8191130Szelenkov@nginx.com 8201130Szelenkov@nginx.com # 5_8 8211130Szelenkov@nginx.com 8221130Szelenkov@nginx.com ping_payload = 'ping payload' 8231130Szelenkov@nginx.com 8241130Szelenkov@nginx.com self.ws.frame_write( 8251150Szelenkov@nginx.com sock, self.ws.OP_TEXT, 'fragment1', fin=False, chopsize=1 8261130Szelenkov@nginx.com ) 8271130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, ping_payload, chopsize=1) 8281130Szelenkov@nginx.com self.ws.frame_write( 8291150Szelenkov@nginx.com sock, self.ws.OP_CONT, 'fragment2', fin=True, chopsize=1 8301130Szelenkov@nginx.com ) 8311130Szelenkov@nginx.com 8321130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 8331130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, ping_payload) 8341130Szelenkov@nginx.com 8351130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 8361130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 8371130Szelenkov@nginx.com 8381130Szelenkov@nginx.com # 5_9 8391130Szelenkov@nginx.com 8401130Szelenkov@nginx.com self.ws.frame_write( 8411150Szelenkov@nginx.com sock, self.ws.OP_CONT, 'non-continuation payload', fin=True 8421130Szelenkov@nginx.com ) 8431130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True) 8441130Szelenkov@nginx.com self.check_close(sock, 1002) 8451130Szelenkov@nginx.com 8461130Szelenkov@nginx.com # 5_10 8471130Szelenkov@nginx.com 8481130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8491130Szelenkov@nginx.com 8501130Szelenkov@nginx.com self.ws.frame_write( 8511150Szelenkov@nginx.com sock, self.ws.OP_CONT, 'non-continuation payload', fin=True 8521130Szelenkov@nginx.com ) 8531130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True) 8541130Szelenkov@nginx.com self.check_close(sock, 1002) 8551130Szelenkov@nginx.com 8561130Szelenkov@nginx.com # 5_11 8571130Szelenkov@nginx.com 8581130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8591130Szelenkov@nginx.com 8601130Szelenkov@nginx.com self.ws.frame_write( 8611130Szelenkov@nginx.com sock, 8621130Szelenkov@nginx.com self.ws.OP_CONT, 8631130Szelenkov@nginx.com 'non-continuation payload', 8641130Szelenkov@nginx.com fin=True, 8651130Szelenkov@nginx.com chopsize=1, 8661130Szelenkov@nginx.com ) 8671130Szelenkov@nginx.com self.ws.frame_write( 8681150Szelenkov@nginx.com sock, self.ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1 8691130Szelenkov@nginx.com ) 8701130Szelenkov@nginx.com self.check_close(sock, 1002) 8711130Szelenkov@nginx.com 8721130Szelenkov@nginx.com # 5_12 8731130Szelenkov@nginx.com 8741130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8751130Szelenkov@nginx.com 8761130Szelenkov@nginx.com self.ws.frame_write( 8771150Szelenkov@nginx.com sock, self.ws.OP_CONT, 'non-continuation payload', fin=False 8781130Szelenkov@nginx.com ) 8791130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True) 8801130Szelenkov@nginx.com self.check_close(sock, 1002) 8811130Szelenkov@nginx.com 8821130Szelenkov@nginx.com # 5_13 8831130Szelenkov@nginx.com 8841130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8851130Szelenkov@nginx.com 8861130Szelenkov@nginx.com self.ws.frame_write( 8871150Szelenkov@nginx.com sock, self.ws.OP_CONT, 'non-continuation payload', fin=False 8881130Szelenkov@nginx.com ) 8891130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True) 8901130Szelenkov@nginx.com self.check_close(sock, 1002) 8911130Szelenkov@nginx.com 8921130Szelenkov@nginx.com # 5_14 8931130Szelenkov@nginx.com 8941130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 8951130Szelenkov@nginx.com 8961130Szelenkov@nginx.com self.ws.frame_write( 8971130Szelenkov@nginx.com sock, 8981130Szelenkov@nginx.com self.ws.OP_CONT, 8991130Szelenkov@nginx.com 'non-continuation payload', 9001130Szelenkov@nginx.com fin=False, 9011130Szelenkov@nginx.com chopsize=1, 9021130Szelenkov@nginx.com ) 9031130Szelenkov@nginx.com self.ws.frame_write( 9041150Szelenkov@nginx.com sock, self.ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1 9051130Szelenkov@nginx.com ) 9061130Szelenkov@nginx.com self.check_close(sock, 1002) 9071130Szelenkov@nginx.com 9081130Szelenkov@nginx.com # 5_15 9091130Szelenkov@nginx.com 9101130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 9111130Szelenkov@nginx.com 9121130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 9131130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 9141130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False) 9151130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment4', fin=True) 9161130Szelenkov@nginx.com self.check_close(sock, 1002) 9171130Szelenkov@nginx.com 9181130Szelenkov@nginx.com # 5_16 9191130Szelenkov@nginx.com 9201130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 9211130Szelenkov@nginx.com 9221130Szelenkov@nginx.com for i in range(0, 2): 9231130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment1', fin=False) 9241130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2', fin=False) 9251130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=True) 9261130Szelenkov@nginx.com self.check_close(sock, 1002) 9271130Szelenkov@nginx.com 9281130Szelenkov@nginx.com # 5_17 9291130Szelenkov@nginx.com 9301130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 9311130Szelenkov@nginx.com 9321130Szelenkov@nginx.com for i in range(0, 2): 9331130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment1', fin=True) 9341130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2', fin=False) 9351130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=True) 9361130Szelenkov@nginx.com self.check_close(sock, 1002) 9371130Szelenkov@nginx.com 9381130Szelenkov@nginx.com # 5_18 9391130Szelenkov@nginx.com 9401130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 9411130Szelenkov@nginx.com 9421130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 9431130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2') 9441130Szelenkov@nginx.com self.check_close(sock, 1002) 9451130Szelenkov@nginx.com 9461130Szelenkov@nginx.com # 5_19 9471130Szelenkov@nginx.com 9481130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 9491130Szelenkov@nginx.com 9501130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 9511130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=False) 9521130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 1!') 9531130Szelenkov@nginx.com 9541130Szelenkov@nginx.com time.sleep(1) 9551130Szelenkov@nginx.com 9561130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False) 9571130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment4', fin=False) 9581130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 2!') 9591130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment5') 9601130Szelenkov@nginx.com 9611130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 9621130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 1!') 9631130Szelenkov@nginx.com 9641130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 9651130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 2!') 9661130Szelenkov@nginx.com 9671130Szelenkov@nginx.com self.check_frame( 9681130Szelenkov@nginx.com self.ws.frame_read(sock), 9691130Szelenkov@nginx.com True, 9701130Szelenkov@nginx.com self.ws.OP_TEXT, 9711130Szelenkov@nginx.com 'fragment1fragment2fragment3fragment4fragment5', 9721130Szelenkov@nginx.com ) 9731130Szelenkov@nginx.com 9741130Szelenkov@nginx.com # 5_20 9751130Szelenkov@nginx.com 9761130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 9771130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=False) 9781130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 1!') 9791130Szelenkov@nginx.com 9801130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 9811130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 1!') 9821130Szelenkov@nginx.com 9831130Szelenkov@nginx.com time.sleep(1) 9841130Szelenkov@nginx.com 9851130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False) 9861130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment4', fin=False) 9871130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 2!') 9881130Szelenkov@nginx.com 9891130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 9901130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 2!') 9911130Szelenkov@nginx.com 9921130Szelenkov@nginx.com self.assertEqual(self.recvall(sock, read_timeout=1), b'', '5_20') 9931130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment5') 9941130Szelenkov@nginx.com 9951130Szelenkov@nginx.com self.check_frame( 9961130Szelenkov@nginx.com self.ws.frame_read(sock), 9971130Szelenkov@nginx.com True, 9981130Szelenkov@nginx.com self.ws.OP_TEXT, 9991130Szelenkov@nginx.com 'fragment1fragment2fragment3fragment4fragment5', 10001130Szelenkov@nginx.com ) 10011130Szelenkov@nginx.com 10021130Szelenkov@nginx.com self.close_connection(sock) 10031130Szelenkov@nginx.com 10041130Szelenkov@nginx.com def test_node_websockets_6_1_1__6_4_4(self): 10051130Szelenkov@nginx.com self.load('websockets/mirror') 10061130Szelenkov@nginx.com 10071130Szelenkov@nginx.com # 6_1_1 10081130Szelenkov@nginx.com 10091130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 10101130Szelenkov@nginx.com 10111130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, '') 10121130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 10131130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, '') 10141130Szelenkov@nginx.com 10151130Szelenkov@nginx.com # 6_1_2 10161130Szelenkov@nginx.com 10171130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, '', fin=False) 10181130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, '', fin=False) 10191130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, '') 10201130Szelenkov@nginx.com 10211130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 10221130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, '') 10231130Szelenkov@nginx.com 10241130Szelenkov@nginx.com # 6_1_3 10251130Szelenkov@nginx.com 10261130Szelenkov@nginx.com payload = 'middle frame payload' 10271130Szelenkov@nginx.com 10281130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, '', fin=False) 10291130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, payload, fin=False) 10301130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, '') 10311130Szelenkov@nginx.com 10321130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 10331130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 10341130Szelenkov@nginx.com 10351130Szelenkov@nginx.com # 6_2_1 10361130Szelenkov@nginx.com 10371130Szelenkov@nginx.com payload = 'Hello-µ@ßöäüàá-UTF-8!!' 10381130Szelenkov@nginx.com 10391130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 10401130Szelenkov@nginx.com 10411130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 10421130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 10431130Szelenkov@nginx.com 10441130Szelenkov@nginx.com # 6_2_2 10451130Szelenkov@nginx.com 10461130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload[:12], fin=False) 10471130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, payload[12:]) 10481130Szelenkov@nginx.com 10491130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 10501130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 10511130Szelenkov@nginx.com 10521130Szelenkov@nginx.com # 6_2_3 10531130Szelenkov@nginx.com 10541130Szelenkov@nginx.com self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1) 10551130Szelenkov@nginx.com 10561130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 10571130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 10581130Szelenkov@nginx.com 10591130Szelenkov@nginx.com # 6_2_4 10601130Szelenkov@nginx.com 10611130Szelenkov@nginx.com payload = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5' 10621130Szelenkov@nginx.com 10631130Szelenkov@nginx.com self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1) 10641130Szelenkov@nginx.com 10651130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 10661130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 10671130Szelenkov@nginx.com 10681130Szelenkov@nginx.com self.close_connection(sock) 10691130Szelenkov@nginx.com 10701150Szelenkov@nginx.com# Unit does not support UTF-8 validation 10711150Szelenkov@nginx.com# 10721130Szelenkov@nginx.com# # 6_3_1 FAIL 10731130Szelenkov@nginx.com# 10741130Szelenkov@nginx.com# payload_1 = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5' 10751130Szelenkov@nginx.com# payload_2 = '\xed\xa0\x80' 10761130Szelenkov@nginx.com# payload_3 = '\x65\x64\x69\x74\x65\x64' 10771130Szelenkov@nginx.com# 10781130Szelenkov@nginx.com# payload = payload_1 + payload_2 + payload_3 10791130Szelenkov@nginx.com# 10801130Szelenkov@nginx.com# self.ws.message(sock, self.ws.OP_TEXT, payload) 10811130Szelenkov@nginx.com# self.check_close(sock, 1007) 10821130Szelenkov@nginx.com# 10831130Szelenkov@nginx.com# # 6_3_2 FAIL 10841130Szelenkov@nginx.com# 10851130Szelenkov@nginx.com# _, sock, _ = self.ws.upgrade() 10861130Szelenkov@nginx.com# 10871130Szelenkov@nginx.com# self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1) 10881130Szelenkov@nginx.com# self.check_close(sock, 1007) 10891130Szelenkov@nginx.com# 10901130Szelenkov@nginx.com# # 6_4_1 ... 6_4_4 FAIL 10911130Szelenkov@nginx.com 10921130Szelenkov@nginx.com def test_node_websockets_7_1_1__7_5_1(self): 10931130Szelenkov@nginx.com self.load('websockets/mirror') 10941130Szelenkov@nginx.com 10951130Szelenkov@nginx.com # 7_1_1 10961130Szelenkov@nginx.com 10971130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 10981130Szelenkov@nginx.com 10991130Szelenkov@nginx.com payload = "Hello World!" 11001130Szelenkov@nginx.com 11011130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 11021130Szelenkov@nginx.com 11031130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 11041130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 11051130Szelenkov@nginx.com 11061130Szelenkov@nginx.com self.close_connection(sock) 11071130Szelenkov@nginx.com 11081130Szelenkov@nginx.com # 7_1_2 11091130Szelenkov@nginx.com 11101130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11111130Szelenkov@nginx.com 11121130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 11131130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 11141130Szelenkov@nginx.com 11151130Szelenkov@nginx.com self.check_close(sock) 11161130Szelenkov@nginx.com 11171130Szelenkov@nginx.com # 7_1_3 11181130Szelenkov@nginx.com 11191130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11201130Szelenkov@nginx.com 11211130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 11221150Szelenkov@nginx.com self.check_close(sock, no_close=True) 11231130Szelenkov@nginx.com 11241130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 11251130Szelenkov@nginx.com self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock') 11261130Szelenkov@nginx.com 11271130Szelenkov@nginx.com sock.close() 11281130Szelenkov@nginx.com 11291130Szelenkov@nginx.com # 7_1_4 11301130Szelenkov@nginx.com 11311130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11321130Szelenkov@nginx.com 11331130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 11341150Szelenkov@nginx.com self.check_close(sock, no_close=True) 11351130Szelenkov@nginx.com 11361130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 11371130Szelenkov@nginx.com self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock') 11381130Szelenkov@nginx.com 11391130Szelenkov@nginx.com sock.close() 11401130Szelenkov@nginx.com 11411130Szelenkov@nginx.com # 7_1_5 11421130Szelenkov@nginx.com 11431130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11441130Szelenkov@nginx.com 11451130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 11461130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 11471150Szelenkov@nginx.com self.check_close(sock, no_close=True) 11481130Szelenkov@nginx.com 11491130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2') 11501130Szelenkov@nginx.com self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock') 11511130Szelenkov@nginx.com 11521130Szelenkov@nginx.com sock.close() 11531130Szelenkov@nginx.com 11541130Szelenkov@nginx.com # 7_1_6 11551130Szelenkov@nginx.com 11561130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11571130Szelenkov@nginx.com 11581150Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, 'BAsd7&jh23' * 26 * 2 ** 10) 11591130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 11601130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 11611130Szelenkov@nginx.com 11621130Szelenkov@nginx.com self.recvall(sock, read_timeout=1) 11631130Szelenkov@nginx.com 11641130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_PING, '') 11651130Szelenkov@nginx.com self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock') 11661130Szelenkov@nginx.com 11671130Szelenkov@nginx.com sock.close() 11681130Szelenkov@nginx.com 11691130Szelenkov@nginx.com # 7_3_1 # FAIL 11701130Szelenkov@nginx.com 11711130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11721130Szelenkov@nginx.com 11731130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, '') 11741130Szelenkov@nginx.com self.check_close(sock) 11751130Szelenkov@nginx.com 11761130Szelenkov@nginx.com # 7_3_2 11771130Szelenkov@nginx.com 11781130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11791130Szelenkov@nginx.com 11801130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, 'a') 11811130Szelenkov@nginx.com self.check_close(sock, 1002) 11821130Szelenkov@nginx.com 11831130Szelenkov@nginx.com # 7_3_3 11841130Szelenkov@nginx.com 11851130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11861130Szelenkov@nginx.com 11871130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 11881130Szelenkov@nginx.com self.check_close(sock) 11891130Szelenkov@nginx.com 11901130Szelenkov@nginx.com # 7_3_4 11911130Szelenkov@nginx.com 11921130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 11931130Szelenkov@nginx.com 11941150Szelenkov@nginx.com payload = self.ws.serialize_close(reason='Hello World!') 11951130Szelenkov@nginx.com 11961130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 11971130Szelenkov@nginx.com self.check_close(sock) 11981130Szelenkov@nginx.com 11991130Szelenkov@nginx.com # 7_3_5 12001130Szelenkov@nginx.com 12011130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 12021130Szelenkov@nginx.com 12031150Szelenkov@nginx.com payload = self.ws.serialize_close(reason='*' * 123) 12041130Szelenkov@nginx.com 12051130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 12061130Szelenkov@nginx.com self.check_close(sock) 12071130Szelenkov@nginx.com 12081130Szelenkov@nginx.com # 7_3_6 12091130Szelenkov@nginx.com 12101130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 12111130Szelenkov@nginx.com 12121150Szelenkov@nginx.com payload = self.ws.serialize_close(reason='*' * 124) 12131130Szelenkov@nginx.com 12141130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 12151130Szelenkov@nginx.com self.check_close(sock, 1002) 12161130Szelenkov@nginx.com 12171150Szelenkov@nginx.com# # 7_5_1 FAIL Unit does not support UTF-8 validation 12181150Szelenkov@nginx.com# 12191130Szelenkov@nginx.com# _, sock, _ = self.ws.upgrade() 12201130Szelenkov@nginx.com# 12211130Szelenkov@nginx.com# payload = self.ws.serialize_close(reason = '\xce\xba\xe1\xbd\xb9\xcf' \ 12221130Szelenkov@nginx.com# '\x83\xce\xbc\xce\xb5\xed\xa0\x80\x65\x64\x69\x74\x65\x64') 12231130Szelenkov@nginx.com# 12241130Szelenkov@nginx.com# self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 12251130Szelenkov@nginx.com# self.check_close(sock, 1007) 12261130Szelenkov@nginx.com 12271130Szelenkov@nginx.com def test_node_websockets_7_7_X__7_9_X(self): 12281130Szelenkov@nginx.com self.load('websockets/mirror') 12291130Szelenkov@nginx.com 12301130Szelenkov@nginx.com valid_codes = [ 12311130Szelenkov@nginx.com 1000, 12321130Szelenkov@nginx.com 1001, 12331130Szelenkov@nginx.com 1002, 12341130Szelenkov@nginx.com 1003, 12351130Szelenkov@nginx.com 1007, 12361130Szelenkov@nginx.com 1008, 12371130Szelenkov@nginx.com 1009, 12381130Szelenkov@nginx.com 1010, 12391130Szelenkov@nginx.com 1011, 12401130Szelenkov@nginx.com 3000, 12411130Szelenkov@nginx.com 3999, 12421130Szelenkov@nginx.com 4000, 12431130Szelenkov@nginx.com 4999, 12441130Szelenkov@nginx.com ] 12451130Szelenkov@nginx.com 12461130Szelenkov@nginx.com invalid_codes = [0, 999, 1004, 1005, 1006, 1016, 1100, 2000, 2999] 12471130Szelenkov@nginx.com 12481130Szelenkov@nginx.com for code in valid_codes: 12491130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 12501130Szelenkov@nginx.com 12511150Szelenkov@nginx.com payload = self.ws.serialize_close(code=code) 12521130Szelenkov@nginx.com 12531130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 12541130Szelenkov@nginx.com self.check_close(sock) 12551130Szelenkov@nginx.com 12561130Szelenkov@nginx.com for code in invalid_codes: 12571130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 12581130Szelenkov@nginx.com 12591150Szelenkov@nginx.com payload = self.ws.serialize_close(code=code) 12601130Szelenkov@nginx.com 12611130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 12621130Szelenkov@nginx.com self.check_close(sock, 1002) 12631130Szelenkov@nginx.com 12641130Szelenkov@nginx.com def test_node_websockets_7_13_1__7_13_2(self): 12651130Szelenkov@nginx.com self.load('websockets/mirror') 12661130Szelenkov@nginx.com 12671130Szelenkov@nginx.com # 7_13_1 12681130Szelenkov@nginx.com 12691130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 12701130Szelenkov@nginx.com 12711150Szelenkov@nginx.com payload = self.ws.serialize_close(code=5000) 12721130Szelenkov@nginx.com 12731130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 12741130Szelenkov@nginx.com self.check_close(sock, 1002) 12751130Szelenkov@nginx.com 12761130Szelenkov@nginx.com # 7_13_2 12771130Szelenkov@nginx.com 12781130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 12791130Szelenkov@nginx.com 12801130Szelenkov@nginx.com payload = struct.pack('!I', 65536) + ''.encode('utf-8') 12811130Szelenkov@nginx.com 12821130Szelenkov@nginx.com self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 12831130Szelenkov@nginx.com self.check_close(sock, 1002) 12841130Szelenkov@nginx.com 12851130Szelenkov@nginx.com def test_node_websockets_9_1_1__9_6_6(self): 12861130Szelenkov@nginx.com if not self.unsafe: 12871130Szelenkov@nginx.com self.skipTest("unsafe, long run") 12881130Szelenkov@nginx.com 12891130Szelenkov@nginx.com self.load('websockets/mirror') 12901130Szelenkov@nginx.com 12911130Szelenkov@nginx.com self.assertIn( 12921130Szelenkov@nginx.com 'success', 12931130Szelenkov@nginx.com self.conf( 12941130Szelenkov@nginx.com { 12951130Szelenkov@nginx.com 'http': { 12961130Szelenkov@nginx.com 'websocket': { 12971130Szelenkov@nginx.com 'max_frame_size': 33554432, 12981130Szelenkov@nginx.com 'keepalive_interval': 0, 12991130Szelenkov@nginx.com } 13001130Szelenkov@nginx.com } 13011130Szelenkov@nginx.com }, 13021130Szelenkov@nginx.com 'settings', 13031130Szelenkov@nginx.com ), 13041130Szelenkov@nginx.com 'increase max_frame_size and keepalive_interval', 13051130Szelenkov@nginx.com ) 13061130Szelenkov@nginx.com 13071130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 13081130Szelenkov@nginx.com 13091130Szelenkov@nginx.com op_text = self.ws.OP_TEXT 13101130Szelenkov@nginx.com op_binary = self.ws.OP_BINARY 13111130Szelenkov@nginx.com 13121130Szelenkov@nginx.com def check_payload(opcode, length, chopsize=None): 13131130Szelenkov@nginx.com if opcode == self.ws.OP_TEXT: 13141130Szelenkov@nginx.com payload = '*' * length 13151130Szelenkov@nginx.com else: 13161130Szelenkov@nginx.com payload = b'*' * length 13171130Szelenkov@nginx.com 13181130Szelenkov@nginx.com self.ws.frame_write(sock, opcode, payload, chopsize=chopsize) 13191130Szelenkov@nginx.com frame = self.ws.frame_read(sock, read_timeout=5) 13201130Szelenkov@nginx.com self.check_frame(frame, True, opcode, payload) 13211130Szelenkov@nginx.com 13221130Szelenkov@nginx.com def check_message(opcode, f_size): 13231130Szelenkov@nginx.com if opcode == self.ws.OP_TEXT: 13241150Szelenkov@nginx.com payload = '*' * 4 * 2 ** 20 13251130Szelenkov@nginx.com else: 13261150Szelenkov@nginx.com payload = b'*' * 4 * 2 ** 20 13271130Szelenkov@nginx.com 13281130Szelenkov@nginx.com self.ws.message(sock, opcode, payload, fragmention_size=f_size) 13291130Szelenkov@nginx.com frame = self.ws.frame_read(sock, read_timeout=5) 13301130Szelenkov@nginx.com self.check_frame(frame, True, opcode, payload) 13311130Szelenkov@nginx.com 13321150Szelenkov@nginx.com check_payload(op_text, 64 * 2 ** 10) # 9_1_1 13331150Szelenkov@nginx.com check_payload(op_text, 256 * 2 ** 10) # 9_1_2 13341150Szelenkov@nginx.com check_payload(op_text, 2 ** 20) # 9_1_3 13351150Szelenkov@nginx.com check_payload(op_text, 4 * 2 ** 20) # 9_1_4 13361150Szelenkov@nginx.com check_payload(op_text, 8 * 2 ** 20) # 9_1_5 13371150Szelenkov@nginx.com check_payload(op_text, 16 * 2 ** 20) # 9_1_6 13381130Szelenkov@nginx.com 13391150Szelenkov@nginx.com check_payload(op_binary, 64 * 2 ** 10) # 9_2_1 13401150Szelenkov@nginx.com check_payload(op_binary, 256 * 2 ** 10) # 9_2_2 13411150Szelenkov@nginx.com check_payload(op_binary, 2 ** 20) # 9_2_3 13421150Szelenkov@nginx.com check_payload(op_binary, 4 * 2 ** 20) # 9_2_4 13431150Szelenkov@nginx.com check_payload(op_binary, 8 * 2 ** 20) # 9_2_5 13441150Szelenkov@nginx.com check_payload(op_binary, 16 * 2 ** 20) # 9_2_6 13451130Szelenkov@nginx.com 13461130Szelenkov@nginx.com if self.system != 'Darwin' and self.system != 'FreeBSD': 13471150Szelenkov@nginx.com check_message(op_text, 64) # 9_3_1 13481150Szelenkov@nginx.com check_message(op_text, 256) # 9_3_2 13491150Szelenkov@nginx.com check_message(op_text, 2 ** 10) # 9_3_3 13501150Szelenkov@nginx.com check_message(op_text, 4 * 2 ** 10) # 9_3_4 13511150Szelenkov@nginx.com check_message(op_text, 16 * 2 ** 10) # 9_3_5 13521150Szelenkov@nginx.com check_message(op_text, 64 * 2 ** 10) # 9_3_6 13531150Szelenkov@nginx.com check_message(op_text, 256 * 2 ** 10) # 9_3_7 13541150Szelenkov@nginx.com check_message(op_text, 2 ** 20) # 9_3_8 13551150Szelenkov@nginx.com check_message(op_text, 4 * 2 ** 20) # 9_3_9 13561130Szelenkov@nginx.com 13571150Szelenkov@nginx.com check_message(op_binary, 64) # 9_4_1 13581150Szelenkov@nginx.com check_message(op_binary, 256) # 9_4_2 13591150Szelenkov@nginx.com check_message(op_binary, 2 ** 10) # 9_4_3 13601150Szelenkov@nginx.com check_message(op_binary, 4 * 2 ** 10) # 9_4_4 13611150Szelenkov@nginx.com check_message(op_binary, 16 * 2 ** 10) # 9_4_5 13621150Szelenkov@nginx.com check_message(op_binary, 64 * 2 ** 10) # 9_4_6 13631150Szelenkov@nginx.com check_message(op_binary, 256 * 2 ** 10) # 9_4_7 13641150Szelenkov@nginx.com check_message(op_binary, 2 ** 20) # 9_4_8 13651150Szelenkov@nginx.com check_message(op_binary, 4 * 2 ** 20) # 9_4_9 13661130Szelenkov@nginx.com 13671150Szelenkov@nginx.com check_payload(op_text, 2 ** 20, chopsize=64) # 9_5_1 13681150Szelenkov@nginx.com check_payload(op_text, 2 ** 20, chopsize=128) # 9_5_2 13691150Szelenkov@nginx.com check_payload(op_text, 2 ** 20, chopsize=256) # 9_5_3 13701150Szelenkov@nginx.com check_payload(op_text, 2 ** 20, chopsize=512) # 9_5_4 13711150Szelenkov@nginx.com check_payload(op_text, 2 ** 20, chopsize=1024) # 9_5_5 13721150Szelenkov@nginx.com check_payload(op_text, 2 ** 20, chopsize=2048) # 9_5_6 13731130Szelenkov@nginx.com 13741150Szelenkov@nginx.com check_payload(op_binary, 2 ** 20, chopsize=64) # 9_6_1 13751150Szelenkov@nginx.com check_payload(op_binary, 2 ** 20, chopsize=128) # 9_6_2 13761150Szelenkov@nginx.com check_payload(op_binary, 2 ** 20, chopsize=256) # 9_6_3 13771150Szelenkov@nginx.com check_payload(op_binary, 2 ** 20, chopsize=512) # 9_6_4 13781150Szelenkov@nginx.com check_payload(op_binary, 2 ** 20, chopsize=1024) # 9_6_5 13791150Szelenkov@nginx.com check_payload(op_binary, 2 ** 20, chopsize=2048) # 9_6_6 13801130Szelenkov@nginx.com 13811130Szelenkov@nginx.com self.close_connection(sock) 13821130Szelenkov@nginx.com 13831130Szelenkov@nginx.com def test_node_websockets_10_1_1(self): 13841130Szelenkov@nginx.com self.load('websockets/mirror') 13851130Szelenkov@nginx.com 13861130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 13871130Szelenkov@nginx.com 13881130Szelenkov@nginx.com payload = '*' * 65536 13891130Szelenkov@nginx.com 13901130Szelenkov@nginx.com self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1300) 13911130Szelenkov@nginx.com 13921130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 13931130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_TEXT, payload) 13941130Szelenkov@nginx.com 13951130Szelenkov@nginx.com self.close_connection(sock) 13961130Szelenkov@nginx.com 13971130Szelenkov@nginx.com # settings 13981130Szelenkov@nginx.com 13991130Szelenkov@nginx.com def test_node_websockets_max_frame_size(self): 14001130Szelenkov@nginx.com self.load('websockets/mirror') 14011130Szelenkov@nginx.com 14021130Szelenkov@nginx.com self.assertIn( 14031130Szelenkov@nginx.com 'success', 14041130Szelenkov@nginx.com self.conf( 14051130Szelenkov@nginx.com {'http': {'websocket': {'max_frame_size': 100}}}, 'settings' 14061130Szelenkov@nginx.com ), 14071130Szelenkov@nginx.com 'configure max_frame_size', 14081130Szelenkov@nginx.com ) 14091130Szelenkov@nginx.com 14101130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 14111130Szelenkov@nginx.com 14121130Szelenkov@nginx.com payload = '*' * 94 14131130Szelenkov@nginx.com opcode = self.ws.OP_TEXT 14141130Szelenkov@nginx.com 14151130Szelenkov@nginx.com self.ws.frame_write(sock, opcode, payload) # frame length is 100 14161130Szelenkov@nginx.com 14171130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 14181130Szelenkov@nginx.com self.check_frame(frame, True, opcode, payload) 14191130Szelenkov@nginx.com 14201130Szelenkov@nginx.com payload = '*' * 95 14211130Szelenkov@nginx.com 14221130Szelenkov@nginx.com self.ws.frame_write(sock, opcode, payload) # frame length is 101 14231150Szelenkov@nginx.com self.check_close(sock, 1009) # 1009 - CLOSE_TOO_LARGE 14241130Szelenkov@nginx.com 14251130Szelenkov@nginx.com def test_node_websockets_read_timeout(self): 14261130Szelenkov@nginx.com self.load('websockets/mirror') 14271130Szelenkov@nginx.com 14281130Szelenkov@nginx.com self.assertIn( 14291130Szelenkov@nginx.com 'success', 14301130Szelenkov@nginx.com self.conf( 14311138Szelenkov@nginx.com {'http': {'websocket': {'read_timeout': 5}}}, 'settings' 14321130Szelenkov@nginx.com ), 14331130Szelenkov@nginx.com 'configure read_timeout', 14341130Szelenkov@nginx.com ) 14351130Szelenkov@nginx.com 14361130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 14371130Szelenkov@nginx.com 14381130Szelenkov@nginx.com frame = self.ws.frame_to_send(self.ws.OP_TEXT, 'blah') 14391130Szelenkov@nginx.com sock.sendall(frame[:2]) 14401130Szelenkov@nginx.com 14411130Szelenkov@nginx.com time.sleep(2) 14421130Szelenkov@nginx.com 14431150Szelenkov@nginx.com self.check_close(sock, 1001) # 1001 - CLOSE_GOING_AWAY 14441130Szelenkov@nginx.com 14451130Szelenkov@nginx.com def test_node_websockets_keepalive_interval(self): 14461130Szelenkov@nginx.com self.load('websockets/mirror') 14471130Szelenkov@nginx.com 14481130Szelenkov@nginx.com self.assertIn( 14491130Szelenkov@nginx.com 'success', 14501130Szelenkov@nginx.com self.conf( 14511138Szelenkov@nginx.com {'http': {'websocket': {'keepalive_interval': 5}}}, 'settings' 14521130Szelenkov@nginx.com ), 14531130Szelenkov@nginx.com 'configure keepalive_interval', 14541130Szelenkov@nginx.com ) 14551130Szelenkov@nginx.com 14561130Szelenkov@nginx.com _, sock, _ = self.ws.upgrade() 14571130Szelenkov@nginx.com 14581130Szelenkov@nginx.com frame = self.ws.frame_to_send(self.ws.OP_TEXT, 'blah') 14591130Szelenkov@nginx.com sock.sendall(frame[:2]) 14601130Szelenkov@nginx.com 14611130Szelenkov@nginx.com time.sleep(2) 14621130Szelenkov@nginx.com 14631130Szelenkov@nginx.com frame = self.ws.frame_read(sock) 14641130Szelenkov@nginx.com self.check_frame(frame, True, self.ws.OP_PING, '') # PING frame 14651130Szelenkov@nginx.com 14661130Szelenkov@nginx.com sock.close() 14671130Szelenkov@nginx.com 14681150Szelenkov@nginx.com 14691130Szelenkov@nginx.comif __name__ == '__main__': 14701130Szelenkov@nginx.com TestNodeWebsockets.main() 1471