xref: /unit/test/test_asgi_websockets.py (revision 2616:ab2896c980ab)
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