11625Smax.romanov@nginx.comimport struct 21625Smax.romanov@nginx.comimport time 31625Smax.romanov@nginx.com 41635Szelenkov@nginx.comimport pytest 52066Szelenkov@nginx.comfrom packaging import version 6*2616Szelenkov@nginx.com 72491Szelenkov@nginx.comfrom unit.applications.lang.python import ApplicationPython 82491Szelenkov@nginx.comfrom unit.applications.websockets import ApplicationWebsocket 91625Smax.romanov@nginx.com 102488Szelenkov@nginx.comprerequisites = { 112488Szelenkov@nginx.com 'modules': {'python': lambda v: version.parse(v) >= version.parse('3.5')} 122488Szelenkov@nginx.com} 132488Szelenkov@nginx.com 142491Szelenkov@nginx.comclient = ApplicationPython(load_module='asgi') 152491Szelenkov@nginx.comws = ApplicationWebsocket() 161625Smax.romanov@nginx.com 171625Smax.romanov@nginx.com 182491Szelenkov@nginx.com@pytest.fixture(autouse=True) 192491Szelenkov@nginx.comdef setup_method_fixture(skip_alert): 202491Szelenkov@nginx.com assert 'success' in client.conf( 212491Szelenkov@nginx.com {'http': {'websocket': {'keepalive_interval': 0}}}, 'settings' 222491Szelenkov@nginx.com ), 'clear keepalive_interval' 231625Smax.romanov@nginx.com 242491Szelenkov@nginx.com skip_alert(r'socket close\(\d+\) failed') 251625Smax.romanov@nginx.com 261625Smax.romanov@nginx.com 272491Szelenkov@nginx.comdef close_connection(sock): 282491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 291625Smax.romanov@nginx.com 302491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close()) 311625Smax.romanov@nginx.com 322491Szelenkov@nginx.com check_close(sock) 331625Smax.romanov@nginx.com 341625Smax.romanov@nginx.com 352491Szelenkov@nginx.comdef check_close(sock, code=1000, no_close=False, frame=None): 362491Szelenkov@nginx.com if frame is None: 372491Szelenkov@nginx.com frame = ws.frame_read(sock) 381625Smax.romanov@nginx.com 392491Szelenkov@nginx.com assert frame['fin'], 'close fin' 402491Szelenkov@nginx.com assert frame['opcode'] == ws.OP_CLOSE, 'close opcode' 412491Szelenkov@nginx.com assert frame['code'] == code, 'close code' 421625Smax.romanov@nginx.com 432491Szelenkov@nginx.com if not no_close: 441625Smax.romanov@nginx.com sock.close() 451625Smax.romanov@nginx.com 461625Smax.romanov@nginx.com 472491Szelenkov@nginx.comdef check_frame(frame, fin, opcode, payload, decode=True): 482491Szelenkov@nginx.com if opcode == ws.OP_BINARY or not decode: 492491Szelenkov@nginx.com data = frame['data'] 502491Szelenkov@nginx.com else: 512491Szelenkov@nginx.com data = frame['data'].decode('utf-8') 521625Smax.romanov@nginx.com 532491Szelenkov@nginx.com assert frame['fin'] == fin, 'fin' 542491Szelenkov@nginx.com assert frame['opcode'] == opcode, 'opcode' 552491Szelenkov@nginx.com assert data == payload, 'payload' 562491Szelenkov@nginx.com 572491Szelenkov@nginx.com 582491Szelenkov@nginx.comdef test_asgi_websockets_handshake(): 592491Szelenkov@nginx.com client.load('websockets/mirror') 602491Szelenkov@nginx.com 612491Szelenkov@nginx.com resp, sock, key = ws.upgrade() 622491Szelenkov@nginx.com sock.close() 631625Smax.romanov@nginx.com 642491Szelenkov@nginx.com assert resp['status'] == 101, 'status' 652491Szelenkov@nginx.com assert resp['headers']['Upgrade'] == 'websocket', 'upgrade' 662491Szelenkov@nginx.com assert resp['headers']['Connection'] == 'Upgrade', 'connection' 672491Szelenkov@nginx.com assert resp['headers']['Sec-WebSocket-Accept'] == ws.accept(key), 'key' 681625Smax.romanov@nginx.com 692491Szelenkov@nginx.com # remove "mirror" application 702491Szelenkov@nginx.com client.load('websockets/subprotocol') 711625Smax.romanov@nginx.com 722491Szelenkov@nginx.com 732491Szelenkov@nginx.comdef test_asgi_websockets_subprotocol(): 742491Szelenkov@nginx.com client.load('websockets/subprotocol') 751625Smax.romanov@nginx.com 762491Szelenkov@nginx.com resp, sock, _ = ws.upgrade() 772491Szelenkov@nginx.com sock.close() 781625Smax.romanov@nginx.com 792491Szelenkov@nginx.com assert resp['status'] == 101, 'status' 802491Szelenkov@nginx.com assert ( 812491Szelenkov@nginx.com resp['headers']['x-subprotocols'] == "('chat', 'phone', 'video')" 822491Szelenkov@nginx.com ), 'subprotocols' 832491Szelenkov@nginx.com assert resp['headers']['sec-websocket-protocol'] == 'chat', 'key' 841625Smax.romanov@nginx.com 852491Szelenkov@nginx.com 862491Szelenkov@nginx.comdef test_asgi_websockets_mirror(): 872491Szelenkov@nginx.com client.load('websockets/mirror') 881625Smax.romanov@nginx.com 892491Szelenkov@nginx.com message = 'blah' 902491Szelenkov@nginx.com 912491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 921625Smax.romanov@nginx.com 932491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, message) 942491Szelenkov@nginx.com frame = ws.frame_read(sock) 952491Szelenkov@nginx.com 962491Szelenkov@nginx.com assert message == frame['data'].decode('utf-8'), 'mirror' 971625Smax.romanov@nginx.com 982491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, message) 992491Szelenkov@nginx.com frame = ws.frame_read(sock) 1002491Szelenkov@nginx.com 1012491Szelenkov@nginx.com assert message == frame['data'].decode('utf-8'), 'mirror 2' 1021625Smax.romanov@nginx.com 1032491Szelenkov@nginx.com sock.close() 1042491Szelenkov@nginx.com 1051625Smax.romanov@nginx.com 1062491Szelenkov@nginx.comdef test_asgi_websockets_mirror_app_change(): 1072491Szelenkov@nginx.com client.load('websockets/mirror') 1082491Szelenkov@nginx.com 1092491Szelenkov@nginx.com message = 'blah' 1101625Smax.romanov@nginx.com 1112491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 1121625Smax.romanov@nginx.com 1132491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, message) 1142491Szelenkov@nginx.com frame = ws.frame_read(sock) 1151625Smax.romanov@nginx.com 1162491Szelenkov@nginx.com assert message == frame['data'].decode('utf-8'), 'mirror' 1172491Szelenkov@nginx.com 1182491Szelenkov@nginx.com client.load('websockets/subprotocol') 1191625Smax.romanov@nginx.com 1202491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, message) 1212491Szelenkov@nginx.com frame = ws.frame_read(sock) 1222491Szelenkov@nginx.com 1232491Szelenkov@nginx.com assert message == frame['data'].decode('utf-8'), 'mirror 2' 1241625Smax.romanov@nginx.com 1252491Szelenkov@nginx.com sock.close() 1262491Szelenkov@nginx.com 1271625Smax.romanov@nginx.com 1282491Szelenkov@nginx.comdef test_asgi_websockets_no_mask(): 1292491Szelenkov@nginx.com client.load('websockets/mirror') 1302491Szelenkov@nginx.com 1312491Szelenkov@nginx.com message = 'blah' 1321625Smax.romanov@nginx.com 1332491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 1342491Szelenkov@nginx.com 1352491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, message, mask=False) 1361625Smax.romanov@nginx.com 1372491Szelenkov@nginx.com frame = ws.frame_read(sock) 1381625Smax.romanov@nginx.com 1392491Szelenkov@nginx.com assert frame['opcode'] == ws.OP_CLOSE, 'no mask opcode' 1402491Szelenkov@nginx.com assert frame['code'] == 1002, 'no mask close code' 1411625Smax.romanov@nginx.com 1422491Szelenkov@nginx.com sock.close() 1432491Szelenkov@nginx.com 1441625Smax.romanov@nginx.com 1452491Szelenkov@nginx.comdef test_asgi_websockets_fragmentation(): 1462491Szelenkov@nginx.com client.load('websockets/mirror') 1471625Smax.romanov@nginx.com 1482491Szelenkov@nginx.com message = 'blah' 1492491Szelenkov@nginx.com 1502491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 1511625Smax.romanov@nginx.com 1522491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, message, fin=False) 1532491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, ' ', fin=False) 1542491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, message) 1552491Szelenkov@nginx.com 1562491Szelenkov@nginx.com frame = ws.frame_read(sock) 1571625Smax.romanov@nginx.com 1582491Szelenkov@nginx.com assert f'{message} {message}' == frame['data'].decode( 1592491Szelenkov@nginx.com 'utf-8' 1602491Szelenkov@nginx.com ), 'mirror framing' 1611625Smax.romanov@nginx.com 1622491Szelenkov@nginx.com sock.close() 1631625Smax.romanov@nginx.com 1642491Szelenkov@nginx.com 1652491Szelenkov@nginx.comdef test_asgi_websockets_length_long(): 1662491Szelenkov@nginx.com client.load('websockets/mirror') 1672491Szelenkov@nginx.com 1682491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 1691625Smax.romanov@nginx.com 1702491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 1712491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', length=2**64 - 1) 1721625Smax.romanov@nginx.com 1732491Szelenkov@nginx.com check_close(sock, 1009) # 1009 - CLOSE_TOO_LARGE 1742491Szelenkov@nginx.com 1751625Smax.romanov@nginx.com 1762491Szelenkov@nginx.comdef test_asgi_websockets_frame_fragmentation_invalid(): 1772491Szelenkov@nginx.com client.load('websockets/mirror') 1782491Szelenkov@nginx.com 1792491Szelenkov@nginx.com message = 'blah' 1801625Smax.romanov@nginx.com 1812491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 1821625Smax.romanov@nginx.com 1832491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, message, fin=False) 1842491Szelenkov@nginx.com 1852491Szelenkov@nginx.com frame = ws.frame_read(sock) 1861625Smax.romanov@nginx.com 1872491Szelenkov@nginx.com frame.pop('data') 1882491Szelenkov@nginx.com assert frame == { 1892491Szelenkov@nginx.com 'fin': True, 1902491Szelenkov@nginx.com 'rsv1': False, 1912491Szelenkov@nginx.com 'rsv2': False, 1922491Szelenkov@nginx.com 'rsv3': False, 1932491Szelenkov@nginx.com 'opcode': ws.OP_CLOSE, 1942491Szelenkov@nginx.com 'mask': 0, 1952491Szelenkov@nginx.com 'code': 1002, 1962491Szelenkov@nginx.com 'reason': 'Fragmented control frame', 1972491Szelenkov@nginx.com }, 'close frame' 1981625Smax.romanov@nginx.com 1992491Szelenkov@nginx.com sock.close() 2002491Szelenkov@nginx.com 2011625Smax.romanov@nginx.com 2022491Szelenkov@nginx.comdef test_asgi_websockets_large(): 2032491Szelenkov@nginx.com client.load('websockets/mirror') 2041625Smax.romanov@nginx.com 2052491Szelenkov@nginx.com message = '0123456789' * 300 2062491Szelenkov@nginx.com 2072491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 2081625Smax.romanov@nginx.com 2092491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, message) 2102491Szelenkov@nginx.com 2112491Szelenkov@nginx.com frame = ws.frame_read(sock) 2122491Szelenkov@nginx.com data = frame['data'].decode('utf-8') 2131625Smax.romanov@nginx.com 2142491Szelenkov@nginx.com frame = ws.frame_read(sock) 2152491Szelenkov@nginx.com data += frame['data'].decode('utf-8') 2161625Smax.romanov@nginx.com 2172491Szelenkov@nginx.com assert message == data, 'large' 2182491Szelenkov@nginx.com 2192491Szelenkov@nginx.com sock.close() 2202491Szelenkov@nginx.com 2211625Smax.romanov@nginx.com 2222491Szelenkov@nginx.comdef test_asgi_websockets_two_clients(): 2232491Szelenkov@nginx.com client.load('websockets/mirror') 2241625Smax.romanov@nginx.com 2252491Szelenkov@nginx.com message1 = 'blah1' 2262491Szelenkov@nginx.com message2 = 'blah2' 2271625Smax.romanov@nginx.com 2282491Szelenkov@nginx.com _, sock1, _ = ws.upgrade() 2292491Szelenkov@nginx.com _, sock2, _ = ws.upgrade() 2301625Smax.romanov@nginx.com 2312491Szelenkov@nginx.com ws.frame_write(sock1, ws.OP_TEXT, message1) 2322491Szelenkov@nginx.com ws.frame_write(sock2, ws.OP_TEXT, message2) 2332491Szelenkov@nginx.com 2342491Szelenkov@nginx.com frame1 = ws.frame_read(sock1) 2352491Szelenkov@nginx.com frame2 = ws.frame_read(sock2) 2361625Smax.romanov@nginx.com 2372491Szelenkov@nginx.com assert message1 == frame1['data'].decode('utf-8'), 'client 1' 2382491Szelenkov@nginx.com assert message2 == frame2['data'].decode('utf-8'), 'client 2' 2392491Szelenkov@nginx.com 2402491Szelenkov@nginx.com sock1.close() 2412491Szelenkov@nginx.com sock2.close() 2421625Smax.romanov@nginx.com 2431625Smax.romanov@nginx.com 2442491Szelenkov@nginx.com# FAIL https://tools.ietf.org/html/rfc6455#section-4.2.1 2452491Szelenkov@nginx.com@pytest.mark.skip('not yet') 2462491Szelenkov@nginx.comdef test_asgi_websockets_handshake_upgrade_absent(): 2472491Szelenkov@nginx.com client.load('websockets/mirror') 2481625Smax.romanov@nginx.com 2492491Szelenkov@nginx.com resp = client.get( 2502491Szelenkov@nginx.com headers={ 2512491Szelenkov@nginx.com 'Host': 'localhost', 2522491Szelenkov@nginx.com 'Connection': 'Upgrade', 2532491Szelenkov@nginx.com 'Sec-WebSocket-Key': ws.key(), 2542491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2552491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2562491Szelenkov@nginx.com }, 2572491Szelenkov@nginx.com ) 2581625Smax.romanov@nginx.com 2592491Szelenkov@nginx.com assert resp['status'] == 400, 'upgrade absent' 2602491Szelenkov@nginx.com 2611625Smax.romanov@nginx.com 2622491Szelenkov@nginx.comdef test_asgi_websockets_handshake_case_insensitive(): 2632491Szelenkov@nginx.com client.load('websockets/mirror') 2641625Smax.romanov@nginx.com 2652491Szelenkov@nginx.com resp, sock, _ = ws.upgrade( 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': ws.key(), 2712491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2722491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2732491Szelenkov@nginx.com } 2742491Szelenkov@nginx.com ) 2752491Szelenkov@nginx.com sock.close() 2761625Smax.romanov@nginx.com 2772491Szelenkov@nginx.com assert resp['status'] == 101, 'status' 2782491Szelenkov@nginx.com 2791625Smax.romanov@nginx.com 2802491Szelenkov@nginx.com@pytest.mark.skip('not yet') 2812491Szelenkov@nginx.comdef test_asgi_websockets_handshake_connection_absent(): # FAIL 2822491Szelenkov@nginx.com client.load('websockets/mirror') 2831625Smax.romanov@nginx.com 2842491Szelenkov@nginx.com resp = client.get( 2852491Szelenkov@nginx.com headers={ 2862491Szelenkov@nginx.com 'Host': 'localhost', 2872491Szelenkov@nginx.com 'Upgrade': 'websocket', 2882491Szelenkov@nginx.com 'Sec-WebSocket-Key': ws.key(), 2892491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 2902491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 2912491Szelenkov@nginx.com }, 2922491Szelenkov@nginx.com ) 2931625Smax.romanov@nginx.com 2942491Szelenkov@nginx.com assert resp['status'] == 400, 'status' 2951625Smax.romanov@nginx.com 2961625Smax.romanov@nginx.com 2972491Szelenkov@nginx.comdef test_asgi_websockets_handshake_version_absent(): 2982491Szelenkov@nginx.com client.load('websockets/mirror') 2991625Smax.romanov@nginx.com 3002491Szelenkov@nginx.com resp = client.get( 3012491Szelenkov@nginx.com headers={ 3022491Szelenkov@nginx.com 'Host': 'localhost', 3032491Szelenkov@nginx.com 'Upgrade': 'websocket', 3042491Szelenkov@nginx.com 'Connection': 'Upgrade', 3052491Szelenkov@nginx.com 'Sec-WebSocket-Key': ws.key(), 3062491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 3072491Szelenkov@nginx.com }, 3082491Szelenkov@nginx.com ) 3091625Smax.romanov@nginx.com 3102491Szelenkov@nginx.com assert resp['status'] == 426, 'status' 3111625Smax.romanov@nginx.com 3121625Smax.romanov@nginx.com 3132491Szelenkov@nginx.com@pytest.mark.skip('not yet') 3142491Szelenkov@nginx.comdef test_asgi_websockets_handshake_key_invalid(): 3152491Szelenkov@nginx.com client.load('websockets/mirror') 3161625Smax.romanov@nginx.com 3172491Szelenkov@nginx.com resp = client.get( 3182491Szelenkov@nginx.com headers={ 3192491Szelenkov@nginx.com 'Host': 'localhost', 3202491Szelenkov@nginx.com 'Upgrade': 'websocket', 3212491Szelenkov@nginx.com 'Connection': 'Upgrade', 3222491Szelenkov@nginx.com 'Sec-WebSocket-Key': '!', 3232491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 3242491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 3252491Szelenkov@nginx.com }, 3262491Szelenkov@nginx.com ) 3271625Smax.romanov@nginx.com 3282491Szelenkov@nginx.com assert resp['status'] == 400, 'key length' 3291625Smax.romanov@nginx.com 3302491Szelenkov@nginx.com key = ws.key() 3312491Szelenkov@nginx.com resp = client.get( 3322491Szelenkov@nginx.com headers={ 3332491Szelenkov@nginx.com 'Host': 'localhost', 3342491Szelenkov@nginx.com 'Upgrade': 'websocket', 3352491Szelenkov@nginx.com 'Connection': 'Upgrade', 3362491Szelenkov@nginx.com 'Sec-WebSocket-Key': [key, key], 3372491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 3382491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 3392491Szelenkov@nginx.com }, 3402491Szelenkov@nginx.com ) 3411625Smax.romanov@nginx.com 3422491Szelenkov@nginx.com assert ( 3432491Szelenkov@nginx.com resp['status'] == 400 3442491Szelenkov@nginx.com ), 'key double' # FAIL https://tools.ietf.org/html/rfc6455#section-11.3.1 3451625Smax.romanov@nginx.com 3461625Smax.romanov@nginx.com 3472491Szelenkov@nginx.comdef test_asgi_websockets_handshake_method_invalid(): 3482491Szelenkov@nginx.com client.load('websockets/mirror') 3491625Smax.romanov@nginx.com 3502491Szelenkov@nginx.com resp = client.post( 3512491Szelenkov@nginx.com headers={ 3522491Szelenkov@nginx.com 'Host': 'localhost', 3532491Szelenkov@nginx.com 'Upgrade': 'websocket', 3542491Szelenkov@nginx.com 'Connection': 'Upgrade', 3552491Szelenkov@nginx.com 'Sec-WebSocket-Key': ws.key(), 3562491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 3572491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 3582491Szelenkov@nginx.com }, 3592491Szelenkov@nginx.com ) 3601625Smax.romanov@nginx.com 3612491Szelenkov@nginx.com assert resp['status'] == 400, 'status' 3622491Szelenkov@nginx.com 3631625Smax.romanov@nginx.com 3642491Szelenkov@nginx.comdef test_asgi_websockets_handshake_http_10(): 3652491Szelenkov@nginx.com client.load('websockets/mirror') 3661625Smax.romanov@nginx.com 3672491Szelenkov@nginx.com resp = client.get( 3682491Szelenkov@nginx.com headers={ 3692491Szelenkov@nginx.com 'Host': 'localhost', 3702491Szelenkov@nginx.com 'Upgrade': 'websocket', 3712491Szelenkov@nginx.com 'Connection': 'Upgrade', 3722491Szelenkov@nginx.com 'Sec-WebSocket-Key': ws.key(), 3732491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 3742491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 3752491Szelenkov@nginx.com }, 3762491Szelenkov@nginx.com http_10=True, 3772491Szelenkov@nginx.com ) 3781625Smax.romanov@nginx.com 3792491Szelenkov@nginx.com assert resp['status'] == 400, 'status' 3802491Szelenkov@nginx.com 3812491Szelenkov@nginx.com 3822491Szelenkov@nginx.comdef test_asgi_websockets_handshake_uri_invalid(): 3832491Szelenkov@nginx.com client.load('websockets/mirror') 3841625Smax.romanov@nginx.com 3852491Szelenkov@nginx.com resp = client.get( 3862491Szelenkov@nginx.com headers={ 3872491Szelenkov@nginx.com 'Host': 'localhost', 3882491Szelenkov@nginx.com 'Upgrade': 'websocket', 3892491Szelenkov@nginx.com 'Connection': 'Upgrade', 3902491Szelenkov@nginx.com 'Sec-WebSocket-Key': ws.key(), 3912491Szelenkov@nginx.com 'Sec-WebSocket-Protocol': 'chat', 3922491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 3932491Szelenkov@nginx.com }, 3942491Szelenkov@nginx.com url='!', 3952491Szelenkov@nginx.com ) 3961625Smax.romanov@nginx.com 3972491Szelenkov@nginx.com assert resp['status'] == 400, 'status' 3982491Szelenkov@nginx.com 3991625Smax.romanov@nginx.com 4002491Szelenkov@nginx.comdef test_asgi_websockets_protocol_absent(): 4012491Szelenkov@nginx.com client.load('websockets/mirror') 4021625Smax.romanov@nginx.com 4032491Szelenkov@nginx.com key = ws.key() 4042491Szelenkov@nginx.com resp, sock, _ = ws.upgrade( 4052491Szelenkov@nginx.com headers={ 4062491Szelenkov@nginx.com 'Host': 'localhost', 4072491Szelenkov@nginx.com 'Upgrade': 'websocket', 4082491Szelenkov@nginx.com 'Connection': 'Upgrade', 4092491Szelenkov@nginx.com 'Sec-WebSocket-Key': key, 4102491Szelenkov@nginx.com 'Sec-WebSocket-Version': 13, 4112491Szelenkov@nginx.com } 4122491Szelenkov@nginx.com ) 4132491Szelenkov@nginx.com sock.close() 4141625Smax.romanov@nginx.com 4152491Szelenkov@nginx.com assert resp['status'] == 101, 'status' 4162491Szelenkov@nginx.com assert resp['headers']['Upgrade'] == 'websocket', 'upgrade' 4172491Szelenkov@nginx.com assert resp['headers']['Connection'] == 'Upgrade', 'connection' 4182491Szelenkov@nginx.com assert resp['headers']['Sec-WebSocket-Accept'] == ws.accept(key), 'key' 4191625Smax.romanov@nginx.com 4201625Smax.romanov@nginx.com 4212491Szelenkov@nginx.com# autobahn-testsuite 4222491Szelenkov@nginx.com# 4232491Szelenkov@nginx.com# Some following tests fail because of Unit does not support UTF-8 4242491Szelenkov@nginx.com# validation for websocket frames. It should be implemented 4252491Szelenkov@nginx.com# by application, if necessary. 4261625Smax.romanov@nginx.com 4271625Smax.romanov@nginx.com 4282491Szelenkov@nginx.comdef test_asgi_websockets_1_1_1__1_1_8(): 4292491Szelenkov@nginx.com client.load('websockets/mirror') 4301625Smax.romanov@nginx.com 4312491Szelenkov@nginx.com opcode = ws.OP_TEXT 4322491Szelenkov@nginx.com 4332491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 4342491Szelenkov@nginx.com 4352491Szelenkov@nginx.com def check_length(length, chopsize=None): 4362491Szelenkov@nginx.com payload = '*' * length 4372491Szelenkov@nginx.com 4382491Szelenkov@nginx.com ws.frame_write(sock, opcode, payload, chopsize=chopsize) 4392491Szelenkov@nginx.com 4402491Szelenkov@nginx.com frame = ws.frame_read(sock) 4412491Szelenkov@nginx.com check_frame(frame, True, opcode, payload) 4421625Smax.romanov@nginx.com 4432491Szelenkov@nginx.com check_length(0) # 1_1_1 4442491Szelenkov@nginx.com check_length(125) # 1_1_2 4452491Szelenkov@nginx.com check_length(126) # 1_1_3 4462491Szelenkov@nginx.com check_length(127) # 1_1_4 4472491Szelenkov@nginx.com check_length(128) # 1_1_5 4482491Szelenkov@nginx.com check_length(65535) # 1_1_6 4492491Szelenkov@nginx.com check_length(65536) # 1_1_7 4502491Szelenkov@nginx.com check_length(65536, chopsize=997) # 1_1_8 4511625Smax.romanov@nginx.com 4522491Szelenkov@nginx.com close_connection(sock) 4532491Szelenkov@nginx.com 4541625Smax.romanov@nginx.com 4552491Szelenkov@nginx.comdef test_asgi_websockets_1_2_1__1_2_8(): 4562491Szelenkov@nginx.com client.load('websockets/mirror') 4572491Szelenkov@nginx.com 4582491Szelenkov@nginx.com opcode = ws.OP_BINARY 4591625Smax.romanov@nginx.com 4602491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 4612491Szelenkov@nginx.com 4622491Szelenkov@nginx.com def check_length(length, chopsize=None): 4632491Szelenkov@nginx.com payload = b'\xfe' * length 4642491Szelenkov@nginx.com 4652491Szelenkov@nginx.com ws.frame_write(sock, opcode, payload, chopsize=chopsize) 4662491Szelenkov@nginx.com frame = ws.frame_read(sock) 4671625Smax.romanov@nginx.com 4682491Szelenkov@nginx.com check_frame(frame, True, opcode, payload) 4691625Smax.romanov@nginx.com 4702491Szelenkov@nginx.com check_length(0) # 1_2_1 4712491Szelenkov@nginx.com check_length(125) # 1_2_2 4722491Szelenkov@nginx.com check_length(126) # 1_2_3 4732491Szelenkov@nginx.com check_length(127) # 1_2_4 4742491Szelenkov@nginx.com check_length(128) # 1_2_5 4752491Szelenkov@nginx.com check_length(65535) # 1_2_6 4762491Szelenkov@nginx.com check_length(65536) # 1_2_7 4772491Szelenkov@nginx.com check_length(65536, chopsize=997) # 1_2_8 4782491Szelenkov@nginx.com 4792491Szelenkov@nginx.com close_connection(sock) 4801625Smax.romanov@nginx.com 4812491Szelenkov@nginx.com 4822491Szelenkov@nginx.comdef test_asgi_websockets_2_1__2_6(): 4832491Szelenkov@nginx.com client.load('websockets/mirror') 4841625Smax.romanov@nginx.com 4852491Szelenkov@nginx.com op_ping = ws.OP_PING 4862491Szelenkov@nginx.com op_pong = ws.OP_PONG 4871625Smax.romanov@nginx.com 4882491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 4892491Szelenkov@nginx.com 4902491Szelenkov@nginx.com def check_ping(payload, chopsize=None, decode=True): 4912491Szelenkov@nginx.com ws.frame_write(sock, op_ping, payload, chopsize=chopsize) 4922491Szelenkov@nginx.com frame = ws.frame_read(sock) 4931625Smax.romanov@nginx.com 4942491Szelenkov@nginx.com check_frame(frame, True, op_pong, payload, decode=decode) 4952491Szelenkov@nginx.com 4962491Szelenkov@nginx.com check_ping('') # 2_1 4972491Szelenkov@nginx.com check_ping('Hello, world!') # 2_2 4982491Szelenkov@nginx.com check_ping(b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff', decode=False) # 2_3 4992491Szelenkov@nginx.com check_ping(b'\xfe' * 125, decode=False) # 2_4 5002491Szelenkov@nginx.com check_ping(b'\xfe' * 125, chopsize=1, decode=False) # 2_6 5012491Szelenkov@nginx.com 5022491Szelenkov@nginx.com close_connection(sock) 5032491Szelenkov@nginx.com 5042491Szelenkov@nginx.com # 2_5 5052491Szelenkov@nginx.com 5062491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 5072491Szelenkov@nginx.com 5082491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, b'\xfe' * 126) 5092491Szelenkov@nginx.com check_close(sock, 1002) 5102491Szelenkov@nginx.com 5112491Szelenkov@nginx.com 5122491Szelenkov@nginx.comdef test_asgi_websockets_2_7__2_9(): 5132491Szelenkov@nginx.com client.load('websockets/mirror') 5142491Szelenkov@nginx.com 5152491Szelenkov@nginx.com # 2_7 5161625Smax.romanov@nginx.com 5172491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 5182491Szelenkov@nginx.com 5192491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PONG, '') 5202491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', '2_7' 5211625Smax.romanov@nginx.com 5222491Szelenkov@nginx.com # 2_8 5232491Szelenkov@nginx.com 5242491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PONG, 'unsolicited pong payload') 5252491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', '2_8' 5261625Smax.romanov@nginx.com 5272491Szelenkov@nginx.com # 2_9 5282491Szelenkov@nginx.com 5292491Szelenkov@nginx.com payload = 'ping payload' 5301625Smax.romanov@nginx.com 5312491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PONG, 'unsolicited pong payload') 5322491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, payload) 5331625Smax.romanov@nginx.com 5342491Szelenkov@nginx.com frame = ws.frame_read(sock) 5352491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, payload) 5362491Szelenkov@nginx.com 5372491Szelenkov@nginx.com close_connection(sock) 5382491Szelenkov@nginx.com 5391625Smax.romanov@nginx.com 5402491Szelenkov@nginx.comdef test_asgi_websockets_2_10__2_11(): 5412491Szelenkov@nginx.com client.load('websockets/mirror') 5422491Szelenkov@nginx.com 5432491Szelenkov@nginx.com # 2_10 5442491Szelenkov@nginx.com 5452491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 5462491Szelenkov@nginx.com 5472491Szelenkov@nginx.com for i in range(0, 10): 5482491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, f'payload-{i}') 5491625Smax.romanov@nginx.com 5502491Szelenkov@nginx.com for i in range(0, 10): 5512491Szelenkov@nginx.com frame = ws.frame_read(sock) 5522491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, f'payload-{i}') 5532491Szelenkov@nginx.com 5542491Szelenkov@nginx.com # 2_11 5551625Smax.romanov@nginx.com 5562491Szelenkov@nginx.com for i in range(0, 10): 5572491Szelenkov@nginx.com opcode = ws.OP_PING 5582491Szelenkov@nginx.com ws.frame_write(sock, opcode, f'payload-{i}', chopsize=1) 5592491Szelenkov@nginx.com 5602491Szelenkov@nginx.com for i in range(0, 10): 5612491Szelenkov@nginx.com frame = ws.frame_read(sock) 5622491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, f'payload-{i}') 5631625Smax.romanov@nginx.com 5642491Szelenkov@nginx.com close_connection(sock) 5652491Szelenkov@nginx.com 5662491Szelenkov@nginx.com 5672491Szelenkov@nginx.com@pytest.mark.skip('not yet') 5682491Szelenkov@nginx.comdef test_asgi_websockets_3_1__3_7(): 5692491Szelenkov@nginx.com client.load('websockets/mirror') 5702491Szelenkov@nginx.com 5712491Szelenkov@nginx.com payload = 'Hello, world!' 5722491Szelenkov@nginx.com 5732491Szelenkov@nginx.com # 3_1 5741625Smax.romanov@nginx.com 5752491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 5761625Smax.romanov@nginx.com 5772491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload, rsv1=True) 5782491Szelenkov@nginx.com check_close(sock, 1002) 5791625Smax.romanov@nginx.com 5802491Szelenkov@nginx.com # 3_2 5812491Szelenkov@nginx.com 5822491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 5831819Smax.romanov@nginx.com 5842491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 5852491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload, rsv2=True) 5862491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 5871819Smax.romanov@nginx.com 5882491Szelenkov@nginx.com frame = ws.frame_read(sock) 5892491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 5902491Szelenkov@nginx.com 5912491Szelenkov@nginx.com check_close(sock, 1002, no_close=True) 5922491Szelenkov@nginx.com 5932491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', 'empty 3_2' 5942491Szelenkov@nginx.com sock.close() 5952491Szelenkov@nginx.com 5962491Szelenkov@nginx.com # 3_3 5971819Smax.romanov@nginx.com 5982491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 5992491Szelenkov@nginx.com 6002491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 6011625Smax.romanov@nginx.com 6022491Szelenkov@nginx.com frame = ws.frame_read(sock) 6032491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 6041625Smax.romanov@nginx.com 6052491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload, rsv1=True, rsv2=True) 6062491Szelenkov@nginx.com 6072491Szelenkov@nginx.com check_close(sock, 1002, no_close=True) 6081625Smax.romanov@nginx.com 6092491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', 'empty 3_3' 6102491Szelenkov@nginx.com sock.close() 6112491Szelenkov@nginx.com 6122491Szelenkov@nginx.com # 3_4 6131625Smax.romanov@nginx.com 6142491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6152491Szelenkov@nginx.com 6162491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload, chopsize=1) 6172491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload, rsv3=True, chopsize=1) 6182491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 6191625Smax.romanov@nginx.com 6202491Szelenkov@nginx.com frame = ws.frame_read(sock) 6212491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 6222491Szelenkov@nginx.com 6232491Szelenkov@nginx.com check_close(sock, 1002, no_close=True) 6241625Smax.romanov@nginx.com 6252491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', 'empty 3_4' 6262491Szelenkov@nginx.com sock.close() 6272491Szelenkov@nginx.com 6282491Szelenkov@nginx.com # 3_5 6292491Szelenkov@nginx.com 6302491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6311625Smax.romanov@nginx.com 6322491Szelenkov@nginx.com ws.frame_write( 6332491Szelenkov@nginx.com sock, 6342491Szelenkov@nginx.com ws.OP_BINARY, 6352491Szelenkov@nginx.com b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff', 6362491Szelenkov@nginx.com rsv1=True, 6372491Szelenkov@nginx.com rsv3=True, 6382491Szelenkov@nginx.com ) 6391625Smax.romanov@nginx.com 6402491Szelenkov@nginx.com check_close(sock, 1002) 6412491Szelenkov@nginx.com 6422491Szelenkov@nginx.com # 3_6 6431625Smax.romanov@nginx.com 6442491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6452491Szelenkov@nginx.com 6462491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, payload, rsv2=True, rsv3=True) 6472491Szelenkov@nginx.com 6482491Szelenkov@nginx.com check_close(sock, 1002) 6491625Smax.romanov@nginx.com 6502491Szelenkov@nginx.com # 3_7 6511625Smax.romanov@nginx.com 6522491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6532491Szelenkov@nginx.com 6542491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, payload, rsv1=True, rsv2=True, rsv3=True) 6551625Smax.romanov@nginx.com 6562491Szelenkov@nginx.com check_close(sock, 1002) 6572491Szelenkov@nginx.com 6582491Szelenkov@nginx.com 6592491Szelenkov@nginx.comdef test_asgi_websockets_4_1_1__4_2_5(): 6602491Szelenkov@nginx.com client.load('websockets/mirror') 6611625Smax.romanov@nginx.com 6622491Szelenkov@nginx.com payload = 'Hello, world!' 6632491Szelenkov@nginx.com 6642491Szelenkov@nginx.com # 4_1_1 6652491Szelenkov@nginx.com 6662491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6671625Smax.romanov@nginx.com 6682491Szelenkov@nginx.com ws.frame_write(sock, 0x03, '') 6692491Szelenkov@nginx.com check_close(sock, 1002) 6702491Szelenkov@nginx.com 6712491Szelenkov@nginx.com # 4_1_2 6722491Szelenkov@nginx.com 6732491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6741625Smax.romanov@nginx.com 6752491Szelenkov@nginx.com ws.frame_write(sock, 0x04, 'reserved opcode payload') 6762491Szelenkov@nginx.com check_close(sock, 1002) 6771625Smax.romanov@nginx.com 6782491Szelenkov@nginx.com # 4_1_3 6792491Szelenkov@nginx.com 6802491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6811625Smax.romanov@nginx.com 6822491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 6832491Szelenkov@nginx.com 6842491Szelenkov@nginx.com frame = ws.frame_read(sock) 6852491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 6862491Szelenkov@nginx.com 6872491Szelenkov@nginx.com ws.frame_write(sock, 0x05, '') 6882491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 6892491Szelenkov@nginx.com 6902491Szelenkov@nginx.com check_close(sock, 1002) 6911625Smax.romanov@nginx.com 6922491Szelenkov@nginx.com # 4_1_4 6932491Szelenkov@nginx.com 6942491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 6952491Szelenkov@nginx.com 6962491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 6971625Smax.romanov@nginx.com 6982491Szelenkov@nginx.com frame = ws.frame_read(sock) 6992491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 7002491Szelenkov@nginx.com 7012491Szelenkov@nginx.com ws.frame_write(sock, 0x06, payload) 7022491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 7031625Smax.romanov@nginx.com 7042491Szelenkov@nginx.com check_close(sock, 1002) 7052491Szelenkov@nginx.com 7062491Szelenkov@nginx.com # 4_1_5 7071625Smax.romanov@nginx.com 7082491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 7092491Szelenkov@nginx.com 7102491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload, chopsize=1) 7112491Szelenkov@nginx.com 7122491Szelenkov@nginx.com frame = ws.frame_read(sock) 7132491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 7141625Smax.romanov@nginx.com 7152491Szelenkov@nginx.com ws.frame_write(sock, 0x07, payload, chopsize=1) 7162491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 7172491Szelenkov@nginx.com 7182491Szelenkov@nginx.com check_close(sock, 1002) 7192491Szelenkov@nginx.com 7202491Szelenkov@nginx.com # 4_2_1 7211625Smax.romanov@nginx.com 7222491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 7231625Smax.romanov@nginx.com 7242491Szelenkov@nginx.com ws.frame_write(sock, 0x0B, '') 7252491Szelenkov@nginx.com check_close(sock, 1002) 7262491Szelenkov@nginx.com 7272491Szelenkov@nginx.com # 4_2_2 7281625Smax.romanov@nginx.com 7292491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 7302491Szelenkov@nginx.com 7312491Szelenkov@nginx.com ws.frame_write(sock, 0x0C, 'reserved opcode payload') 7322491Szelenkov@nginx.com check_close(sock, 1002) 7332491Szelenkov@nginx.com 7342491Szelenkov@nginx.com # 4_2_3 7352491Szelenkov@nginx.com 7362491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 7372491Szelenkov@nginx.com 7382491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 7391625Smax.romanov@nginx.com 7402491Szelenkov@nginx.com frame = ws.frame_read(sock) 7412491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 7422491Szelenkov@nginx.com 7432491Szelenkov@nginx.com ws.frame_write(sock, 0x0D, '') 7442491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 7451625Smax.romanov@nginx.com 7462491Szelenkov@nginx.com check_close(sock, 1002) 7471625Smax.romanov@nginx.com 7482491Szelenkov@nginx.com # 4_2_4 7492491Szelenkov@nginx.com 7502491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 7511625Smax.romanov@nginx.com 7522491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 7532491Szelenkov@nginx.com 7542491Szelenkov@nginx.com frame = ws.frame_read(sock) 7552491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 7561625Smax.romanov@nginx.com 7572491Szelenkov@nginx.com ws.frame_write(sock, 0x0E, payload) 7582491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 7592491Szelenkov@nginx.com 7602491Szelenkov@nginx.com check_close(sock, 1002) 7612491Szelenkov@nginx.com 7622491Szelenkov@nginx.com # 4_2_5 7631625Smax.romanov@nginx.com 7642491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 7652491Szelenkov@nginx.com 7662491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload, chopsize=1) 7671625Smax.romanov@nginx.com 7682491Szelenkov@nginx.com frame = ws.frame_read(sock) 7692491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 7701625Smax.romanov@nginx.com 7712491Szelenkov@nginx.com ws.frame_write(sock, 0x0F, payload, chopsize=1) 7722491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 7732491Szelenkov@nginx.com 7742491Szelenkov@nginx.com check_close(sock, 1002) 7751625Smax.romanov@nginx.com 7762491Szelenkov@nginx.com 7772491Szelenkov@nginx.comdef test_asgi_websockets_5_1__5_20(): 7782491Szelenkov@nginx.com client.load('websockets/mirror') 7791625Smax.romanov@nginx.com 7802491Szelenkov@nginx.com # 5_1 7812491Szelenkov@nginx.com 7822491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 7831625Smax.romanov@nginx.com 7842491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, 'fragment1', fin=False) 7852491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True) 7862491Szelenkov@nginx.com check_close(sock, 1002) 7872491Szelenkov@nginx.com 7882491Szelenkov@nginx.com # 5_2 7891625Smax.romanov@nginx.com 7902491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 7912491Szelenkov@nginx.com 7922491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PONG, 'fragment1', fin=False) 7932491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True) 7942491Szelenkov@nginx.com check_close(sock, 1002) 7952491Szelenkov@nginx.com 7962491Szelenkov@nginx.com # 5_3 7971625Smax.romanov@nginx.com 7982491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 7992491Szelenkov@nginx.com 8002491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 8012491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True) 8021625Smax.romanov@nginx.com 8032491Szelenkov@nginx.com frame = ws.frame_read(sock) 8042491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2') 8052491Szelenkov@nginx.com 8062491Szelenkov@nginx.com # 5_4 8071625Smax.romanov@nginx.com 8082491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 8092491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', '5_4' 8102491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True) 8111625Smax.romanov@nginx.com 8122491Szelenkov@nginx.com frame = ws.frame_read(sock) 8132491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2') 8141625Smax.romanov@nginx.com 8152491Szelenkov@nginx.com # 5_5 8162491Szelenkov@nginx.com 8172491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False, chopsize=1) 8182491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True, chopsize=1) 8191625Smax.romanov@nginx.com 8202491Szelenkov@nginx.com frame = ws.frame_read(sock) 8212491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2') 8222491Szelenkov@nginx.com 8232491Szelenkov@nginx.com # 5_6 8242491Szelenkov@nginx.com 8252491Szelenkov@nginx.com ping_payload = 'ping payload' 8261625Smax.romanov@nginx.com 8272491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 8282491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, ping_payload) 8292491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True) 8302491Szelenkov@nginx.com 8312491Szelenkov@nginx.com frame = ws.frame_read(sock) 8322491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, ping_payload) 8331625Smax.romanov@nginx.com 8342491Szelenkov@nginx.com frame = ws.frame_read(sock) 8352491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2') 8361625Smax.romanov@nginx.com 8372491Szelenkov@nginx.com # 5_7 8382491Szelenkov@nginx.com 8392491Szelenkov@nginx.com ping_payload = 'ping payload' 8401625Smax.romanov@nginx.com 8412491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 8422491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', '5_7' 8432491Szelenkov@nginx.com 8442491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, ping_payload) 8451625Smax.romanov@nginx.com 8462491Szelenkov@nginx.com frame = ws.frame_read(sock) 8472491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, ping_payload) 8481625Smax.romanov@nginx.com 8492491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True) 8501625Smax.romanov@nginx.com 8512491Szelenkov@nginx.com frame = ws.frame_read(sock) 8522491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2') 8532491Szelenkov@nginx.com 8542491Szelenkov@nginx.com # 5_8 8552491Szelenkov@nginx.com 8562491Szelenkov@nginx.com ping_payload = 'ping payload' 8571625Smax.romanov@nginx.com 8582491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False, chopsize=1) 8592491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, ping_payload, chopsize=1) 8602491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True, chopsize=1) 8611625Smax.romanov@nginx.com 8622491Szelenkov@nginx.com frame = ws.frame_read(sock) 8632491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, ping_payload) 8641625Smax.romanov@nginx.com 8652491Szelenkov@nginx.com frame = ws.frame_read(sock) 8662491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2') 8672491Szelenkov@nginx.com 8682491Szelenkov@nginx.com # 5_9 8692491Szelenkov@nginx.com 8702491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'non-continuation payload', fin=True) 8712491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True) 8722491Szelenkov@nginx.com check_close(sock, 1002) 8732491Szelenkov@nginx.com 8742491Szelenkov@nginx.com # 5_10 8752491Szelenkov@nginx.com 8762491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 8772491Szelenkov@nginx.com 8782491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'non-continuation payload', fin=True) 8792491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True) 8802491Szelenkov@nginx.com check_close(sock, 1002) 8812491Szelenkov@nginx.com 8822491Szelenkov@nginx.com # 5_11 8832491Szelenkov@nginx.com 8842491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 8851625Smax.romanov@nginx.com 8862491Szelenkov@nginx.com ws.frame_write( 8872491Szelenkov@nginx.com sock, 8882491Szelenkov@nginx.com ws.OP_CONT, 8892491Szelenkov@nginx.com 'non-continuation payload', 8902491Szelenkov@nginx.com fin=True, 8912491Szelenkov@nginx.com chopsize=1, 8922491Szelenkov@nginx.com ) 8932491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1) 8942491Szelenkov@nginx.com check_close(sock, 1002) 8951625Smax.romanov@nginx.com 8962491Szelenkov@nginx.com # 5_12 8972491Szelenkov@nginx.com 8982491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 8991625Smax.romanov@nginx.com 9002491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'non-continuation payload', fin=False) 9012491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True) 9022491Szelenkov@nginx.com check_close(sock, 1002) 9031625Smax.romanov@nginx.com 9042491Szelenkov@nginx.com # 5_13 9052491Szelenkov@nginx.com 9062491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 9071625Smax.romanov@nginx.com 9082491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'non-continuation payload', fin=False) 9092491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True) 9102491Szelenkov@nginx.com check_close(sock, 1002) 9111625Smax.romanov@nginx.com 9122491Szelenkov@nginx.com # 5_14 9131625Smax.romanov@nginx.com 9142491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 9151625Smax.romanov@nginx.com 9162491Szelenkov@nginx.com ws.frame_write( 9172491Szelenkov@nginx.com sock, 9182491Szelenkov@nginx.com ws.OP_CONT, 9192491Szelenkov@nginx.com 'non-continuation payload', 9202491Szelenkov@nginx.com fin=False, 9212491Szelenkov@nginx.com chopsize=1, 9222491Szelenkov@nginx.com ) 9232491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1) 9242491Szelenkov@nginx.com check_close(sock, 1002) 9251625Smax.romanov@nginx.com 9262491Szelenkov@nginx.com # 5_15 9271625Smax.romanov@nginx.com 9282491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 9291625Smax.romanov@nginx.com 9302491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 9312491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True) 9322491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=False) 9332491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment4', fin=True) 9341625Smax.romanov@nginx.com 9352491Szelenkov@nginx.com frame = ws.frame_read(sock) 9361625Smax.romanov@nginx.com 9372491Szelenkov@nginx.com if frame['opcode'] == ws.OP_TEXT: 9382491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2') 9392491Szelenkov@nginx.com frame = None 9402491Szelenkov@nginx.com 9412491Szelenkov@nginx.com check_close(sock, 1002, frame=frame) 9421625Smax.romanov@nginx.com 9432491Szelenkov@nginx.com # 5_16 9442491Szelenkov@nginx.com 9452491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 9461625Smax.romanov@nginx.com 9472491Szelenkov@nginx.com for _ in range(0, 2): 9482491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment1', fin=False) 9492491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment2', fin=False) 9502491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=True) 9512491Szelenkov@nginx.com check_close(sock, 1002) 9521625Smax.romanov@nginx.com 9532491Szelenkov@nginx.com # 5_17 9541625Smax.romanov@nginx.com 9552491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 9561625Smax.romanov@nginx.com 9572491Szelenkov@nginx.com for _ in range(0, 2): 9582491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment1', fin=True) 9592491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment2', fin=False) 9602491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=True) 9612491Szelenkov@nginx.com check_close(sock, 1002) 9621625Smax.romanov@nginx.com 9632491Szelenkov@nginx.com # 5_18 9642491Szelenkov@nginx.com 9652491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 9661625Smax.romanov@nginx.com 9672491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 9682491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment2') 9692491Szelenkov@nginx.com check_close(sock, 1002) 9702491Szelenkov@nginx.com 9712491Szelenkov@nginx.com # 5_19 9721625Smax.romanov@nginx.com 9732491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 9741625Smax.romanov@nginx.com 9752491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 9762491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=False) 9772491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, 'pongme 1!') 9781625Smax.romanov@nginx.com 9792491Szelenkov@nginx.com time.sleep(1) 9802491Szelenkov@nginx.com 9812491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=False) 9822491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment4', fin=False) 9832491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, 'pongme 2!') 9842491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment5') 9852491Szelenkov@nginx.com 9862491Szelenkov@nginx.com frame = ws.frame_read(sock) 9872491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, 'pongme 1!') 9881625Smax.romanov@nginx.com 9892491Szelenkov@nginx.com frame = ws.frame_read(sock) 9902491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, 'pongme 2!') 9911625Smax.romanov@nginx.com 9922491Szelenkov@nginx.com check_frame( 9932491Szelenkov@nginx.com ws.frame_read(sock), 9942491Szelenkov@nginx.com True, 9952491Szelenkov@nginx.com ws.OP_TEXT, 9962491Szelenkov@nginx.com 'fragment1fragment2fragment3fragment4fragment5', 9972491Szelenkov@nginx.com ) 9981625Smax.romanov@nginx.com 9992491Szelenkov@nginx.com # 5_20 10001625Smax.romanov@nginx.com 10012491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 10022491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=False) 10032491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, 'pongme 1!') 10041625Smax.romanov@nginx.com 10052491Szelenkov@nginx.com frame = ws.frame_read(sock) 10062491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, 'pongme 1!') 10072491Szelenkov@nginx.com 10082491Szelenkov@nginx.com time.sleep(1) 10091625Smax.romanov@nginx.com 10102491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=False) 10112491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment4', fin=False) 10122491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, 'pongme 2!') 10131625Smax.romanov@nginx.com 10142491Szelenkov@nginx.com frame = ws.frame_read(sock) 10152491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PONG, 'pongme 2!') 10161625Smax.romanov@nginx.com 10172491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', '5_20' 10182491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment5') 10191625Smax.romanov@nginx.com 10202491Szelenkov@nginx.com check_frame( 10212491Szelenkov@nginx.com ws.frame_read(sock), 10222491Szelenkov@nginx.com True, 10232491Szelenkov@nginx.com ws.OP_TEXT, 10242491Szelenkov@nginx.com 'fragment1fragment2fragment3fragment4fragment5', 10252491Szelenkov@nginx.com ) 10261625Smax.romanov@nginx.com 10272491Szelenkov@nginx.com close_connection(sock) 10282491Szelenkov@nginx.com 10291625Smax.romanov@nginx.com 10302491Szelenkov@nginx.comdef test_asgi_websockets_6_1_1__6_4_4(): 10312491Szelenkov@nginx.com client.load('websockets/mirror') 10321625Smax.romanov@nginx.com 10332491Szelenkov@nginx.com # 6_1_1 10342491Szelenkov@nginx.com 10352491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 10361625Smax.romanov@nginx.com 10372491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, '') 10382491Szelenkov@nginx.com frame = ws.frame_read(sock) 10392491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, '') 10401625Smax.romanov@nginx.com 10412491Szelenkov@nginx.com # 6_1_2 10421625Smax.romanov@nginx.com 10432491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, '', fin=False) 10442491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, '', fin=False) 10452491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, '') 10461625Smax.romanov@nginx.com 10472491Szelenkov@nginx.com frame = ws.frame_read(sock) 10482491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, '') 10491625Smax.romanov@nginx.com 10502491Szelenkov@nginx.com # 6_1_3 10512491Szelenkov@nginx.com 10522491Szelenkov@nginx.com payload = 'middle frame payload' 10531625Smax.romanov@nginx.com 10542491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, '', fin=False) 10552491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, payload, fin=False) 10562491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, '') 10571625Smax.romanov@nginx.com 10582491Szelenkov@nginx.com frame = ws.frame_read(sock) 10592491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 10601625Smax.romanov@nginx.com 10612491Szelenkov@nginx.com # 6_2_1 10622491Szelenkov@nginx.com 10632491Szelenkov@nginx.com payload = 'Hello-µ@ßöäüàá-UTF-8!!' 10642491Szelenkov@nginx.com 10652491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 10661625Smax.romanov@nginx.com 10672491Szelenkov@nginx.com frame = ws.frame_read(sock) 10682491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 10692491Szelenkov@nginx.com 10702491Szelenkov@nginx.com # 6_2_2 10711625Smax.romanov@nginx.com 10722491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload[:12], fin=False) 10732491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, payload[12:]) 10741625Smax.romanov@nginx.com 10752491Szelenkov@nginx.com frame = ws.frame_read(sock) 10762491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 10771625Smax.romanov@nginx.com 10782491Szelenkov@nginx.com # 6_2_3 10792491Szelenkov@nginx.com 10802491Szelenkov@nginx.com ws.message(sock, ws.OP_TEXT, payload, fragmention_size=1) 10811625Smax.romanov@nginx.com 10822491Szelenkov@nginx.com frame = ws.frame_read(sock) 10832491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 10841625Smax.romanov@nginx.com 10852491Szelenkov@nginx.com # 6_2_4 10861625Smax.romanov@nginx.com 10872491Szelenkov@nginx.com payload = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5' 10882491Szelenkov@nginx.com 10892491Szelenkov@nginx.com ws.message(sock, ws.OP_TEXT, payload, fragmention_size=1) 10901625Smax.romanov@nginx.com 10912491Szelenkov@nginx.com frame = ws.frame_read(sock) 10922491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 10931625Smax.romanov@nginx.com 10942491Szelenkov@nginx.com close_connection(sock) 10951625Smax.romanov@nginx.com 10961625Smax.romanov@nginx.com 10972491Szelenkov@nginx.com# Unit does not support UTF-8 validation 10982491Szelenkov@nginx.com# 10992491Szelenkov@nginx.com# # 6_3_1 FAIL 11002491Szelenkov@nginx.com# 11012491Szelenkov@nginx.com# payload_1 = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5' 11022491Szelenkov@nginx.com# payload_2 = '\xed\xa0\x80' 11032491Szelenkov@nginx.com# payload_3 = '\x65\x64\x69\x74\x65\x64' 11042491Szelenkov@nginx.com# 11052491Szelenkov@nginx.com# payload = payload_1 + payload_2 + payload_3 11062491Szelenkov@nginx.com# 11072491Szelenkov@nginx.com# ws.message(sock, ws.OP_TEXT, payload) 11082491Szelenkov@nginx.com# check_close(sock, 1007) 11092491Szelenkov@nginx.com# 11102491Szelenkov@nginx.com# # 6_3_2 FAIL 11112491Szelenkov@nginx.com# 11122491Szelenkov@nginx.com# _, sock, _ = ws.upgrade() 11132491Szelenkov@nginx.com# 11142491Szelenkov@nginx.com# ws.message(sock, ws.OP_TEXT, payload, fragmention_size=1) 11152491Szelenkov@nginx.com# check_close(sock, 1007) 11162491Szelenkov@nginx.com# 11172491Szelenkov@nginx.com# # 6_4_1 ... 6_4_4 FAIL 11182491Szelenkov@nginx.com 11192491Szelenkov@nginx.com 11202491Szelenkov@nginx.comdef test_asgi_websockets_7_1_1__7_5_1(): 11212491Szelenkov@nginx.com client.load('websockets/mirror') 11222491Szelenkov@nginx.com 11232491Szelenkov@nginx.com # 7_1_1 11242491Szelenkov@nginx.com 11252491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 11262491Szelenkov@nginx.com 11272491Szelenkov@nginx.com payload = "Hello World!" 11282491Szelenkov@nginx.com 11292491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 11302491Szelenkov@nginx.com 11312491Szelenkov@nginx.com frame = ws.frame_read(sock) 11322491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 11332491Szelenkov@nginx.com 11342491Szelenkov@nginx.com close_connection(sock) 11352491Szelenkov@nginx.com 11362491Szelenkov@nginx.com # 7_1_2 11372491Szelenkov@nginx.com 11382491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 11391625Smax.romanov@nginx.com 11402491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close()) 11412491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close()) 11421625Smax.romanov@nginx.com 11432491Szelenkov@nginx.com check_close(sock) 11442491Szelenkov@nginx.com 11452491Szelenkov@nginx.com # 7_1_3 11462491Szelenkov@nginx.com 11472491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 11481625Smax.romanov@nginx.com 11492491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close()) 11502491Szelenkov@nginx.com check_close(sock, no_close=True) 11512491Szelenkov@nginx.com 11522491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 11532491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 11541625Smax.romanov@nginx.com 11552491Szelenkov@nginx.com sock.close() 11562491Szelenkov@nginx.com 11572491Szelenkov@nginx.com # 7_1_4 11582491Szelenkov@nginx.com 11592491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 11601625Smax.romanov@nginx.com 11612491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close()) 11622491Szelenkov@nginx.com check_close(sock, no_close=True) 11631625Smax.romanov@nginx.com 11642491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 11652491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 11662491Szelenkov@nginx.com 11672491Szelenkov@nginx.com sock.close() 11682491Szelenkov@nginx.com 11692491Szelenkov@nginx.com # 7_1_5 11701625Smax.romanov@nginx.com 11712491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 11722491Szelenkov@nginx.com 11732491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False) 11742491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close()) 11752491Szelenkov@nginx.com check_close(sock, no_close=True) 11761625Smax.romanov@nginx.com 11772491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CONT, 'fragment2') 11782491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 11792491Szelenkov@nginx.com 11802491Szelenkov@nginx.com sock.close() 11812491Szelenkov@nginx.com 11822491Szelenkov@nginx.com # 7_1_6 11831625Smax.romanov@nginx.com 11842491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 11851625Smax.romanov@nginx.com 11862491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, 'BAsd7&jh23' * 26 * 2**10) 11872491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, payload) 11882491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close()) 11892491Szelenkov@nginx.com 11902491Szelenkov@nginx.com client.recvall(sock, read_timeout=1) 11912491Szelenkov@nginx.com 11922491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_PING, '') 11932491Szelenkov@nginx.com assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc' 11941625Smax.romanov@nginx.com 11952491Szelenkov@nginx.com sock.close() 11962491Szelenkov@nginx.com 11972491Szelenkov@nginx.com # 7_3_1 11981625Smax.romanov@nginx.com 11992491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 12001625Smax.romanov@nginx.com 12012491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, '') 12022491Szelenkov@nginx.com check_close(sock) 12032491Szelenkov@nginx.com 12042491Szelenkov@nginx.com # 7_3_2 12051625Smax.romanov@nginx.com 12062491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 12072491Szelenkov@nginx.com 12082491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, 'a') 12092491Szelenkov@nginx.com check_close(sock, 1002) 12101625Smax.romanov@nginx.com 12112491Szelenkov@nginx.com # 7_3_3 12122491Szelenkov@nginx.com 12132491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 12142491Szelenkov@nginx.com 12152491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close()) 12162491Szelenkov@nginx.com check_close(sock) 12171625Smax.romanov@nginx.com 12182491Szelenkov@nginx.com # 7_3_4 12192491Szelenkov@nginx.com 12202491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 12212491Szelenkov@nginx.com 12222491Szelenkov@nginx.com payload = ws.serialize_close(reason='Hello World!') 12231625Smax.romanov@nginx.com 12242491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, payload) 12252491Szelenkov@nginx.com check_close(sock) 12261625Smax.romanov@nginx.com 12272491Szelenkov@nginx.com # 7_3_5 12282491Szelenkov@nginx.com 12292491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 12301625Smax.romanov@nginx.com 12312491Szelenkov@nginx.com payload = ws.serialize_close(reason='*' * 123) 12322491Szelenkov@nginx.com 12332491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, payload) 12342491Szelenkov@nginx.com check_close(sock) 12352491Szelenkov@nginx.com 12362491Szelenkov@nginx.com # 7_3_6 12372491Szelenkov@nginx.com 12382491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 12392491Szelenkov@nginx.com 12402491Szelenkov@nginx.com payload = ws.serialize_close(reason='*' * 124) 12412491Szelenkov@nginx.com 12422491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, payload) 12432491Szelenkov@nginx.com check_close(sock, 1002) 12442491Szelenkov@nginx.com 12451625Smax.romanov@nginx.com 12462491Szelenkov@nginx.com# # 7_5_1 FAIL Unit does not support UTF-8 validation 12472491Szelenkov@nginx.com# 12482491Szelenkov@nginx.com# _, sock, _ = ws.upgrade() 12492491Szelenkov@nginx.com# 12502491Szelenkov@nginx.com# payload = ws.serialize_close(reason = '\xce\xba\xe1\xbd\xb9\xcf' \ 12512491Szelenkov@nginx.com# '\x83\xce\xbc\xce\xb5\xed\xa0\x80\x65\x64\x69\x74\x65\x64') 12522491Szelenkov@nginx.com# 12532491Szelenkov@nginx.com# ws.frame_write(sock, ws.OP_CLOSE, payload) 12542491Szelenkov@nginx.com# check_close(sock, 1007) 12551625Smax.romanov@nginx.com 12562491Szelenkov@nginx.com 12572491Szelenkov@nginx.comdef test_asgi_websockets_7_7_X__7_9_X(): 12582491Szelenkov@nginx.com client.load('websockets/mirror') 12591625Smax.romanov@nginx.com 12602491Szelenkov@nginx.com valid_codes = [ 12612491Szelenkov@nginx.com 1000, 12622491Szelenkov@nginx.com 1001, 12632491Szelenkov@nginx.com 1002, 12642491Szelenkov@nginx.com 1003, 12652491Szelenkov@nginx.com 1007, 12662491Szelenkov@nginx.com 1008, 12672491Szelenkov@nginx.com 1009, 12682491Szelenkov@nginx.com 1010, 12692491Szelenkov@nginx.com 1011, 12702491Szelenkov@nginx.com 3000, 12712491Szelenkov@nginx.com 3999, 12722491Szelenkov@nginx.com 4000, 12732491Szelenkov@nginx.com 4999, 12742491Szelenkov@nginx.com ] 12751625Smax.romanov@nginx.com 12762491Szelenkov@nginx.com invalid_codes = [0, 999, 1004, 1005, 1006, 1016, 1100, 2000, 2999] 12772491Szelenkov@nginx.com 12782491Szelenkov@nginx.com for code in valid_codes: 12792491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 12802491Szelenkov@nginx.com 12812491Szelenkov@nginx.com payload = ws.serialize_close(code=code) 12822491Szelenkov@nginx.com 12832491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, payload) 12842491Szelenkov@nginx.com check_close(sock) 12851625Smax.romanov@nginx.com 12862491Szelenkov@nginx.com for code in invalid_codes: 12872491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 12882491Szelenkov@nginx.com 12892491Szelenkov@nginx.com payload = ws.serialize_close(code=code) 12901625Smax.romanov@nginx.com 12912491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, payload) 12922491Szelenkov@nginx.com check_close(sock, 1002) 12932491Szelenkov@nginx.com 12942491Szelenkov@nginx.com 12952491Szelenkov@nginx.comdef test_asgi_websockets_7_13_1__7_13_2(): 12962491Szelenkov@nginx.com client.load('websockets/mirror') 12971625Smax.romanov@nginx.com 12982491Szelenkov@nginx.com # 7_13_1 12992491Szelenkov@nginx.com 13002491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 13012491Szelenkov@nginx.com 13022491Szelenkov@nginx.com payload = ws.serialize_close(code=5000) 13032491Szelenkov@nginx.com 13042491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, payload) 13052491Szelenkov@nginx.com check_close(sock, 1002) 13062491Szelenkov@nginx.com 13072491Szelenkov@nginx.com # 7_13_2 13081625Smax.romanov@nginx.com 13092491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 13102491Szelenkov@nginx.com 13112491Szelenkov@nginx.com payload = struct.pack('!I', 65536) + ''.encode('utf-8') 13122491Szelenkov@nginx.com 13132491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_CLOSE, payload) 13142491Szelenkov@nginx.com check_close(sock, 1002) 13152491Szelenkov@nginx.com 13162491Szelenkov@nginx.com 13172491Szelenkov@nginx.comdef test_asgi_websockets_9_1_1__9_6_6(is_unsafe, system): 13182491Szelenkov@nginx.com if not is_unsafe: 13192491Szelenkov@nginx.com pytest.skip('unsafe, long run') 13202491Szelenkov@nginx.com 13212491Szelenkov@nginx.com client.load('websockets/mirror') 13221625Smax.romanov@nginx.com 13232491Szelenkov@nginx.com assert 'success' in client.conf( 13242491Szelenkov@nginx.com { 13252491Szelenkov@nginx.com 'http': { 13262491Szelenkov@nginx.com 'websocket': { 13272491Szelenkov@nginx.com 'max_frame_size': 33554432, 13282491Szelenkov@nginx.com 'keepalive_interval': 0, 13292491Szelenkov@nginx.com } 13302491Szelenkov@nginx.com } 13312491Szelenkov@nginx.com }, 13322491Szelenkov@nginx.com 'settings', 13332491Szelenkov@nginx.com ), 'increase max_frame_size and keepalive_interval' 13342491Szelenkov@nginx.com 13352491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 13362491Szelenkov@nginx.com 13372491Szelenkov@nginx.com op_text = ws.OP_TEXT 13382491Szelenkov@nginx.com op_binary = ws.OP_BINARY 13391625Smax.romanov@nginx.com 13402491Szelenkov@nginx.com def check_payload(opcode, length, chopsize=None): 13412491Szelenkov@nginx.com if opcode == ws.OP_TEXT: 13422491Szelenkov@nginx.com payload = '*' * length 13432491Szelenkov@nginx.com else: 13442491Szelenkov@nginx.com payload = b'*' * length 13452491Szelenkov@nginx.com 13462491Szelenkov@nginx.com ws.frame_write(sock, opcode, payload, chopsize=chopsize) 13472491Szelenkov@nginx.com frame = ws.frame_read(sock, read_timeout=5) 13482491Szelenkov@nginx.com check_frame(frame, True, opcode, payload) 13491625Smax.romanov@nginx.com 13502491Szelenkov@nginx.com def check_message(opcode, f_size): 13512491Szelenkov@nginx.com if opcode == ws.OP_TEXT: 13522491Szelenkov@nginx.com payload = '*' * 4 * 2**20 13532491Szelenkov@nginx.com else: 13542491Szelenkov@nginx.com payload = b'*' * 4 * 2**20 13551625Smax.romanov@nginx.com 13562491Szelenkov@nginx.com ws.message(sock, opcode, payload, fragmention_size=f_size) 13572491Szelenkov@nginx.com frame = ws.frame_read(sock, read_timeout=5) 13582491Szelenkov@nginx.com check_frame(frame, True, opcode, payload) 13592491Szelenkov@nginx.com 13602491Szelenkov@nginx.com check_payload(op_text, 64 * 2**10) # 9_1_1 13612491Szelenkov@nginx.com check_payload(op_text, 256 * 2**10) # 9_1_2 13622491Szelenkov@nginx.com check_payload(op_text, 2**20) # 9_1_3 13632491Szelenkov@nginx.com check_payload(op_text, 4 * 2**20) # 9_1_4 13642491Szelenkov@nginx.com check_payload(op_text, 8 * 2**20) # 9_1_5 13652491Szelenkov@nginx.com check_payload(op_text, 16 * 2**20) # 9_1_6 13661625Smax.romanov@nginx.com 13672491Szelenkov@nginx.com check_payload(op_binary, 64 * 2**10) # 9_2_1 13682491Szelenkov@nginx.com check_payload(op_binary, 256 * 2**10) # 9_2_2 13692491Szelenkov@nginx.com check_payload(op_binary, 2**20) # 9_2_3 13702491Szelenkov@nginx.com check_payload(op_binary, 4 * 2**20) # 9_2_4 13712491Szelenkov@nginx.com check_payload(op_binary, 8 * 2**20) # 9_2_5 13722491Szelenkov@nginx.com check_payload(op_binary, 16 * 2**20) # 9_2_6 13731625Smax.romanov@nginx.com 13742491Szelenkov@nginx.com if system not in ['Darwin', 'FreeBSD']: 13752491Szelenkov@nginx.com check_message(op_text, 64) # 9_3_1 13762491Szelenkov@nginx.com check_message(op_text, 256) # 9_3_2 13772491Szelenkov@nginx.com check_message(op_text, 2**10) # 9_3_3 13782491Szelenkov@nginx.com check_message(op_text, 4 * 2**10) # 9_3_4 13792491Szelenkov@nginx.com check_message(op_text, 16 * 2**10) # 9_3_5 13802491Szelenkov@nginx.com check_message(op_text, 64 * 2**10) # 9_3_6 13812491Szelenkov@nginx.com check_message(op_text, 256 * 2**10) # 9_3_7 13822491Szelenkov@nginx.com check_message(op_text, 2**20) # 9_3_8 13832491Szelenkov@nginx.com check_message(op_text, 4 * 2**20) # 9_3_9 13841625Smax.romanov@nginx.com 13852491Szelenkov@nginx.com check_message(op_binary, 64) # 9_4_1 13862491Szelenkov@nginx.com check_message(op_binary, 256) # 9_4_2 13872491Szelenkov@nginx.com check_message(op_binary, 2**10) # 9_4_3 13882491Szelenkov@nginx.com check_message(op_binary, 4 * 2**10) # 9_4_4 13892491Szelenkov@nginx.com check_message(op_binary, 16 * 2**10) # 9_4_5 13902491Szelenkov@nginx.com check_message(op_binary, 64 * 2**10) # 9_4_6 13912491Szelenkov@nginx.com check_message(op_binary, 256 * 2**10) # 9_4_7 13922491Szelenkov@nginx.com check_message(op_binary, 2**20) # 9_4_8 13932491Szelenkov@nginx.com check_message(op_binary, 4 * 2**20) # 9_4_9 13941625Smax.romanov@nginx.com 13952491Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=64) # 9_5_1 13962491Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=128) # 9_5_2 13972491Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=256) # 9_5_3 13982491Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=512) # 9_5_4 13992491Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=1024) # 9_5_5 14002491Szelenkov@nginx.com check_payload(op_text, 2**20, chopsize=2048) # 9_5_6 14011625Smax.romanov@nginx.com 14022491Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=64) # 9_6_1 14032491Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=128) # 9_6_2 14042491Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=256) # 9_6_3 14052491Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=512) # 9_6_4 14062491Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=1024) # 9_6_5 14072491Szelenkov@nginx.com check_payload(op_binary, 2**20, chopsize=2048) # 9_6_6 14081625Smax.romanov@nginx.com 14092491Szelenkov@nginx.com close_connection(sock) 14102491Szelenkov@nginx.com 14111625Smax.romanov@nginx.com 14122491Szelenkov@nginx.comdef test_asgi_websockets_10_1_1(): 14132491Szelenkov@nginx.com client.load('websockets/mirror') 14141625Smax.romanov@nginx.com 14152491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 14162491Szelenkov@nginx.com 14172491Szelenkov@nginx.com payload = '*' * 65536 14181625Smax.romanov@nginx.com 14192491Szelenkov@nginx.com ws.message(sock, ws.OP_TEXT, payload, fragmention_size=1300) 14202491Szelenkov@nginx.com 14212491Szelenkov@nginx.com frame = ws.frame_read(sock) 14222491Szelenkov@nginx.com check_frame(frame, True, ws.OP_TEXT, payload) 14232491Szelenkov@nginx.com 14242491Szelenkov@nginx.com close_connection(sock) 14251625Smax.romanov@nginx.com 14262491Szelenkov@nginx.com 14272491Szelenkov@nginx.com# settings 14282491Szelenkov@nginx.com 14291625Smax.romanov@nginx.com 14302491Szelenkov@nginx.comdef test_asgi_websockets_max_frame_size(): 14312491Szelenkov@nginx.com client.load('websockets/mirror') 14322491Szelenkov@nginx.com 14332491Szelenkov@nginx.com assert 'success' in client.conf( 14342491Szelenkov@nginx.com {'http': {'websocket': {'max_frame_size': 100}}}, 'settings' 14352491Szelenkov@nginx.com ), 'configure max_frame_size' 14361625Smax.romanov@nginx.com 14372491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 14382491Szelenkov@nginx.com 14392491Szelenkov@nginx.com payload = '*' * 94 14402491Szelenkov@nginx.com opcode = ws.OP_TEXT 14411625Smax.romanov@nginx.com 14422491Szelenkov@nginx.com ws.frame_write(sock, opcode, payload) # frame length is 100 14432491Szelenkov@nginx.com 14442491Szelenkov@nginx.com frame = ws.frame_read(sock) 14452491Szelenkov@nginx.com check_frame(frame, True, opcode, payload) 14461625Smax.romanov@nginx.com 14472491Szelenkov@nginx.com payload = '*' * 95 14481625Smax.romanov@nginx.com 14492491Szelenkov@nginx.com ws.frame_write(sock, opcode, payload) # frame length is 101 14502491Szelenkov@nginx.com check_close(sock, 1009) # 1009 - CLOSE_TOO_LARGE 14512491Szelenkov@nginx.com 14521625Smax.romanov@nginx.com 14532491Szelenkov@nginx.comdef test_asgi_websockets_read_timeout(): 14542491Szelenkov@nginx.com client.load('websockets/mirror') 14551625Smax.romanov@nginx.com 14562491Szelenkov@nginx.com assert 'success' in client.conf( 14572491Szelenkov@nginx.com {'http': {'websocket': {'read_timeout': 5}}}, 'settings' 14582491Szelenkov@nginx.com ), 'configure read_timeout' 14591625Smax.romanov@nginx.com 14602491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 14612491Szelenkov@nginx.com 14622491Szelenkov@nginx.com frame = ws.frame_to_send(ws.OP_TEXT, 'blah') 14632491Szelenkov@nginx.com sock.sendall(frame[:2]) 14641625Smax.romanov@nginx.com 14652491Szelenkov@nginx.com time.sleep(2) 14662491Szelenkov@nginx.com 14672491Szelenkov@nginx.com check_close(sock, 1001) # 1001 - CLOSE_GOING_AWAY 14682491Szelenkov@nginx.com 14691625Smax.romanov@nginx.com 14702491Szelenkov@nginx.comdef test_asgi_websockets_keepalive_interval(): 14712491Szelenkov@nginx.com client.load('websockets/mirror') 14721625Smax.romanov@nginx.com 14732491Szelenkov@nginx.com assert 'success' in client.conf( 14742491Szelenkov@nginx.com {'http': {'websocket': {'keepalive_interval': 5}}}, 'settings' 14752491Szelenkov@nginx.com ), 'configure keepalive_interval' 14761625Smax.romanov@nginx.com 14772491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 14782491Szelenkov@nginx.com 14792491Szelenkov@nginx.com frame = ws.frame_to_send(ws.OP_TEXT, 'blah') 14802491Szelenkov@nginx.com sock.sendall(frame[:2]) 14811956Smax.romanov@nginx.com 14822491Szelenkov@nginx.com time.sleep(2) 14832491Szelenkov@nginx.com 14842491Szelenkov@nginx.com frame = ws.frame_read(sock) 14852491Szelenkov@nginx.com check_frame(frame, True, ws.OP_PING, '') # PING frame 14861956Smax.romanov@nginx.com 14872491Szelenkov@nginx.com sock.close() 14882491Szelenkov@nginx.com 14891956Smax.romanov@nginx.com 14902491Szelenkov@nginx.comdef test_asgi_websockets_client_locks_app(): 14912491Szelenkov@nginx.com client.load('websockets/mirror') 14921956Smax.romanov@nginx.com 14932491Szelenkov@nginx.com message = 'blah' 14941956Smax.romanov@nginx.com 14952491Szelenkov@nginx.com _, sock, _ = ws.upgrade() 14962491Szelenkov@nginx.com 14972491Szelenkov@nginx.com assert 'success' in client.conf({}), 'remove app' 14981956Smax.romanov@nginx.com 14992491Szelenkov@nginx.com ws.frame_write(sock, ws.OP_TEXT, message) 15002491Szelenkov@nginx.com 15012491Szelenkov@nginx.com frame = ws.frame_read(sock) 15021956Smax.romanov@nginx.com 15032491Szelenkov@nginx.com assert message == frame['data'].decode('utf-8'), 'client' 15041956Smax.romanov@nginx.com 15052491Szelenkov@nginx.com sock.close() 1506