11477Szelenkov@nginx.comimport struct 21130Szelenkov@nginx.comimport time 31477Szelenkov@nginx.com 41635Szelenkov@nginx.comimport pytest 5*2616Szelenkov@nginx.com 62491Szelenkov@nginx.comfrom unit.applications.lang.node import ApplicationNode 72491Szelenkov@nginx.comfrom unit.applications.websockets import ApplicationWebsocket 81130Szelenkov@nginx.com 92488Szelenkov@nginx.comprerequisites = {'modules': {'node': 'any'}} 102488Szelenkov@nginx.com 112491Szelenkov@nginx.comclient = ApplicationNode() 122491Szelenkov@nginx.comws = ApplicationWebsocket() 131130Szelenkov@nginx.com 141130Szelenkov@nginx.com 152491Szelenkov@nginx.com@pytest.fixture(autouse=True) 162491Szelenkov@nginx.comdef setup_method_fixture(skip_alert): 172491Szelenkov@nginx.com assert 'success' in client.conf( 182491Szelenkov@nginx.com {'http': {'websocket': {'keepalive_interval': 0}}}, 'settings' 192491Szelenkov@nginx.com ), 'clear keepalive_interval' 201130Szelenkov@nginx.com 212491Szelenkov@nginx.com skip_alert(r'socket close\(\d+\) failed') 221130Szelenkov@nginx.com 231130Szelenkov@nginx.com 242491Szelenkov@nginx.comdef close_connection(sock): 252491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 261130Szelenkov@nginx.com 272491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close()) 281130Szelenkov@nginx.com 292491Szelenkov@nginx.com check_close(sock) 301130Szelenkov@nginx.com 311130Szelenkov@nginx.com 322491Szelenkov@nginx.comdef check_close(sock, code=1000, no_close=False, frame=None): 332491Szelenkov@nginx.com if frame is None: 342491Szelenkov@nginx.com frame = ws.frame_read(sock) 351130Szelenkov@nginx.com 362491Szelenkov@nginx.com assert frame['fin'], 'close fin' 372491Szelenkov@nginx.com assert frame['opcode'] == ws.OP_CLOSE, 'close opcode' 382491Szelenkov@nginx.com assert frame['code'] == code, 'close code' 391130Szelenkov@nginx.com 402491Szelenkov@nginx.com if not no_close: 411130Szelenkov@nginx.com sock.close() 421130Szelenkov@nginx.com 431130Szelenkov@nginx.com 442491Szelenkov@nginx.comdef check_frame(frame, fin, opcode, payload, decode=True): 452491Szelenkov@nginx.com if opcode == ws.OP_BINARY or not decode: 462491Szelenkov@nginx.com data = frame['data'] 472491Szelenkov@nginx.com else: 482491Szelenkov@nginx.com data = frame['data'].decode('utf-8') 491130Szelenkov@nginx.com 502491Szelenkov@nginx.com assert frame['fin'] == fin, 'fin' 512491Szelenkov@nginx.com assert frame['opcode'] == opcode, 'opcode' 522491Szelenkov@nginx.com assert data == payload, 'payload' 532491Szelenkov@nginx.com 542491Szelenkov@nginx.com 552491Szelenkov@nginx.comdef test_node_websockets_handshake(): 562491Szelenkov@nginx.com client.load('websockets/mirror') 572491Szelenkov@nginx.com 582491Szelenkov@nginx.com resp, sock, key = ws.upgrade() 592491Szelenkov@nginx.com sock.close() 601130Szelenkov@nginx.com 612491Szelenkov@nginx.com assert resp['status'] == 101, 'status' 622491Szelenkov@nginx.com assert resp['headers']['Upgrade'] == 'websocket', 'upgrade' 632491Szelenkov@nginx.com assert resp['headers']['Connection'] == 'Upgrade', 'connection' 642491Szelenkov@nginx.com assert resp['headers']['Sec-WebSocket-Accept'] == ws.accept(key), 'key' 651130Szelenkov@nginx.com 661130Szelenkov@nginx.com 672491Szelenkov@nginx.comdef test_node_websockets_mirror(): 682491Szelenkov@nginx.com client.load('websockets/mirror') 692491Szelenkov@nginx.com 702491Szelenkov@nginx.com message = 'blah' 711130Szelenkov@nginx.com 722491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 732491Szelenkov@nginx.com 742491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, message) 752491Szelenkov@nginx.com frame = ws.frame_read(sock) 761130Szelenkov@nginx.com 772491Szelenkov@nginx.com assert message == frame['data'].decode('utf-8'), 'mirror' 781130Szelenkov@nginx.com 792491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, message) 802491Szelenkov@nginx.com frame = ws.frame_read(sock) 812491Szelenkov@nginx.com 822491Szelenkov@nginx.com assert message == frame['data'].decode('utf-8'), 'mirror 2' 831130Szelenkov@nginx.com 842491Szelenkov@nginx.com sock.close() 852491Szelenkov@nginx.com 861130Szelenkov@nginx.com 872491Szelenkov@nginx.comdef test_node_websockets_no_mask(): 882491Szelenkov@nginx.com client.load('websockets/mirror') 892491Szelenkov@nginx.com 902491Szelenkov@nginx.com message = 'blah' 912491Szelenkov@nginx.com 922491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 931130Szelenkov@nginx.com 942491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, message, mask=False) 952491Szelenkov@nginx.com 962491Szelenkov@nginx.com frame = ws.frame_read(sock) 971130Szelenkov@nginx.com 982491Szelenkov@nginx.com assert frame['opcode'] == ws.OP_CLOSE, 'no mask opcode' 992491Szelenkov@nginx.com assert frame['code'] == 1002, 'no mask close code' 1001130Szelenkov@nginx.com 1012491Szelenkov@nginx.com sock.close() 1022491Szelenkov@nginx.com 1031130Szelenkov@nginx.com 1042491Szelenkov@nginx.comdef test_node_websockets_fragmentation(): 1052491Szelenkov@nginx.com client.load('websockets/mirror') 1062491Szelenkov@nginx.com 1072491Szelenkov@nginx.com message = 'blah' 1081130Szelenkov@nginx.com 1092491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 1101130Szelenkov@nginx.com 1112491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, message, fin=False) 1122491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, ' ', fin=False) 1132491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, message) 1141130Szelenkov@nginx.com 1152491Szelenkov@nginx.com frame = ws.frame_read(sock) 1162491Szelenkov@nginx.com 1172491Szelenkov@nginx.com assert f'{message} {message}' == frame['data'].decode( 1182491Szelenkov@nginx.com 'utf-8' 1192491Szelenkov@nginx.com ), 'mirror framing' 1201130Szelenkov@nginx.com 1212491Szelenkov@nginx.com sock.close() 1222491Szelenkov@nginx.com 1231130Szelenkov@nginx.com 1242491Szelenkov@nginx.comdef test_node_websockets_frame_fragmentation_invalid(): 1252491Szelenkov@nginx.com client.load('websockets/mirror') 1261130Szelenkov@nginx.com 1272491Szelenkov@nginx.com message = 'blah' 1282491Szelenkov@nginx.com 1292491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 1301130Szelenkov@nginx.com 1312491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, message, fin=False) 1321130Szelenkov@nginx.com 1332491Szelenkov@nginx.com frame = ws.frame_read(sock) 1341130Szelenkov@nginx.com 1352491Szelenkov@nginx.com frame.pop('data') 1362491Szelenkov@nginx.com assert frame == { 1372491Szelenkov@nginx.com 'fin': True, 1382491Szelenkov@nginx.com 'rsv1': False, 1392491Szelenkov@nginx.com 'rsv2': False, 1402491Szelenkov@nginx.com 'rsv3': False, 1412491Szelenkov@nginx.com 'opcode': ws.OP_CLOSE, 1422491Szelenkov@nginx.com 'mask': 0, 1432491Szelenkov@nginx.com 'code': 1002, 1442491Szelenkov@nginx.com 'reason': 'Fragmented control frame', 1452491Szelenkov@nginx.com }, 'close frame' 1461130Szelenkov@nginx.com 1472491Szelenkov@nginx.com sock.close() 1482491Szelenkov@nginx.com 1491130Szelenkov@nginx.com 1502491Szelenkov@nginx.comdef test_node_websockets_large(): 1512491Szelenkov@nginx.com client.load('websockets/mirror_fragmentation') 1521130Szelenkov@nginx.com 1532491Szelenkov@nginx.com message = '0123456789' * 3000 1542491Szelenkov@nginx.com 1552491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 1561130Szelenkov@nginx.com 1572491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, message) 1582491Szelenkov@nginx.com 1592491Szelenkov@nginx.com frame = ws.frame_read(sock) 1602491Szelenkov@nginx.com data = frame['data'].decode('utf-8') 1611130Szelenkov@nginx.com 1622491Szelenkov@nginx.com frame = ws.frame_read(sock) 1632491Szelenkov@nginx.com data += frame['data'].decode('utf-8') 1641130Szelenkov@nginx.com 1652491Szelenkov@nginx.com assert message == data, 'large' 1662491Szelenkov@nginx.com 1672491Szelenkov@nginx.com sock.close() 1682491Szelenkov@nginx.com 1691130Szelenkov@nginx.com 1702491Szelenkov@nginx.comdef test_node_websockets_two_clients(): 1712491Szelenkov@nginx.com client.load('websockets/mirror') 1721130Szelenkov@nginx.com 1732491Szelenkov@nginx.com message1 = 'blah1' 1742491Szelenkov@nginx.com message2 = 'blah2' 1752491Szelenkov@nginx.com 1762491Szelenkov@nginx.com _, sock1, _ = ws.upgrade() 1772491Szelenkov@nginx.com _, sock2, _ = ws.upgrade() 1781130Szelenkov@nginx.com 1792491Szelenkov@nginx.com ws.frame_write(sock1, ws.OP_TEXT, message1) 1802491Szelenkov@nginx.com ws.frame_write(sock2, ws.OP_TEXT, message2) 1812491Szelenkov@nginx.com 1822491Szelenkov@nginx.com frame1 = ws.frame_read(sock1) 1832491Szelenkov@nginx.com frame2 = ws.frame_read(sock2) 1841130Szelenkov@nginx.com 1852491Szelenkov@nginx.com assert message1 == frame1['data'].decode('utf-8'), 'client 1' 1862491Szelenkov@nginx.com assert message2 == frame2['data'].decode('utf-8'), 'client 2' 1871130Szelenkov@nginx.com 1882491Szelenkov@nginx.com sock1.close() 1892491Szelenkov@nginx.com sock2.close() 1901130Szelenkov@nginx.com 1911130Szelenkov@nginx.com 1922491Szelenkov@nginx.com# FAIL https://tools.ietf.org/html/rfc6455#section-4.2.1 1932491Szelenkov@nginx.com@pytest.mark.skip('not yet') 1942491Szelenkov@nginx.comdef test_node_websockets_handshake_upgrade_absent(): 1952491Szelenkov@nginx.com client.load('websockets/mirror') 1961130Szelenkov@nginx.com 1972491Szelenkov@nginx.com resp = client.get( 1982491Szelenkov@nginx.com headers={ 1992491Szelenkov@nginx.com 'Host': 'localhost', 2002491Szelenkov@nginx.com 'Connection': 'Upgrade', 2012491Szelenkov@nginx.com 'Sec-WebSocket-Key': ws.key(), 2022491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2032491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2042491Szelenkov@nginx.com }, 2052491Szelenkov@nginx.com ) 2061130Szelenkov@nginx.com 2072491Szelenkov@nginx.com assert resp['status'] == 400, 'upgrade absent' 2082491Szelenkov@nginx.com 2091130Szelenkov@nginx.com 2102491Szelenkov@nginx.comdef test_node_websockets_handshake_case_insensitive(): 2112491Szelenkov@nginx.com client.load('websockets/mirror') 2121130Szelenkov@nginx.com 2132491Szelenkov@nginx.com resp, sock, _ = ws.upgrade( 2142491Szelenkov@nginx.com headers={ 2152491Szelenkov@nginx.com 'Host': 'localhost', 2162491Szelenkov@nginx.com 'Upgrade': 'WEBSOCKET', 2172491Szelenkov@nginx.com 'Connection': 'UPGRADE', 2182491Szelenkov@nginx.com 'Sec-WebSocket-Key': ws.key(), 2192491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2202491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2212491Szelenkov@nginx.com } 2222491Szelenkov@nginx.com ) 2232491Szelenkov@nginx.com sock.close() 2241130Szelenkov@nginx.com 2252491Szelenkov@nginx.com assert resp['status'] == 101, 'status' 2261130Szelenkov@nginx.com 2271130Szelenkov@nginx.com 2282491Szelenkov@nginx.com@pytest.mark.skip('not yet') 2292491Szelenkov@nginx.comdef test_node_websockets_handshake_connection_absent(): # FAIL 2302491Szelenkov@nginx.com client.load('websockets/mirror') 2311130Szelenkov@nginx.com 2322491Szelenkov@nginx.com resp = client.get( 2332491Szelenkov@nginx.com headers={ 2342491Szelenkov@nginx.com 'Host': 'localhost', 2352491Szelenkov@nginx.com 'Upgrade': 'websocket', 2362491Szelenkov@nginx.com 'Sec-WebSocket-Key': ws.key(), 2372491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2382491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2392491Szelenkov@nginx.com }, 2402491Szelenkov@nginx.com ) 2411130Szelenkov@nginx.com 2422491Szelenkov@nginx.com assert resp['status'] == 400, 'status' 2432491Szelenkov@nginx.com 2441130Szelenkov@nginx.com 2452491Szelenkov@nginx.comdef test_node_websockets_handshake_version_absent(): 2462491Szelenkov@nginx.com client.load('websockets/mirror') 2471130Szelenkov@nginx.com 2482491Szelenkov@nginx.com resp = client.get( 2492491Szelenkov@nginx.com headers={ 2502491Szelenkov@nginx.com 'Host': 'localhost', 2512491Szelenkov@nginx.com 'Upgrade': 'websocket', 2522491Szelenkov@nginx.com 'Connection': 'Upgrade', 2532491Szelenkov@nginx.com 'Sec-WebSocket-Key': ws.key(), 2542491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2552491Szelenkov@nginx.com }, 2562491Szelenkov@nginx.com ) 2571130Szelenkov@nginx.com 2582491Szelenkov@nginx.com assert resp['status'] == 426, 'status' 2592491Szelenkov@nginx.com 2601130Szelenkov@nginx.com 2612491Szelenkov@nginx.com@pytest.mark.skip('not yet') 2622491Szelenkov@nginx.comdef test_node_websockets_handshake_key_invalid(): 2632491Szelenkov@nginx.com client.load('websockets/mirror') 2641130Szelenkov@nginx.com 2652491Szelenkov@nginx.com resp = client.get( 2662491Szelenkov@nginx.com headers={ 2672491Szelenkov@nginx.com 'Host': 'localhost', 2682491Szelenkov@nginx.com 'Upgrade': 'websocket', 2692491Szelenkov@nginx.com 'Connection': 'Upgrade', 2702491Szelenkov@nginx.com 'Sec-WebSocket-Key': '!', 2712491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2722491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2732491Szelenkov@nginx.com }, 2742491Szelenkov@nginx.com ) 2751130Szelenkov@nginx.com 2762491Szelenkov@nginx.com assert resp['status'] == 400, 'key length' 2771130Szelenkov@nginx.com 2782491Szelenkov@nginx.com key = ws.key() 2792491Szelenkov@nginx.com resp = client.get( 2802491Szelenkov@nginx.com headers={ 2812491Szelenkov@nginx.com 'Host': 'localhost', 2822491Szelenkov@nginx.com 'Upgrade': 'websocket', 2832491Szelenkov@nginx.com 'Connection': 'Upgrade', 2842491Szelenkov@nginx.com 'Sec-WebSocket-Key': [key, key], 2852491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2862491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2872491Szelenkov@nginx.com }, 2882491Szelenkov@nginx.com ) 2891130Szelenkov@nginx.com 2902491Szelenkov@nginx.com assert ( 2912491Szelenkov@nginx.com resp['status'] == 400 2922491Szelenkov@nginx.com ), 'key double' # FAIL https://tools.ietf.org/html/rfc6455#section-11.3.1 2931130Szelenkov@nginx.com 2941130Szelenkov@nginx.com 2952491Szelenkov@nginx.comdef test_node_websockets_handshake_method_invalid(): 2962491Szelenkov@nginx.com client.load('websockets/mirror') 2971130Szelenkov@nginx.com 2982491Szelenkov@nginx.com resp = client.post( 2992491Szelenkov@nginx.com headers={ 3002491Szelenkov@nginx.com 'Host': 'localhost', 3012491Szelenkov@nginx.com 'Upgrade': 'websocket', 3022491Szelenkov@nginx.com 'Connection': 'Upgrade', 3032491Szelenkov@nginx.com 'Sec-WebSocket-Key': ws.key(), 3042491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 3052491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 3062491Szelenkov@nginx.com }, 3072491Szelenkov@nginx.com ) 3081130Szelenkov@nginx.com 3092491Szelenkov@nginx.com assert resp['status'] == 400, 'status' 3102491Szelenkov@nginx.com 3111130Szelenkov@nginx.com 3122491Szelenkov@nginx.comdef test_node_websockets_handshake_http_10(): 3132491Szelenkov@nginx.com client.load('websockets/mirror') 3141130Szelenkov@nginx.com 3152491Szelenkov@nginx.com resp = client.get( 3162491Szelenkov@nginx.com headers={ 3172491Szelenkov@nginx.com 'Host': 'localhost', 3182491Szelenkov@nginx.com 'Upgrade': 'websocket', 3192491Szelenkov@nginx.com 'Connection': 'Upgrade', 3202491Szelenkov@nginx.com 'Sec-WebSocket-Key': ws.key(), 3212491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 3222491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 3232491Szelenkov@nginx.com }, 3242491Szelenkov@nginx.com http_10=True, 3252491Szelenkov@nginx.com ) 3261130Szelenkov@nginx.com 3272491Szelenkov@nginx.com assert resp['status'] == 400, 'status' 3282491Szelenkov@nginx.com 3291130Szelenkov@nginx.com 3302491Szelenkov@nginx.comdef test_node_websockets_handshake_uri_invalid(): 3312491Szelenkov@nginx.com client.load('websockets/mirror') 3321130Szelenkov@nginx.com 3332491Szelenkov@nginx.com resp = client.get( 3342491Szelenkov@nginx.com headers={ 3352491Szelenkov@nginx.com 'Host': 'localhost', 3362491Szelenkov@nginx.com 'Upgrade': 'websocket', 3372491Szelenkov@nginx.com 'Connection': 'Upgrade', 3382491Szelenkov@nginx.com 'Sec-WebSocket-Key': ws.key(), 3392491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 3402491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 3412491Szelenkov@nginx.com }, 3422491Szelenkov@nginx.com url='!', 3432491Szelenkov@nginx.com ) 3441130Szelenkov@nginx.com 3452491Szelenkov@nginx.com assert resp['status'] == 400, 'status' 3462491Szelenkov@nginx.com 3471130Szelenkov@nginx.com 3482491Szelenkov@nginx.comdef test_node_websockets_protocol_absent(): 3492491Szelenkov@nginx.com client.load('websockets/mirror') 3501130Szelenkov@nginx.com 3512491Szelenkov@nginx.com key = ws.key() 3522491Szelenkov@nginx.com resp, sock, _ = ws.upgrade( 3532491Szelenkov@nginx.com headers={ 3542491Szelenkov@nginx.com 'Host': 'localhost', 3552491Szelenkov@nginx.com 'Upgrade': 'websocket', 3562491Szelenkov@nginx.com 'Connection': 'Upgrade', 3572491Szelenkov@nginx.com 'Sec-WebSocket-Key': key, 3582491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 3592491Szelenkov@nginx.com } 3602491Szelenkov@nginx.com ) 3612491Szelenkov@nginx.com sock.close() 3621130Szelenkov@nginx.com 3632491Szelenkov@nginx.com assert resp['status'] == 101, 'status' 3642491Szelenkov@nginx.com assert resp['headers']['Upgrade'] == 'websocket', 'upgrade' 3652491Szelenkov@nginx.com assert resp['headers']['Connection'] == 'Upgrade', 'connection' 3662491Szelenkov@nginx.com assert resp['headers']['Sec-WebSocket-Accept'] == ws.accept(key), 'key' 3672491Szelenkov@nginx.com 3681130Szelenkov@nginx.com 3692491Szelenkov@nginx.com# autobahn-testsuite 3702491Szelenkov@nginx.com# 3712491Szelenkov@nginx.com# Some following tests fail because of Unit does not support UTF-8 3722491Szelenkov@nginx.com# validation for websocket frames. It should be implemented 3732491Szelenkov@nginx.com# by application, if necessary. 3742491Szelenkov@nginx.com 3752491Szelenkov@nginx.com 3762491Szelenkov@nginx.comdef test_node_websockets_1_1_1__1_1_8(): 3772491Szelenkov@nginx.com client.load('websockets/mirror') 3781130Szelenkov@nginx.com 3792491Szelenkov@nginx.com opcode = ws.OP_TEXT 3802491Szelenkov@nginx.com 3812491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 3821130Szelenkov@nginx.com 3832491Szelenkov@nginx.com def check_length(length, chopsize=None): 3842491Szelenkov@nginx.com payload = '*' * length 3852491Szelenkov@nginx.com 3862491Szelenkov@nginx.com ws.frame_write(sock, opcode, payload, chopsize=chopsize) 3872491Szelenkov@nginx.com 3882491Szelenkov@nginx.com frame = ws.frame_read(sock) 3892491Szelenkov@nginx.com check_frame(frame, True, opcode, payload) 3901130Szelenkov@nginx.com 3912491Szelenkov@nginx.com check_length(0) # 1_1_1 3922491Szelenkov@nginx.com check_length(125) # 1_1_2 3932491Szelenkov@nginx.com check_length(126) # 1_1_3 3942491Szelenkov@nginx.com check_length(127) # 1_1_4 3952491Szelenkov@nginx.com check_length(128) # 1_1_5 3962491Szelenkov@nginx.com check_length(65535) # 1_1_6 3972491Szelenkov@nginx.com check_length(65536) # 1_1_7 3982491Szelenkov@nginx.com check_length(65536, chopsize=997) # 1_1_8 3991130Szelenkov@nginx.com 4002491Szelenkov@nginx.com close_connection(sock) 4012491Szelenkov@nginx.com 4021130Szelenkov@nginx.com 4032491Szelenkov@nginx.comdef test_node_websockets_1_2_1__1_2_8(): 4042491Szelenkov@nginx.com client.load('websockets/mirror') 4052491Szelenkov@nginx.com 4062491Szelenkov@nginx.com opcode = ws.OP_BINARY 4072491Szelenkov@nginx.com 4082491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 4091130Szelenkov@nginx.com 4102491Szelenkov@nginx.com def check_length(length, chopsize=None): 4112491Szelenkov@nginx.com payload = b'\xfe' * length 4121130Szelenkov@nginx.com 4132491Szelenkov@nginx.com ws.frame_write(sock, opcode, payload, chopsize=chopsize) 4142491Szelenkov@nginx.com frame = ws.frame_read(sock) 4152491Szelenkov@nginx.com 4162491Szelenkov@nginx.com check_frame(frame, True, opcode, payload) 4171130Szelenkov@nginx.com 4182491Szelenkov@nginx.com check_length(0) # 1_2_1 4192491Szelenkov@nginx.com check_length(125) # 1_2_2 4202491Szelenkov@nginx.com check_length(126) # 1_2_3 4212491Szelenkov@nginx.com check_length(127) # 1_2_4 4222491Szelenkov@nginx.com check_length(128) # 1_2_5 4232491Szelenkov@nginx.com check_length(65535) # 1_2_6 4242491Szelenkov@nginx.com check_length(65536) # 1_2_7 4252491Szelenkov@nginx.com check_length(65536, chopsize=997) # 1_2_8 4261130Szelenkov@nginx.com 4272491Szelenkov@nginx.com close_connection(sock) 4282491Szelenkov@nginx.com 4291130Szelenkov@nginx.com 4302491Szelenkov@nginx.comdef test_node_websockets_2_1__2_6(): 4312491Szelenkov@nginx.com client.load('websockets/mirror') 4321130Szelenkov@nginx.com 4332491Szelenkov@nginx.com op_ping = ws.OP_PING 4342491Szelenkov@nginx.com op_pong = ws.OP_PONG 4352491Szelenkov@nginx.com 4362491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 4372491Szelenkov@nginx.com 4382491Szelenkov@nginx.com def check_ping(payload, chopsize=None, decode=True): 4392491Szelenkov@nginx.com ws.frame_write(sock, op_ping, payload, chopsize=chopsize) 4402491Szelenkov@nginx.com frame = ws.frame_read(sock) 4411130Szelenkov@nginx.com 4422491Szelenkov@nginx.com check_frame(frame, True, op_pong, payload, decode=decode) 4431130Szelenkov@nginx.com 4442491Szelenkov@nginx.com check_ping('') # 2_1 4452491Szelenkov@nginx.com check_ping('Hello, world!') # 2_2 4462491Szelenkov@nginx.com check_ping(b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff', decode=False) # 2_3 4472491Szelenkov@nginx.com check_ping(b'\xfe' * 125, decode=False) # 2_4 4482491Szelenkov@nginx.com check_ping(b'\xfe' * 125, chopsize=1, decode=False) # 2_6 4491130Szelenkov@nginx.com 4502491Szelenkov@nginx.com close_connection(sock) 4512491Szelenkov@nginx.com 4522491Szelenkov@nginx.com # 2_5 4531130Szelenkov@nginx.com 4542491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 4552491Szelenkov@nginx.com 4562491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, b'\xfe' * 126) 4572491Szelenkov@nginx.com check_close(sock, 1002) 4581130Szelenkov@nginx.com 4592491Szelenkov@nginx.com 4602491Szelenkov@nginx.comdef test_node_websockets_2_7__2_9(): 4612491Szelenkov@nginx.com client.load('websockets/mirror') 4622491Szelenkov@nginx.com 4632491Szelenkov@nginx.com # 2_7 4641130Szelenkov@nginx.com 4652491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 4662491Szelenkov@nginx.com 4672491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PONG, '') 4682491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', '2_7' 4691130Szelenkov@nginx.com 4702491Szelenkov@nginx.com # 2_8 4711130Szelenkov@nginx.com 4722491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PONG, 'unsolicited pong payload') 4732491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', '2_8' 4742491Szelenkov@nginx.com 4752491Szelenkov@nginx.com # 2_9 4761130Szelenkov@nginx.com 4772491Szelenkov@nginx.com payload = 'ping payload' 4782491Szelenkov@nginx.com 4792491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PONG, 'unsolicited pong payload') 4802491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, payload) 4812491Szelenkov@nginx.com 4822491Szelenkov@nginx.com frame = ws.frame_read(sock) 4832491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, payload) 4842491Szelenkov@nginx.com 4852491Szelenkov@nginx.com close_connection(sock) 4862491Szelenkov@nginx.com 4872491Szelenkov@nginx.com 4882491Szelenkov@nginx.comdef test_node_websockets_2_10__2_11(): 4892491Szelenkov@nginx.com client.load('websockets/mirror') 4902491Szelenkov@nginx.com 4912491Szelenkov@nginx.com # 2_10 4922491Szelenkov@nginx.com 4932491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 4942491Szelenkov@nginx.com 4952491Szelenkov@nginx.com for i in range(0, 10): 4962491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, f'payload-{i}') 4971130Szelenkov@nginx.com 4982491Szelenkov@nginx.com for i in range(0, 10): 4992491Szelenkov@nginx.com frame = ws.frame_read(sock) 5002491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, f'payload-{i}') 5012491Szelenkov@nginx.com 5022491Szelenkov@nginx.com # 2_11 5032491Szelenkov@nginx.com 5042491Szelenkov@nginx.com for i in range(0, 10): 5052491Szelenkov@nginx.com opcode = ws.OP_PING 5062491Szelenkov@nginx.com ws.frame_write(sock, opcode, f'payload-{i}', chopsize=1) 5071130Szelenkov@nginx.com 5082491Szelenkov@nginx.com for i in range(0, 10): 5092491Szelenkov@nginx.com frame = ws.frame_read(sock) 5102491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, f'payload-{i}') 5111130Szelenkov@nginx.com 5122491Szelenkov@nginx.com close_connection(sock) 5132491Szelenkov@nginx.com 5141130Szelenkov@nginx.com 5152491Szelenkov@nginx.com@pytest.mark.skip('not yet') 5162491Szelenkov@nginx.comdef test_node_websockets_3_1__3_7(): 5172491Szelenkov@nginx.com client.load('websockets/mirror') 5181130Szelenkov@nginx.com 5192491Szelenkov@nginx.com payload = 'Hello, world!' 5202491Szelenkov@nginx.com 5212491Szelenkov@nginx.com # 3_1 5222491Szelenkov@nginx.com 5232491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 5242491Szelenkov@nginx.com 5252491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload, rsv1=True) 5262491Szelenkov@nginx.com check_close(sock, 1002) 5272491Szelenkov@nginx.com 5282491Szelenkov@nginx.com # 3_2 5291130Szelenkov@nginx.com 5302491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 5311130Szelenkov@nginx.com 5322491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 5332491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload, rsv2=True) 5342491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 5351130Szelenkov@nginx.com 5362491Szelenkov@nginx.com frame = ws.frame_read(sock) 5372491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 5382491Szelenkov@nginx.com 5392491Szelenkov@nginx.com check_close(sock, 1002, no_close=True) 5401130Szelenkov@nginx.com 5412491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', 'empty 3_2' 5422491Szelenkov@nginx.com sock.close() 5432491Szelenkov@nginx.com 5442491Szelenkov@nginx.com # 3_3 5452491Szelenkov@nginx.com 5462491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 5472491Szelenkov@nginx.com 5482491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 5491130Szelenkov@nginx.com 5502491Szelenkov@nginx.com frame = ws.frame_read(sock) 5512491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 5522491Szelenkov@nginx.com 5532491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload, rsv1=True, rsv2=True) 5542491Szelenkov@nginx.com 5552491Szelenkov@nginx.com check_close(sock, 1002, no_close=True) 5561130Szelenkov@nginx.com 5572491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', 'empty 3_3' 5582491Szelenkov@nginx.com sock.close() 5592491Szelenkov@nginx.com 5602491Szelenkov@nginx.com # 3_4 5612491Szelenkov@nginx.com 5622491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 5631130Szelenkov@nginx.com 5642491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload, chopsize=1) 5652491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload, rsv3=True, chopsize=1) 5662491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 5672491Szelenkov@nginx.com 5682491Szelenkov@nginx.com frame = ws.frame_read(sock) 5692491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 5701819Smax.romanov@nginx.com 5712491Szelenkov@nginx.com check_close(sock, 1002, no_close=True) 5721819Smax.romanov@nginx.com 5732491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', 'empty 3_4' 5742491Szelenkov@nginx.com sock.close() 5752491Szelenkov@nginx.com 5762491Szelenkov@nginx.com # 3_5 5772491Szelenkov@nginx.com 5782491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 5791819Smax.romanov@nginx.com 5802491Szelenkov@nginx.com ws.frame_write( 5812491Szelenkov@nginx.com sock, 5822491Szelenkov@nginx.com ws.OP_BINARY, 5832491Szelenkov@nginx.com b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff', 5842491Szelenkov@nginx.com rsv1=True, 5852491Szelenkov@nginx.com rsv3=True, 5862491Szelenkov@nginx.com ) 5871130Szelenkov@nginx.com 5882491Szelenkov@nginx.com check_close(sock, 1002) 5891130Szelenkov@nginx.com 5902491Szelenkov@nginx.com # 3_6 5911130Szelenkov@nginx.com 5922491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 5932491Szelenkov@nginx.com 5942491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, payload, rsv2=True, rsv3=True) 5952491Szelenkov@nginx.com 5962491Szelenkov@nginx.com check_close(sock, 1002) 5971130Szelenkov@nginx.com 5982491Szelenkov@nginx.com # 3_7 5992491Szelenkov@nginx.com 6002491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6012491Szelenkov@nginx.com 6022491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, payload, rsv1=True, rsv2=True, rsv3=True) 6032491Szelenkov@nginx.com 6042491Szelenkov@nginx.com check_close(sock, 1002) 6052491Szelenkov@nginx.com 6061130Szelenkov@nginx.com 6072491Szelenkov@nginx.comdef test_node_websockets_4_1_1__4_2_5(): 6082491Szelenkov@nginx.com client.load('websockets/mirror') 6092491Szelenkov@nginx.com 6102491Szelenkov@nginx.com payload = 'Hello, world!' 6112491Szelenkov@nginx.com 6122491Szelenkov@nginx.com # 4_1_1 6132491Szelenkov@nginx.com 6142491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6151130Szelenkov@nginx.com 6162491Szelenkov@nginx.com ws.frame_write(sock, 0x03, '') 6172491Szelenkov@nginx.com check_close(sock, 1002) 6182491Szelenkov@nginx.com 6192491Szelenkov@nginx.com # 4_1_2 6201130Szelenkov@nginx.com 6212491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6221130Szelenkov@nginx.com 6232491Szelenkov@nginx.com ws.frame_write(sock, 0x04, 'reserved opcode payload') 6242491Szelenkov@nginx.com check_close(sock, 1002) 6252491Szelenkov@nginx.com 6262491Szelenkov@nginx.com # 4_1_3 6271130Szelenkov@nginx.com 6282491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6292491Szelenkov@nginx.com 6302491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 6311130Szelenkov@nginx.com 6322491Szelenkov@nginx.com frame = ws.frame_read(sock) 6332491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 6342491Szelenkov@nginx.com 6352491Szelenkov@nginx.com ws.frame_write(sock, 0x05, '') 6362491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 6372491Szelenkov@nginx.com 6382491Szelenkov@nginx.com check_close(sock, 1002) 6391130Szelenkov@nginx.com 6402491Szelenkov@nginx.com # 4_1_4 6412491Szelenkov@nginx.com 6422491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6432491Szelenkov@nginx.com 6442491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 6451130Szelenkov@nginx.com 6462491Szelenkov@nginx.com frame = ws.frame_read(sock) 6472491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 6481130Szelenkov@nginx.com 6492491Szelenkov@nginx.com ws.frame_write(sock, 0x06, payload) 6502491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 6511130Szelenkov@nginx.com 6522491Szelenkov@nginx.com check_close(sock, 1002) 6532491Szelenkov@nginx.com 6542491Szelenkov@nginx.com # 4_1_5 6552491Szelenkov@nginx.com 6562491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6572491Szelenkov@nginx.com 6582491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload, chopsize=1) 6591130Szelenkov@nginx.com 6602491Szelenkov@nginx.com frame = ws.frame_read(sock) 6612491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 6622491Szelenkov@nginx.com 6632491Szelenkov@nginx.com ws.frame_write(sock, 0x07, payload, chopsize=1) 6642491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 6651130Szelenkov@nginx.com 6662491Szelenkov@nginx.com check_close(sock, 1002) 6672491Szelenkov@nginx.com 6682491Szelenkov@nginx.com # 4_2_1 6692491Szelenkov@nginx.com 6702491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6711130Szelenkov@nginx.com 6722491Szelenkov@nginx.com ws.frame_write(sock, 0x0B, '') 6732491Szelenkov@nginx.com check_close(sock, 1002) 6742491Szelenkov@nginx.com 6752491Szelenkov@nginx.com # 4_2_2 6761130Szelenkov@nginx.com 6772491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6782491Szelenkov@nginx.com 6792491Szelenkov@nginx.com ws.frame_write(sock, 0x0C, 'reserved opcode payload') 6802491Szelenkov@nginx.com check_close(sock, 1002) 6812491Szelenkov@nginx.com 6822491Szelenkov@nginx.com # 4_2_3 6831130Szelenkov@nginx.com 6842491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6852491Szelenkov@nginx.com 6862491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 6871130Szelenkov@nginx.com 6882491Szelenkov@nginx.com frame = ws.frame_read(sock) 6892491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 6901130Szelenkov@nginx.com 6912491Szelenkov@nginx.com ws.frame_write(sock, 0x0D, '') 6922491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 6932491Szelenkov@nginx.com 6942491Szelenkov@nginx.com check_close(sock, 1002) 6951130Szelenkov@nginx.com 6962491Szelenkov@nginx.com # 4_2_4 6972491Szelenkov@nginx.com 6982491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6992491Szelenkov@nginx.com 7002491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 7012491Szelenkov@nginx.com 7022491Szelenkov@nginx.com frame = ws.frame_read(sock) 7032491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 7041130Szelenkov@nginx.com 7052491Szelenkov@nginx.com ws.frame_write(sock, 0x0E, payload) 7062491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 7072491Szelenkov@nginx.com 7082491Szelenkov@nginx.com check_close(sock, 1002) 7091130Szelenkov@nginx.com 7102491Szelenkov@nginx.com # 4_2_5 7112491Szelenkov@nginx.com 7122491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 7132491Szelenkov@nginx.com 7142491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload, chopsize=1) 7151130Szelenkov@nginx.com 7162491Szelenkov@nginx.com frame = ws.frame_read(sock) 7172491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 7182491Szelenkov@nginx.com 7192491Szelenkov@nginx.com ws.frame_write(sock, 0x0F, payload, chopsize=1) 7202491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 7211130Szelenkov@nginx.com 7222491Szelenkov@nginx.com check_close(sock, 1002) 7232491Szelenkov@nginx.com 7242491Szelenkov@nginx.com 7252491Szelenkov@nginx.comdef test_node_websockets_5_1__5_20(): 7262491Szelenkov@nginx.com client.load('websockets/mirror') 7271130Szelenkov@nginx.com 7282491Szelenkov@nginx.com # 5_1 7291130Szelenkov@nginx.com 7302491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 7311130Szelenkov@nginx.com 7322491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, 'fragment1', fin=False) 7332491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True) 7342491Szelenkov@nginx.com check_close(sock, 1002) 7351130Szelenkov@nginx.com 7362491Szelenkov@nginx.com # 5_2 7372491Szelenkov@nginx.com 7382491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 7391130Szelenkov@nginx.com 7402491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PONG, 'fragment1', fin=False) 7412491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True) 7422491Szelenkov@nginx.com check_close(sock, 1002) 7431130Szelenkov@nginx.com 7442491Szelenkov@nginx.com # 5_3 7452491Szelenkov@nginx.com 7462491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 7471130Szelenkov@nginx.com 7482491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 7492491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True) 7502491Szelenkov@nginx.com 7512491Szelenkov@nginx.com frame = ws.frame_read(sock) 7522491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2') 7531130Szelenkov@nginx.com 7542491Szelenkov@nginx.com # 5_4 7551130Szelenkov@nginx.com 7562491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 7572491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', '5_4' 7582491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True) 7591130Szelenkov@nginx.com 7602491Szelenkov@nginx.com frame = ws.frame_read(sock) 7612491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2') 7622491Szelenkov@nginx.com 7632491Szelenkov@nginx.com # 5_5 7642491Szelenkov@nginx.com 7652491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False, chopsize=1) 7662491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True, chopsize=1) 7672491Szelenkov@nginx.com 7682491Szelenkov@nginx.com frame = ws.frame_read(sock) 7692491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2') 7701130Szelenkov@nginx.com 7712491Szelenkov@nginx.com # 5_6 7722491Szelenkov@nginx.com 7732491Szelenkov@nginx.com ping_payload = 'ping payload' 7741130Szelenkov@nginx.com 7752491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 7762491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, ping_payload) 7772491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True) 7781130Szelenkov@nginx.com 7792491Szelenkov@nginx.com frame = ws.frame_read(sock) 7802491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, ping_payload) 7811130Szelenkov@nginx.com 7822491Szelenkov@nginx.com frame = ws.frame_read(sock) 7832491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2') 7842491Szelenkov@nginx.com 7852491Szelenkov@nginx.com # 5_7 7861130Szelenkov@nginx.com 7872491Szelenkov@nginx.com ping_payload = 'ping payload' 7882491Szelenkov@nginx.com 7892491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 7902491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', '5_7' 7911130Szelenkov@nginx.com 7922491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, ping_payload) 7932491Szelenkov@nginx.com 7942491Szelenkov@nginx.com frame = ws.frame_read(sock) 7952491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, ping_payload) 7961130Szelenkov@nginx.com 7972491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True) 7981130Szelenkov@nginx.com 7992491Szelenkov@nginx.com frame = ws.frame_read(sock) 8002491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2') 8012491Szelenkov@nginx.com 8022491Szelenkov@nginx.com # 5_8 8031130Szelenkov@nginx.com 8042491Szelenkov@nginx.com ping_payload = 'ping payload' 8051130Szelenkov@nginx.com 8062491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False, chopsize=1) 8072491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, ping_payload, chopsize=1) 8082491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True, chopsize=1) 8091130Szelenkov@nginx.com 8102491Szelenkov@nginx.com frame = ws.frame_read(sock) 8112491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, ping_payload) 8121130Szelenkov@nginx.com 8132491Szelenkov@nginx.com frame = ws.frame_read(sock) 8142491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2') 8152491Szelenkov@nginx.com 8162491Szelenkov@nginx.com # 5_9 8171130Szelenkov@nginx.com 8182491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'non-continuation payload', fin=True) 8192491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True) 8202491Szelenkov@nginx.com check_close(sock, 1002) 8211130Szelenkov@nginx.com 8222491Szelenkov@nginx.com # 5_10 8232491Szelenkov@nginx.com 8242491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 8251130Szelenkov@nginx.com 8262491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'non-continuation payload', fin=True) 8272491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True) 8282491Szelenkov@nginx.com check_close(sock, 1002) 8292491Szelenkov@nginx.com 8302491Szelenkov@nginx.com # 5_11 8312491Szelenkov@nginx.com 8322491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 8332491Szelenkov@nginx.com 8342491Szelenkov@nginx.com ws.frame_write( 8352491Szelenkov@nginx.com sock, 8362491Szelenkov@nginx.com ws.OP_CONT, 8372491Szelenkov@nginx.com 'non-continuation payload', 8382491Szelenkov@nginx.com fin=True, 8392491Szelenkov@nginx.com chopsize=1, 8402491Szelenkov@nginx.com ) 8412491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1) 8422491Szelenkov@nginx.com check_close(sock, 1002) 8431130Szelenkov@nginx.com 8442491Szelenkov@nginx.com # 5_12 8452491Szelenkov@nginx.com 8462491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 8472491Szelenkov@nginx.com 8482491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'non-continuation payload', fin=False) 8492491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True) 8502491Szelenkov@nginx.com check_close(sock, 1002) 8512491Szelenkov@nginx.com 8522491Szelenkov@nginx.com # 5_13 8532491Szelenkov@nginx.com 8542491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 8552491Szelenkov@nginx.com 8562491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'non-continuation payload', fin=False) 8572491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True) 8582491Szelenkov@nginx.com check_close(sock, 1002) 8592491Szelenkov@nginx.com 8602491Szelenkov@nginx.com # 5_14 8612491Szelenkov@nginx.com 8622491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 8631130Szelenkov@nginx.com 8642491Szelenkov@nginx.com ws.frame_write( 8652491Szelenkov@nginx.com sock, 8662491Szelenkov@nginx.com ws.OP_CONT, 8672491Szelenkov@nginx.com 'non-continuation payload', 8682491Szelenkov@nginx.com fin=False, 8692491Szelenkov@nginx.com chopsize=1, 8702491Szelenkov@nginx.com ) 8712491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1) 8722491Szelenkov@nginx.com check_close(sock, 1002) 8731130Szelenkov@nginx.com 8742491Szelenkov@nginx.com # 5_15 8752491Szelenkov@nginx.com 8762491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 8771130Szelenkov@nginx.com 8782491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 8792491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True) 8802491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=False) 8812491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment4', fin=True) 8821130Szelenkov@nginx.com 8832491Szelenkov@nginx.com frame = ws.frame_read(sock) 8841130Szelenkov@nginx.com 8852491Szelenkov@nginx.com if frame['opcode'] == ws.OP_TEXT: 8862491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2') 8872491Szelenkov@nginx.com frame = None 8881130Szelenkov@nginx.com 8892491Szelenkov@nginx.com check_close(sock, 1002, frame=frame) 8901130Szelenkov@nginx.com 8912491Szelenkov@nginx.com # 5_16 8922491Szelenkov@nginx.com 8932491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 8941130Szelenkov@nginx.com 8952491Szelenkov@nginx.com for _ in range(0, 2): 8962491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment1', fin=False) 8972491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment2', fin=False) 8982491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=True) 8992491Szelenkov@nginx.com check_close(sock, 1002) 9002491Szelenkov@nginx.com 9012491Szelenkov@nginx.com # 5_17 9021130Szelenkov@nginx.com 9032491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 9041130Szelenkov@nginx.com 9052491Szelenkov@nginx.com for _ in range(0, 2): 9062491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment1', fin=True) 9072491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment2', fin=False) 9082491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=True) 9092491Szelenkov@nginx.com check_close(sock, 1002) 9101130Szelenkov@nginx.com 9112491Szelenkov@nginx.com # 5_18 9121130Szelenkov@nginx.com 9132491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 9141130Szelenkov@nginx.com 9152491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 9162491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment2') 9172491Szelenkov@nginx.com check_close(sock, 1002) 9182491Szelenkov@nginx.com 9192491Szelenkov@nginx.com # 5_19 9202491Szelenkov@nginx.com 9212491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 9221130Szelenkov@nginx.com 9232491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 9242491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=False) 9252491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, 'pongme 1!') 9261130Szelenkov@nginx.com 9272491Szelenkov@nginx.com time.sleep(1) 9281130Szelenkov@nginx.com 9292491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=False) 9302491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment4', fin=False) 9312491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, 'pongme 2!') 9322491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment5') 9331130Szelenkov@nginx.com 9342491Szelenkov@nginx.com frame = ws.frame_read(sock) 9352491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, 'pongme 1!') 9361130Szelenkov@nginx.com 9372491Szelenkov@nginx.com frame = ws.frame_read(sock) 9382491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, 'pongme 2!') 9391130Szelenkov@nginx.com 9402491Szelenkov@nginx.com check_frame( 9412491Szelenkov@nginx.com ws.frame_read(sock), 9422491Szelenkov@nginx.com True, 9432491Szelenkov@nginx.com ws.OP_TEXT, 9442491Szelenkov@nginx.com 'fragment1fragment2fragment3fragment4fragment5', 9452491Szelenkov@nginx.com ) 9461130Szelenkov@nginx.com 9472491Szelenkov@nginx.com # 5_20 9481130Szelenkov@nginx.com 9492491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 9502491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=False) 9512491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, 'pongme 1!') 9522491Szelenkov@nginx.com 9532491Szelenkov@nginx.com frame = ws.frame_read(sock) 9542491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, 'pongme 1!') 9551130Szelenkov@nginx.com 9562491Szelenkov@nginx.com time.sleep(1) 9572491Szelenkov@nginx.com 9582491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=False) 9592491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment4', fin=False) 9602491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, 'pongme 2!') 9612491Szelenkov@nginx.com 9622491Szelenkov@nginx.com frame = ws.frame_read(sock) 9632491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, 'pongme 2!') 9641130Szelenkov@nginx.com 9652491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', '5_20' 9662491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment5') 9671130Szelenkov@nginx.com 9682491Szelenkov@nginx.com check_frame( 9692491Szelenkov@nginx.com ws.frame_read(sock), 9702491Szelenkov@nginx.com True, 9712491Szelenkov@nginx.com ws.OP_TEXT, 9722491Szelenkov@nginx.com 'fragment1fragment2fragment3fragment4fragment5', 9732491Szelenkov@nginx.com ) 9741130Szelenkov@nginx.com 9752491Szelenkov@nginx.com close_connection(sock) 9761130Szelenkov@nginx.com 9771130Szelenkov@nginx.com 9782491Szelenkov@nginx.comdef test_node_websockets_6_1_1__6_4_4(): 9792491Szelenkov@nginx.com client.load('websockets/mirror') 9802491Szelenkov@nginx.com 9812491Szelenkov@nginx.com # 6_1_1 9821130Szelenkov@nginx.com 9832491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 9842491Szelenkov@nginx.com 9852491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, '') 9862491Szelenkov@nginx.com frame = ws.frame_read(sock) 9872491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, '') 9881130Szelenkov@nginx.com 9892491Szelenkov@nginx.com # 6_1_2 9901130Szelenkov@nginx.com 9912491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, '', fin=False) 9922491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, '', fin=False) 9932491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, '') 9941130Szelenkov@nginx.com 9952491Szelenkov@nginx.com frame = ws.frame_read(sock) 9962491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, '') 9971130Szelenkov@nginx.com 9982491Szelenkov@nginx.com # 6_1_3 9991130Szelenkov@nginx.com 10002491Szelenkov@nginx.com payload = 'middle frame payload' 10011130Szelenkov@nginx.com 10022491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, '', fin=False) 10032491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, payload, fin=False) 10042491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, '') 10051130Szelenkov@nginx.com 10062491Szelenkov@nginx.com frame = ws.frame_read(sock) 10072491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 10081130Szelenkov@nginx.com 10092491Szelenkov@nginx.com # 6_2_1 10102491Szelenkov@nginx.com 10112491Szelenkov@nginx.com payload = 'Hello-µ@ßöäüàá-UTF-8!!' 10121130Szelenkov@nginx.com 10132491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 10141130Szelenkov@nginx.com 10152491Szelenkov@nginx.com frame = ws.frame_read(sock) 10162491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 10172491Szelenkov@nginx.com 10182491Szelenkov@nginx.com # 6_2_2 10191130Szelenkov@nginx.com 10202491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload[:12], fin=False) 10212491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, payload[12:]) 10221130Szelenkov@nginx.com 10232491Szelenkov@nginx.com frame = ws.frame_read(sock) 10242491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 10251130Szelenkov@nginx.com 10262491Szelenkov@nginx.com # 6_2_3 10272491Szelenkov@nginx.com 10282491Szelenkov@nginx.com ws.message(sock, ws.OP_TEXT, payload, fragmention_size=1) 10291130Szelenkov@nginx.com 10302491Szelenkov@nginx.com frame = ws.frame_read(sock) 10312491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 10322491Szelenkov@nginx.com 10332491Szelenkov@nginx.com # 6_2_4 10342491Szelenkov@nginx.com 10352491Szelenkov@nginx.com payload = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5' 10361130Szelenkov@nginx.com 10372491Szelenkov@nginx.com ws.message(sock, ws.OP_TEXT, payload, fragmention_size=1) 10381130Szelenkov@nginx.com 10392491Szelenkov@nginx.com frame = ws.frame_read(sock) 10402491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 10412491Szelenkov@nginx.com 10422491Szelenkov@nginx.com close_connection(sock) 10431130Szelenkov@nginx.com 10441130Szelenkov@nginx.com 10452491Szelenkov@nginx.com# Unit does not support UTF-8 validation 10462491Szelenkov@nginx.com# 10472491Szelenkov@nginx.com# # 6_3_1 FAIL 10482491Szelenkov@nginx.com# 10492491Szelenkov@nginx.com# payload_1 = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5' 10502491Szelenkov@nginx.com# payload_2 = '\xed\xa0\x80' 10512491Szelenkov@nginx.com# payload_3 = '\x65\x64\x69\x74\x65\x64' 10522491Szelenkov@nginx.com# 10532491Szelenkov@nginx.com# payload = payload_1 + payload_2 + payload_3 10542491Szelenkov@nginx.com# 10552491Szelenkov@nginx.com# ws.message(sock, ws.OP_TEXT, payload) 10562491Szelenkov@nginx.com# check_close(sock, 1007) 10572491Szelenkov@nginx.com# 10582491Szelenkov@nginx.com# # 6_3_2 FAIL 10592491Szelenkov@nginx.com# 10602491Szelenkov@nginx.com# _, sock, _ = ws.upgrade() 10612491Szelenkov@nginx.com# 10622491Szelenkov@nginx.com# ws.message(sock, ws.OP_TEXT, payload, fragmention_size=1) 10632491Szelenkov@nginx.com# check_close(sock, 1007) 10642491Szelenkov@nginx.com# 10652491Szelenkov@nginx.com# # 6_4_1 ... 6_4_4 FAIL 10661130Szelenkov@nginx.com 10672491Szelenkov@nginx.com 10682491Szelenkov@nginx.comdef test_node_websockets_7_1_1__7_5_1(): 10692491Szelenkov@nginx.com client.load('websockets/mirror') 10702491Szelenkov@nginx.com 10712491Szelenkov@nginx.com # 7_1_1 10722491Szelenkov@nginx.com 10732491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 10742491Szelenkov@nginx.com 10752491Szelenkov@nginx.com payload = "Hello World!" 10761130Szelenkov@nginx.com 10772491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 10782491Szelenkov@nginx.com 10792491Szelenkov@nginx.com frame = ws.frame_read(sock) 10802491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 10812491Szelenkov@nginx.com 10822491Szelenkov@nginx.com close_connection(sock) 10832491Szelenkov@nginx.com 10842491Szelenkov@nginx.com # 7_1_2 10852491Szelenkov@nginx.com 10862491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 10871130Szelenkov@nginx.com 10882491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close()) 10892491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close()) 10902491Szelenkov@nginx.com 10912491Szelenkov@nginx.com check_close(sock) 10922491Szelenkov@nginx.com 10932491Szelenkov@nginx.com # 7_1_3 10942491Szelenkov@nginx.com 10952491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 10962491Szelenkov@nginx.com 10972491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close()) 10982491Szelenkov@nginx.com check_close(sock, no_close=True) 10992491Szelenkov@nginx.com 11002491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 11012491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 11022491Szelenkov@nginx.com 11032491Szelenkov@nginx.com sock.close() 11042491Szelenkov@nginx.com 11052491Szelenkov@nginx.com # 7_1_4 11062491Szelenkov@nginx.com 11072491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 11081130Szelenkov@nginx.com 11092491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close()) 11102491Szelenkov@nginx.com check_close(sock, no_close=True) 11111130Szelenkov@nginx.com 11122491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 11132491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 11142491Szelenkov@nginx.com 11152491Szelenkov@nginx.com sock.close() 11162491Szelenkov@nginx.com 11172491Szelenkov@nginx.com # 7_1_5 11181130Szelenkov@nginx.com 11192491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 11201130Szelenkov@nginx.com 11212491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 11222491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close()) 11232491Szelenkov@nginx.com check_close(sock, no_close=True) 11242491Szelenkov@nginx.com 11252491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2') 11262491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 11272491Szelenkov@nginx.com 11282491Szelenkov@nginx.com sock.close() 11291130Szelenkov@nginx.com 11302491Szelenkov@nginx.com # 7_1_6 11312491Szelenkov@nginx.com 11322491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 11331130Szelenkov@nginx.com 11342491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'BAsd7&jh23' * 26 * 2**10) 11352491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 11362491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close()) 11371130Szelenkov@nginx.com 11382491Szelenkov@nginx.com client.recvall(sock, read_timeout=1) 11392491Szelenkov@nginx.com 11402491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 11412491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 11421130Szelenkov@nginx.com 11432491Szelenkov@nginx.com sock.close() 11441130Szelenkov@nginx.com 11452491Szelenkov@nginx.com # 7_3_1 11462491Szelenkov@nginx.com 11472491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 11481130Szelenkov@nginx.com 11492491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, '') 11502491Szelenkov@nginx.com check_close(sock) 11512491Szelenkov@nginx.com 11522491Szelenkov@nginx.com # 7_3_2 11531130Szelenkov@nginx.com 11542491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 11552491Szelenkov@nginx.com 11562491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, 'a') 11572491Szelenkov@nginx.com check_close(sock, 1002) 11581130Szelenkov@nginx.com 11592491Szelenkov@nginx.com # 7_3_3 11602491Szelenkov@nginx.com 11612491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 11621130Szelenkov@nginx.com 11632491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close()) 11642491Szelenkov@nginx.com check_close(sock) 11651130Szelenkov@nginx.com 11662491Szelenkov@nginx.com # 7_3_4 11671130Szelenkov@nginx.com 11682491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 11692491Szelenkov@nginx.com 11702491Szelenkov@nginx.com payload = ws.serialize_close(reason='Hello World!') 11711130Szelenkov@nginx.com 11722491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, payload) 11732491Szelenkov@nginx.com check_close(sock) 11742491Szelenkov@nginx.com 11752491Szelenkov@nginx.com # 7_3_5 11762491Szelenkov@nginx.com 11772491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 11782491Szelenkov@nginx.com 11792491Szelenkov@nginx.com payload = ws.serialize_close(reason='*' * 123) 11801130Szelenkov@nginx.com 11812491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, payload) 11822491Szelenkov@nginx.com check_close(sock) 11831130Szelenkov@nginx.com 11842491Szelenkov@nginx.com # 7_3_6 11852491Szelenkov@nginx.com 11862491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 11872491Szelenkov@nginx.com 11882491Szelenkov@nginx.com payload = ws.serialize_close(reason='*' * 124) 11891130Szelenkov@nginx.com 11902491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, payload) 11912491Szelenkov@nginx.com check_close(sock, 1002) 11922491Szelenkov@nginx.com 11931130Szelenkov@nginx.com 11942491Szelenkov@nginx.com# # 7_5_1 FAIL Unit does not support UTF-8 validation 11952491Szelenkov@nginx.com# 11962491Szelenkov@nginx.com# _, sock, _ = ws.upgrade() 11972491Szelenkov@nginx.com# 11982491Szelenkov@nginx.com# payload = ws.serialize_close(reason = '\xce\xba\xe1\xbd\xb9\xcf' \ 11992491Szelenkov@nginx.com# '\x83\xce\xbc\xce\xb5\xed\xa0\x80\x65\x64\x69\x74\x65\x64') 12002491Szelenkov@nginx.com# 12012491Szelenkov@nginx.com# ws.frame_write(sock, ws.OP_CLOSE, payload) 12022491Szelenkov@nginx.com# check_close(sock, 1007) 12031130Szelenkov@nginx.com 12042491Szelenkov@nginx.com 12052491Szelenkov@nginx.comdef test_node_websockets_7_7_X__7_9_X(): 12062491Szelenkov@nginx.com client.load('websockets/mirror') 12071130Szelenkov@nginx.com 12082491Szelenkov@nginx.com valid_codes = [ 12092491Szelenkov@nginx.com 1000, 12102491Szelenkov@nginx.com 1001, 12112491Szelenkov@nginx.com 1002, 12122491Szelenkov@nginx.com 1003, 12132491Szelenkov@nginx.com 1007, 12142491Szelenkov@nginx.com 1008, 12152491Szelenkov@nginx.com 1009, 12162491Szelenkov@nginx.com 1010, 12172491Szelenkov@nginx.com 1011, 12182491Szelenkov@nginx.com 3000, 12192491Szelenkov@nginx.com 3999, 12202491Szelenkov@nginx.com 4000, 12212491Szelenkov@nginx.com 4999, 12222491Szelenkov@nginx.com ] 12231130Szelenkov@nginx.com 12242491Szelenkov@nginx.com invalid_codes = [0, 999, 1004, 1005, 1006, 1016, 1100, 2000, 2999] 12252491Szelenkov@nginx.com 12262491Szelenkov@nginx.com for code in valid_codes: 12272491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 12282491Szelenkov@nginx.com 12292491Szelenkov@nginx.com payload = ws.serialize_close(code=code) 12302491Szelenkov@nginx.com 12312491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, payload) 12322491Szelenkov@nginx.com check_close(sock) 12331130Szelenkov@nginx.com 12342491Szelenkov@nginx.com for code in invalid_codes: 12352491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 12362491Szelenkov@nginx.com 12372491Szelenkov@nginx.com payload = ws.serialize_close(code=code) 12382491Szelenkov@nginx.com 12392491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, payload) 12402491Szelenkov@nginx.com check_close(sock, 1002) 12412491Szelenkov@nginx.com 12422491Szelenkov@nginx.com 12432491Szelenkov@nginx.comdef test_node_websockets_7_13_1__7_13_2(): 12442491Szelenkov@nginx.com client.load('websockets/mirror') 12451130Szelenkov@nginx.com 12462491Szelenkov@nginx.com # 7_13_1 12472491Szelenkov@nginx.com 12482491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 12492491Szelenkov@nginx.com 12502491Szelenkov@nginx.com payload = ws.serialize_close(code=5000) 12511130Szelenkov@nginx.com 12522491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, payload) 12532491Szelenkov@nginx.com check_close(sock, 1002) 12542491Szelenkov@nginx.com 12552491Szelenkov@nginx.com # 7_13_2 12562491Szelenkov@nginx.com 12572491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 12582491Szelenkov@nginx.com 12592491Szelenkov@nginx.com payload = struct.pack('!I', 65536) + ''.encode('utf-8') 12601130Szelenkov@nginx.com 12612491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, payload) 12622491Szelenkov@nginx.com check_close(sock, 1002) 12632491Szelenkov@nginx.com 12642491Szelenkov@nginx.com 12652491Szelenkov@nginx.comdef test_node_websockets_9_1_1__9_6_6(is_unsafe, system): 12662491Szelenkov@nginx.com if not is_unsafe: 12672491Szelenkov@nginx.com pytest.skip('unsafe, long run') 12682491Szelenkov@nginx.com 12692491Szelenkov@nginx.com client.load('websockets/mirror') 12701130Szelenkov@nginx.com 12712491Szelenkov@nginx.com assert 'success' in client.conf( 12722491Szelenkov@nginx.com { 12732491Szelenkov@nginx.com 'http': { 12742491Szelenkov@nginx.com 'websocket': { 12752491Szelenkov@nginx.com 'max_frame_size': 33554432, 12762491Szelenkov@nginx.com 'keepalive_interval': 0, 12772491Szelenkov@nginx.com } 12782491Szelenkov@nginx.com } 12792491Szelenkov@nginx.com }, 12802491Szelenkov@nginx.com 'settings', 12812491Szelenkov@nginx.com ), 'increase max_frame_size and keepalive_interval' 12821130Szelenkov@nginx.com 12832491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 12842491Szelenkov@nginx.com 12852491Szelenkov@nginx.com op_text = ws.OP_TEXT 12862491Szelenkov@nginx.com op_binary = ws.OP_BINARY 12872491Szelenkov@nginx.com 12882491Szelenkov@nginx.com def check_payload(opcode, length, chopsize=None): 12892491Szelenkov@nginx.com if opcode == ws.OP_TEXT: 12902491Szelenkov@nginx.com payload = '*' * length 12912491Szelenkov@nginx.com else: 12922491Szelenkov@nginx.com payload = b'*' * length 12932491Szelenkov@nginx.com 12942491Szelenkov@nginx.com ws.frame_write(sock, opcode, payload, chopsize=chopsize) 12952491Szelenkov@nginx.com frame = ws.frame_read(sock, read_timeout=5) 12962491Szelenkov@nginx.com check_frame(frame, True, opcode, payload) 12971130Szelenkov@nginx.com 12982491Szelenkov@nginx.com def check_message(opcode, f_size): 12992491Szelenkov@nginx.com if opcode == ws.OP_TEXT: 13002491Szelenkov@nginx.com payload = '*' * 4 * 2**20 13012491Szelenkov@nginx.com else: 13022491Szelenkov@nginx.com payload = b'*' * 4 * 2**20 13031130Szelenkov@nginx.com 13042491Szelenkov@nginx.com ws.message(sock, opcode, payload, fragmention_size=f_size) 13052491Szelenkov@nginx.com frame = ws.frame_read(sock, read_timeout=5) 13062491Szelenkov@nginx.com check_frame(frame, True, opcode, payload) 13072491Szelenkov@nginx.com 13082491Szelenkov@nginx.com check_payload(op_text, 64 * 2**10) # 9_1_1 13092491Szelenkov@nginx.com check_payload(op_text, 256 * 2**10) # 9_1_2 13102491Szelenkov@nginx.com check_payload(op_text, 2**20) # 9_1_3 13112491Szelenkov@nginx.com check_payload(op_text, 4 * 2**20) # 9_1_4 13122491Szelenkov@nginx.com check_payload(op_text, 8 * 2**20) # 9_1_5 13132491Szelenkov@nginx.com check_payload(op_text, 16 * 2**20) # 9_1_6 13141130Szelenkov@nginx.com 13152491Szelenkov@nginx.com check_payload(op_binary, 64 * 2**10) # 9_2_1 13162491Szelenkov@nginx.com check_payload(op_binary, 256 * 2**10) # 9_2_2 13172491Szelenkov@nginx.com check_payload(op_binary, 2**20) # 9_2_3 13182491Szelenkov@nginx.com check_payload(op_binary, 4 * 2**20) # 9_2_4 13192491Szelenkov@nginx.com check_payload(op_binary, 8 * 2**20) # 9_2_5 13202491Szelenkov@nginx.com check_payload(op_binary, 16 * 2**20) # 9_2_6 13211130Szelenkov@nginx.com 13222491Szelenkov@nginx.com if system not in ['Darwin', 'FreeBSD']: 13232491Szelenkov@nginx.com check_message(op_text, 64) # 9_3_1 13242491Szelenkov@nginx.com check_message(op_text, 256) # 9_3_2 13252491Szelenkov@nginx.com check_message(op_text, 2**10) # 9_3_3 13262491Szelenkov@nginx.com check_message(op_text, 4 * 2**10) # 9_3_4 13272491Szelenkov@nginx.com check_message(op_text, 16 * 2**10) # 9_3_5 13282491Szelenkov@nginx.com check_message(op_text, 64 * 2**10) # 9_3_6 13292491Szelenkov@nginx.com check_message(op_text, 256 * 2**10) # 9_3_7 13302491Szelenkov@nginx.com check_message(op_text, 2**20) # 9_3_8 13312491Szelenkov@nginx.com check_message(op_text, 4 * 2**20) # 9_3_9 13321130Szelenkov@nginx.com 13332491Szelenkov@nginx.com check_message(op_binary, 64) # 9_4_1 13342491Szelenkov@nginx.com check_message(op_binary, 256) # 9_4_2 13352491Szelenkov@nginx.com check_message(op_binary, 2**10) # 9_4_3 13362491Szelenkov@nginx.com check_message(op_binary, 4 * 2**10) # 9_4_4 13372491Szelenkov@nginx.com check_message(op_binary, 16 * 2**10) # 9_4_5 13382491Szelenkov@nginx.com check_message(op_binary, 64 * 2**10) # 9_4_6 13392491Szelenkov@nginx.com check_message(op_binary, 256 * 2**10) # 9_4_7 13402491Szelenkov@nginx.com check_message(op_binary, 2**20) # 9_4_8 13412491Szelenkov@nginx.com check_message(op_binary, 4 * 2**20) # 9_4_9 13421130Szelenkov@nginx.com 13432491Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=64) # 9_5_1 13442491Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=128) # 9_5_2 13452491Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=256) # 9_5_3 13462491Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=512) # 9_5_4 13472491Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=1024) # 9_5_5 13482491Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=2048) # 9_5_6 13491130Szelenkov@nginx.com 13502491Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=64) # 9_6_1 13512491Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=128) # 9_6_2 13522491Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=256) # 9_6_3 13532491Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=512) # 9_6_4 13542491Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=1024) # 9_6_5 13552491Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=2048) # 9_6_6 13561130Szelenkov@nginx.com 13572491Szelenkov@nginx.com close_connection(sock) 13582491Szelenkov@nginx.com 13592491Szelenkov@nginx.com 13602491Szelenkov@nginx.comdef test_node_websockets_10_1_1(): 13612491Szelenkov@nginx.com client.load('websockets/mirror') 13622491Szelenkov@nginx.com 13632491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 13641130Szelenkov@nginx.com 13652491Szelenkov@nginx.com payload = '*' * 65536 13662491Szelenkov@nginx.com 13672491Szelenkov@nginx.com ws.message(sock, ws.OP_TEXT, payload, fragmention_size=1300) 13681130Szelenkov@nginx.com 13692491Szelenkov@nginx.com frame = ws.frame_read(sock) 13702491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 13711130Szelenkov@nginx.com 13722491Szelenkov@nginx.com close_connection(sock) 13732491Szelenkov@nginx.com 13742491Szelenkov@nginx.com 13752491Szelenkov@nginx.com# settings 13761130Szelenkov@nginx.com 13772491Szelenkov@nginx.com 13782491Szelenkov@nginx.comdef test_node_websockets_max_frame_size(): 13792491Szelenkov@nginx.com client.load('websockets/mirror') 13801130Szelenkov@nginx.com 13812491Szelenkov@nginx.com assert 'success' in client.conf( 13822491Szelenkov@nginx.com {'http': {'websocket': {'max_frame_size': 100}}}, 'settings' 13832491Szelenkov@nginx.com ), 'configure max_frame_size' 13841130Szelenkov@nginx.com 13852491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 13862491Szelenkov@nginx.com 13872491Szelenkov@nginx.com payload = '*' * 94 13882491Szelenkov@nginx.com opcode = ws.OP_TEXT 13891130Szelenkov@nginx.com 13902491Szelenkov@nginx.com ws.frame_write(sock, opcode, payload) # frame length is 100 13912491Szelenkov@nginx.com 13922491Szelenkov@nginx.com frame = ws.frame_read(sock) 13932491Szelenkov@nginx.com check_frame(frame, True, opcode, payload) 13941130Szelenkov@nginx.com 13952491Szelenkov@nginx.com payload = '*' * 95 13962491Szelenkov@nginx.com 13972491Szelenkov@nginx.com ws.frame_write(sock, opcode, payload) # frame length is 101 13982491Szelenkov@nginx.com check_close(sock, 1009) # 1009 - CLOSE_TOO_LARGE 13992491Szelenkov@nginx.com 14001130Szelenkov@nginx.com 14012491Szelenkov@nginx.comdef test_node_websockets_read_timeout(): 14022491Szelenkov@nginx.com client.load('websockets/mirror') 14031130Szelenkov@nginx.com 14042491Szelenkov@nginx.com assert 'success' in client.conf( 14052491Szelenkov@nginx.com {'http': {'websocket': {'read_timeout': 5}}}, 'settings' 14062491Szelenkov@nginx.com ), 'configure read_timeout' 14071130Szelenkov@nginx.com 14082491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 14092491Szelenkov@nginx.com 14102491Szelenkov@nginx.com frame = ws.frame_to_send(ws.OP_TEXT, 'blah') 14112491Szelenkov@nginx.com sock.sendall(frame[:2]) 14121130Szelenkov@nginx.com 14132491Szelenkov@nginx.com time.sleep(2) 14142491Szelenkov@nginx.com 14152491Szelenkov@nginx.com check_close(sock, 1001) # 1001 - CLOSE_GOING_AWAY 14162491Szelenkov@nginx.com 14171130Szelenkov@nginx.com 14182491Szelenkov@nginx.comdef test_node_websockets_keepalive_interval(): 14192491Szelenkov@nginx.com client.load('websockets/mirror') 14202491Szelenkov@nginx.com 14212491Szelenkov@nginx.com assert 'success' in client.conf( 14222491Szelenkov@nginx.com {'http': {'websocket': {'keepalive_interval': 5}}}, 'settings' 14232491Szelenkov@nginx.com ), 'configure keepalive_interval' 14241130Szelenkov@nginx.com 14252491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 14261130Szelenkov@nginx.com 14272491Szelenkov@nginx.com frame = ws.frame_to_send(ws.OP_TEXT, 'blah') 14282491Szelenkov@nginx.com sock.sendall(frame[:2]) 14291130Szelenkov@nginx.com 14302491Szelenkov@nginx.com time.sleep(2) 14311130Szelenkov@nginx.com 14322491Szelenkov@nginx.com frame = ws.frame_read(sock) 14332491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PING, '') # PING frame 14342491Szelenkov@nginx.com 14352491Szelenkov@nginx.com sock.close() 1436