11477Szelenkov@nginx.comimport struct
21158Szelenkov@nginx.comimport time
31477Szelenkov@nginx.com
41635Szelenkov@nginx.comimport pytest
51158Szelenkov@nginx.comfrom unit.applications.lang.java import TestApplicationJava
61158Szelenkov@nginx.comfrom unit.applications.websockets import TestApplicationWebsocket
71730Szelenkov@nginx.comfrom unit.option import option
81158Szelenkov@nginx.com
91158Szelenkov@nginx.com
101158Szelenkov@nginx.comclass TestJavaWebsockets(TestApplicationJava):
111467Szelenkov@nginx.com    prerequisites = {'modules': {'java': 'any'}}
121158Szelenkov@nginx.com
131246Szelenkov@nginx.com    ws = TestApplicationWebsocket()
141158Szelenkov@nginx.com
151736Szelenkov@nginx.com    @pytest.fixture(autouse=True)
161736Szelenkov@nginx.com    def setup_method_fixture(self, request, skip_alert):
171596Szelenkov@nginx.com        assert 'success' in self.conf(
181596Szelenkov@nginx.com            {'http': {'websocket': {'keepalive_interval': 0}}}, 'settings'
191596Szelenkov@nginx.com        ), 'clear keepalive_interval'
201158Szelenkov@nginx.com
211596Szelenkov@nginx.com        skip_alert(r'socket close\(\d+\) failed')
221158Szelenkov@nginx.com
231158Szelenkov@nginx.com    def close_connection(self, sock):
241596Szelenkov@nginx.com        assert self.recvall(sock, read_timeout=0.1) == b'', 'empty soc'
251158Szelenkov@nginx.com
261158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
271158Szelenkov@nginx.com
281158Szelenkov@nginx.com        self.check_close(sock)
291158Szelenkov@nginx.com
30*1819Smax.romanov@nginx.com    def check_close(self, sock, code=1000, no_close=False, frame=None):
31*1819Smax.romanov@nginx.com        if frame == None:
32*1819Smax.romanov@nginx.com            frame = self.ws.frame_read(sock)
331158Szelenkov@nginx.com
341596Szelenkov@nginx.com        assert frame['fin'] == True, 'close fin'
351596Szelenkov@nginx.com        assert frame['opcode'] == self.ws.OP_CLOSE, 'close opcode'
361596Szelenkov@nginx.com        assert frame['code'] == code, 'close code'
371158Szelenkov@nginx.com
381158Szelenkov@nginx.com        if not no_close:
391158Szelenkov@nginx.com            sock.close()
401158Szelenkov@nginx.com
411158Szelenkov@nginx.com    def check_frame(self, frame, fin, opcode, payload, decode=True):
421158Szelenkov@nginx.com        if opcode == self.ws.OP_BINARY or not decode:
431158Szelenkov@nginx.com            data = frame['data']
441158Szelenkov@nginx.com        else:
451158Szelenkov@nginx.com            data = frame['data'].decode('utf-8')
461158Szelenkov@nginx.com
471596Szelenkov@nginx.com        assert frame['fin'] == fin, 'fin'
481596Szelenkov@nginx.com        assert frame['opcode'] == opcode, 'opcode'
491596Szelenkov@nginx.com        assert data == payload, 'payload'
501158Szelenkov@nginx.com
511158Szelenkov@nginx.com    def test_java_websockets_handshake(self):
521158Szelenkov@nginx.com        self.load('websockets_mirror')
531158Szelenkov@nginx.com
541158Szelenkov@nginx.com        resp, sock, key = self.ws.upgrade()
551158Szelenkov@nginx.com        sock.close()
561158Szelenkov@nginx.com
571596Szelenkov@nginx.com        assert resp['status'] == 101, 'status'
581596Szelenkov@nginx.com        assert resp['headers']['Upgrade'] == 'websocket', 'upgrade'
591596Szelenkov@nginx.com        assert resp['headers']['Connection'] == 'Upgrade', 'connection'
601596Szelenkov@nginx.com        assert resp['headers']['Sec-WebSocket-Accept'] == self.ws.accept(
611596Szelenkov@nginx.com            key
621596Szelenkov@nginx.com        ), 'key'
631158Szelenkov@nginx.com
641158Szelenkov@nginx.com    def test_java_websockets_mirror(self):
651158Szelenkov@nginx.com        self.load('websockets_mirror')
661158Szelenkov@nginx.com
671158Szelenkov@nginx.com        message = 'blah'
681158Szelenkov@nginx.com
691158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
701158Szelenkov@nginx.com
711158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, message)
721158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
731158Szelenkov@nginx.com
741596Szelenkov@nginx.com        assert message == frame['data'].decode('utf-8'), 'mirror'
751158Szelenkov@nginx.com
761158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, message)
771158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
781158Szelenkov@nginx.com
791596Szelenkov@nginx.com        assert message == frame['data'].decode('utf-8'), 'mirror 2'
801158Szelenkov@nginx.com
811158Szelenkov@nginx.com        sock.close()
821158Szelenkov@nginx.com
831158Szelenkov@nginx.com    def test_java_websockets_no_mask(self):
841158Szelenkov@nginx.com        self.load('websockets_mirror')
851158Szelenkov@nginx.com
861158Szelenkov@nginx.com        message = 'blah'
871158Szelenkov@nginx.com
881158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
891158Szelenkov@nginx.com
901158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, message, mask=False)
911158Szelenkov@nginx.com
921158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
931158Szelenkov@nginx.com
941596Szelenkov@nginx.com        assert frame['opcode'] == self.ws.OP_CLOSE, 'no mask opcode'
951596Szelenkov@nginx.com        assert frame['code'] == 1002, 'no mask close code'
961158Szelenkov@nginx.com
971158Szelenkov@nginx.com        sock.close()
981158Szelenkov@nginx.com
991158Szelenkov@nginx.com    def test_java_websockets_fragmentation(self):
1001158Szelenkov@nginx.com        self.load('websockets_mirror')
1011158Szelenkov@nginx.com
1021158Szelenkov@nginx.com        message = 'blah'
1031158Szelenkov@nginx.com
1041158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
1051158Szelenkov@nginx.com
1061158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, message, fin=False)
1071158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, ' ', fin=False)
1081158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, message)
1091158Szelenkov@nginx.com
1101158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
1111158Szelenkov@nginx.com
1121596Szelenkov@nginx.com        assert message + ' ' + message == frame['data'].decode(
1131596Szelenkov@nginx.com            'utf-8'
1141596Szelenkov@nginx.com        ), 'mirror framing'
1151158Szelenkov@nginx.com
1161158Szelenkov@nginx.com        sock.close()
1171158Szelenkov@nginx.com
1181158Szelenkov@nginx.com    def test_java_websockets_frame_fragmentation_invalid(self):
1191158Szelenkov@nginx.com        self.load('websockets_mirror')
1201158Szelenkov@nginx.com
1211158Szelenkov@nginx.com        message = 'blah'
1221158Szelenkov@nginx.com
1231158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
1241158Szelenkov@nginx.com
1251158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, message, fin=False)
1261158Szelenkov@nginx.com
1271158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
1281158Szelenkov@nginx.com
1291158Szelenkov@nginx.com        frame.pop('data')
1301596Szelenkov@nginx.com        assert frame == {
1311596Szelenkov@nginx.com            'fin': True,
1321596Szelenkov@nginx.com            'rsv1': False,
1331596Szelenkov@nginx.com            'rsv2': False,
1341596Szelenkov@nginx.com            'rsv3': False,
1351596Szelenkov@nginx.com            'opcode': self.ws.OP_CLOSE,
1361596Szelenkov@nginx.com            'mask': 0,
1371596Szelenkov@nginx.com            'code': 1002,
1381596Szelenkov@nginx.com            'reason': 'Fragmented control frame',
1391596Szelenkov@nginx.com        }, 'close frame'
1401158Szelenkov@nginx.com
1411158Szelenkov@nginx.com        sock.close()
1421158Szelenkov@nginx.com
1431158Szelenkov@nginx.com    def test_java_websockets_two_clients(self):
1441158Szelenkov@nginx.com        self.load('websockets_mirror')
1451158Szelenkov@nginx.com
1461158Szelenkov@nginx.com        message1 = 'blah1'
1471158Szelenkov@nginx.com        message2 = 'blah2'
1481158Szelenkov@nginx.com
1491158Szelenkov@nginx.com        _, sock1, _ = self.ws.upgrade()
1501158Szelenkov@nginx.com        _, sock2, _ = self.ws.upgrade()
1511158Szelenkov@nginx.com
1521158Szelenkov@nginx.com        self.ws.frame_write(sock1, self.ws.OP_TEXT, message1)
1531158Szelenkov@nginx.com        self.ws.frame_write(sock2, self.ws.OP_TEXT, message2)
1541158Szelenkov@nginx.com
1551158Szelenkov@nginx.com        frame1 = self.ws.frame_read(sock1)
1561158Szelenkov@nginx.com        frame2 = self.ws.frame_read(sock2)
1571158Szelenkov@nginx.com
1581596Szelenkov@nginx.com        assert message1 == frame1['data'].decode('utf-8'), 'client 1'
1591596Szelenkov@nginx.com        assert message2 == frame2['data'].decode('utf-8'), 'client 2'
1601158Szelenkov@nginx.com
1611158Szelenkov@nginx.com        sock1.close()
1621158Szelenkov@nginx.com        sock2.close()
1631158Szelenkov@nginx.com
1641596Szelenkov@nginx.com    @pytest.mark.skip('not yet')
1651158Szelenkov@nginx.com    def test_java_websockets_handshake_upgrade_absent(
1661158Szelenkov@nginx.com        self
1671158Szelenkov@nginx.com    ):  # FAIL https://tools.ietf.org/html/rfc6455#section-4.2.1
1681158Szelenkov@nginx.com        self.load('websockets_mirror')
1691158Szelenkov@nginx.com
1701158Szelenkov@nginx.com        resp = self.get(
1711158Szelenkov@nginx.com            headers={
1721158Szelenkov@nginx.com                'Host': 'localhost',
1731158Szelenkov@nginx.com                'Connection': 'Upgrade',
1741262Szelenkov@nginx.com                'Sec-WebSocket-Key': self.ws.key(),
1751158Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
1761158Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
1771158Szelenkov@nginx.com            },
1781158Szelenkov@nginx.com        )
1791158Szelenkov@nginx.com
1801596Szelenkov@nginx.com        assert resp['status'] == 400, 'upgrade absent'
1811158Szelenkov@nginx.com
1821158Szelenkov@nginx.com    def test_java_websockets_handshake_case_insensitive(self):
1831158Szelenkov@nginx.com        self.load('websockets_mirror')
1841158Szelenkov@nginx.com
1851262Szelenkov@nginx.com        resp, sock, _ = self.ws.upgrade(
1861158Szelenkov@nginx.com            headers={
1871158Szelenkov@nginx.com                'Host': 'localhost',
1881158Szelenkov@nginx.com                'Upgrade': 'WEBSOCKET',
1891158Szelenkov@nginx.com                'Connection': 'UPGRADE',
1901262Szelenkov@nginx.com                'Sec-WebSocket-Key': self.ws.key(),
1911158Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
1921158Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
1931262Szelenkov@nginx.com            }
1941158Szelenkov@nginx.com        )
1951262Szelenkov@nginx.com        sock.close()
1961158Szelenkov@nginx.com
1971596Szelenkov@nginx.com        assert resp['status'] == 101, 'status'
1981158Szelenkov@nginx.com
1991596Szelenkov@nginx.com    @pytest.mark.skip('not yet')
2001158Szelenkov@nginx.com    def test_java_websockets_handshake_connection_absent(self):  # FAIL
2011158Szelenkov@nginx.com        self.load('websockets_mirror')
2021158Szelenkov@nginx.com
2031158Szelenkov@nginx.com        resp = self.get(
2041158Szelenkov@nginx.com            headers={
2051158Szelenkov@nginx.com                'Host': 'localhost',
2061158Szelenkov@nginx.com                'Upgrade': 'websocket',
2071262Szelenkov@nginx.com                'Sec-WebSocket-Key': self.ws.key(),
2081158Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
2091158Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
2101158Szelenkov@nginx.com            },
2111158Szelenkov@nginx.com        )
2121158Szelenkov@nginx.com
2131596Szelenkov@nginx.com        assert resp['status'] == 400, 'status'
2141158Szelenkov@nginx.com
2151158Szelenkov@nginx.com    def test_java_websockets_handshake_version_absent(self):
2161158Szelenkov@nginx.com        self.load('websockets_mirror')
2171158Szelenkov@nginx.com
2181158Szelenkov@nginx.com        resp = self.get(
2191158Szelenkov@nginx.com            headers={
2201158Szelenkov@nginx.com                'Host': 'localhost',
2211158Szelenkov@nginx.com                'Upgrade': 'websocket',
2221158Szelenkov@nginx.com                'Connection': 'Upgrade',
2231262Szelenkov@nginx.com                'Sec-WebSocket-Key': self.ws.key(),
2241158Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
2251158Szelenkov@nginx.com            },
2261158Szelenkov@nginx.com        )
2271158Szelenkov@nginx.com
2281596Szelenkov@nginx.com        assert resp['status'] == 426, 'status'
2291158Szelenkov@nginx.com
2301596Szelenkov@nginx.com    @pytest.mark.skip('not yet')
2311158Szelenkov@nginx.com    def test_java_websockets_handshake_key_invalid(self):
2321158Szelenkov@nginx.com        self.load('websockets_mirror')
2331158Szelenkov@nginx.com
2341158Szelenkov@nginx.com        resp = self.get(
2351158Szelenkov@nginx.com            headers={
2361158Szelenkov@nginx.com                'Host': 'localhost',
2371158Szelenkov@nginx.com                'Upgrade': 'websocket',
2381158Szelenkov@nginx.com                'Connection': 'Upgrade',
2391158Szelenkov@nginx.com                'Sec-WebSocket-Key': '!',
2401158Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
2411158Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
2421158Szelenkov@nginx.com            },
2431158Szelenkov@nginx.com        )
2441158Szelenkov@nginx.com
2451596Szelenkov@nginx.com        assert resp['status'] == 400, 'key length'
2461158Szelenkov@nginx.com
2471158Szelenkov@nginx.com        key = self.ws.key()
2481158Szelenkov@nginx.com        resp = self.get(
2491158Szelenkov@nginx.com            headers={
2501158Szelenkov@nginx.com                'Host': 'localhost',
2511158Szelenkov@nginx.com                'Upgrade': 'websocket',
2521158Szelenkov@nginx.com                'Connection': 'Upgrade',
2531158Szelenkov@nginx.com                'Sec-WebSocket-Key': [key, key],
2541158Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
2551158Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
2561158Szelenkov@nginx.com            },
2571158Szelenkov@nginx.com        )
2581158Szelenkov@nginx.com
2591596Szelenkov@nginx.com        assert resp['status'] == 400, 'key double'  # FAIL https://tools.ietf.org/html/rfc6455#section-11.3.1
2601158Szelenkov@nginx.com
2611158Szelenkov@nginx.com    def test_java_websockets_handshake_method_invalid(self):
2621158Szelenkov@nginx.com        self.load('websockets_mirror')
2631158Szelenkov@nginx.com
2641158Szelenkov@nginx.com        resp = self.post(
2651158Szelenkov@nginx.com            headers={
2661158Szelenkov@nginx.com                'Host': 'localhost',
2671158Szelenkov@nginx.com                'Upgrade': 'websocket',
2681158Szelenkov@nginx.com                'Connection': 'Upgrade',
2691262Szelenkov@nginx.com                'Sec-WebSocket-Key': self.ws.key(),
2701158Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
2711158Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
2721158Szelenkov@nginx.com            },
2731158Szelenkov@nginx.com        )
2741158Szelenkov@nginx.com
2751596Szelenkov@nginx.com        assert resp['status'] == 400, 'status'
2761158Szelenkov@nginx.com
2771158Szelenkov@nginx.com    def test_java_websockets_handshake_http_10(self):
2781158Szelenkov@nginx.com        self.load('websockets_mirror')
2791158Szelenkov@nginx.com
2801158Szelenkov@nginx.com        resp = self.get(
2811158Szelenkov@nginx.com            headers={
2821158Szelenkov@nginx.com                'Host': 'localhost',
2831158Szelenkov@nginx.com                'Upgrade': 'websocket',
2841158Szelenkov@nginx.com                'Connection': 'Upgrade',
2851262Szelenkov@nginx.com                'Sec-WebSocket-Key': self.ws.key(),
2861158Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
2871158Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
2881158Szelenkov@nginx.com            },
2891158Szelenkov@nginx.com            http_10=True,
2901158Szelenkov@nginx.com        )
2911158Szelenkov@nginx.com
2921596Szelenkov@nginx.com        assert resp['status'] == 400, 'status'
2931158Szelenkov@nginx.com
2941158Szelenkov@nginx.com    def test_java_websockets_handshake_uri_invalid(self):
2951158Szelenkov@nginx.com        self.load('websockets_mirror')
2961158Szelenkov@nginx.com
2971158Szelenkov@nginx.com        resp = self.get(
2981158Szelenkov@nginx.com            headers={
2991158Szelenkov@nginx.com                'Host': 'localhost',
3001158Szelenkov@nginx.com                'Upgrade': 'websocket',
3011158Szelenkov@nginx.com                'Connection': 'Upgrade',
3021262Szelenkov@nginx.com                'Sec-WebSocket-Key': self.ws.key(),
3031158Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
3041158Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
3051158Szelenkov@nginx.com            },
3061158Szelenkov@nginx.com            url='!',
3071158Szelenkov@nginx.com        )
3081158Szelenkov@nginx.com
3091596Szelenkov@nginx.com        assert resp['status'] == 400, 'status'
3101158Szelenkov@nginx.com
3111158Szelenkov@nginx.com    def test_java_websockets_protocol_absent(self):
3121158Szelenkov@nginx.com        self.load('websockets_mirror')
3131158Szelenkov@nginx.com
3141158Szelenkov@nginx.com        key = self.ws.key()
3151262Szelenkov@nginx.com        resp, sock, _ = self.ws.upgrade(
3161158Szelenkov@nginx.com            headers={
3171158Szelenkov@nginx.com                'Host': 'localhost',
3181158Szelenkov@nginx.com                'Upgrade': 'websocket',
3191158Szelenkov@nginx.com                'Connection': 'Upgrade',
3201158Szelenkov@nginx.com                'Sec-WebSocket-Key': key,
3211158Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
3221262Szelenkov@nginx.com            }
3231158Szelenkov@nginx.com        )
3241262Szelenkov@nginx.com        sock.close()
3251158Szelenkov@nginx.com
3261596Szelenkov@nginx.com        assert resp['status'] == 101, 'status'
3271596Szelenkov@nginx.com        assert resp['headers']['Upgrade'] == 'websocket', 'upgrade'
3281596Szelenkov@nginx.com        assert resp['headers']['Connection'] == 'Upgrade', 'connection'
3291596Szelenkov@nginx.com        assert resp['headers']['Sec-WebSocket-Accept'] == self.ws.accept(
3301596Szelenkov@nginx.com            key
3311596Szelenkov@nginx.com        ), 'key'
3321158Szelenkov@nginx.com
3331158Szelenkov@nginx.com    # autobahn-testsuite
3341158Szelenkov@nginx.com    #
3351158Szelenkov@nginx.com    # Some following tests fail because of Unit does not support UTF-8
3361158Szelenkov@nginx.com    # validation for websocket frames.  It should be implemented
3371158Szelenkov@nginx.com    # by application, if necessary.
3381158Szelenkov@nginx.com
3391158Szelenkov@nginx.com    def test_java_websockets_1_1_1__1_1_8(self):
3401158Szelenkov@nginx.com        self.load('websockets_mirror')
3411158Szelenkov@nginx.com
3421158Szelenkov@nginx.com        opcode = self.ws.OP_TEXT
3431158Szelenkov@nginx.com
3441158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
3451158Szelenkov@nginx.com
3461158Szelenkov@nginx.com        def check_length(length, chopsize=None):
3471158Szelenkov@nginx.com            payload = '*' * length
3481158Szelenkov@nginx.com
3491158Szelenkov@nginx.com            self.ws.frame_write(sock, opcode, payload, chopsize=chopsize)
3501158Szelenkov@nginx.com
3511158Szelenkov@nginx.com            frame = self.ws.message_read(sock)
3521158Szelenkov@nginx.com            self.check_frame(frame, True, opcode, payload)
3531158Szelenkov@nginx.com
3541158Szelenkov@nginx.com        check_length(0)                      # 1_1_1
3551158Szelenkov@nginx.com        check_length(125)                    # 1_1_2
3561158Szelenkov@nginx.com        check_length(126)                    # 1_1_3
3571158Szelenkov@nginx.com        check_length(127)                    # 1_1_4
3581158Szelenkov@nginx.com        check_length(128)                    # 1_1_5
3591158Szelenkov@nginx.com        check_length(65535)                  # 1_1_6
3601158Szelenkov@nginx.com        check_length(65536)                  # 1_1_7
3611158Szelenkov@nginx.com        check_length(65536, chopsize = 997)  # 1_1_8
3621158Szelenkov@nginx.com
3631158Szelenkov@nginx.com        self.close_connection(sock)
3641158Szelenkov@nginx.com
3651158Szelenkov@nginx.com    def test_java_websockets_1_2_1__1_2_8(self):
3661158Szelenkov@nginx.com        self.load('websockets_mirror')
3671158Szelenkov@nginx.com
3681158Szelenkov@nginx.com        opcode = self.ws.OP_BINARY
3691158Szelenkov@nginx.com
3701158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
3711158Szelenkov@nginx.com
3721158Szelenkov@nginx.com        def check_length(length, chopsize=None):
3731158Szelenkov@nginx.com            payload = b'\xfe' * length
3741158Szelenkov@nginx.com
3751158Szelenkov@nginx.com            self.ws.frame_write(sock, opcode, payload, chopsize=chopsize)
3761158Szelenkov@nginx.com
3771158Szelenkov@nginx.com            frame = self.ws.message_read(sock)
3781158Szelenkov@nginx.com            self.check_frame(frame, True, opcode, payload)
3791158Szelenkov@nginx.com
3801158Szelenkov@nginx.com        check_length(0)                      # 1_2_1
3811158Szelenkov@nginx.com        check_length(125)                    # 1_2_2
3821158Szelenkov@nginx.com        check_length(126)                    # 1_2_3
3831158Szelenkov@nginx.com        check_length(127)                    # 1_2_4
3841158Szelenkov@nginx.com        check_length(128)                    # 1_2_5
3851158Szelenkov@nginx.com        check_length(65535)                  # 1_2_6
3861158Szelenkov@nginx.com        check_length(65536)                  # 1_2_7
3871158Szelenkov@nginx.com        check_length(65536, chopsize = 997)  # 1_2_8
3881158Szelenkov@nginx.com
3891158Szelenkov@nginx.com        self.close_connection(sock)
3901158Szelenkov@nginx.com
3911158Szelenkov@nginx.com    def test_java_websockets_2_1__2_6(self):
3921158Szelenkov@nginx.com        self.load('websockets_mirror')
3931158Szelenkov@nginx.com
3941158Szelenkov@nginx.com        op_ping = self.ws.OP_PING
3951158Szelenkov@nginx.com        op_pong = self.ws.OP_PONG
3961158Szelenkov@nginx.com
3971158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
3981158Szelenkov@nginx.com
3991158Szelenkov@nginx.com        def check_ping(payload, chopsize=None, decode=True):
4001158Szelenkov@nginx.com            self.ws.frame_write(sock, op_ping, payload, chopsize=chopsize)
4011158Szelenkov@nginx.com            frame = self.ws.frame_read(sock)
4021158Szelenkov@nginx.com
4031158Szelenkov@nginx.com            self.check_frame(frame, True, op_pong, payload, decode=decode)
4041158Szelenkov@nginx.com
4051158Szelenkov@nginx.com        check_ping('')                                                 # 2_1
4061158Szelenkov@nginx.com        check_ping('Hello, world!')                                    # 2_2
4071158Szelenkov@nginx.com        check_ping(b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff', decode=False)  # 2_3
4081158Szelenkov@nginx.com        check_ping(b'\xfe' * 125, decode=False)                        # 2_4
4091158Szelenkov@nginx.com        check_ping(b'\xfe' * 125, chopsize=1, decode=False)            # 2_6
4101158Szelenkov@nginx.com
4111158Szelenkov@nginx.com        self.close_connection(sock)
4121158Szelenkov@nginx.com
4131158Szelenkov@nginx.com        # 2_5
4141158Szelenkov@nginx.com
4151158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
4161158Szelenkov@nginx.com
4171158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, b'\xfe' * 126)
4181158Szelenkov@nginx.com        self.check_close(sock, 1002)
4191158Szelenkov@nginx.com
4201158Szelenkov@nginx.com    def test_java_websockets_2_7__2_9(self):
4211158Szelenkov@nginx.com        self.load('websockets_mirror')
4221158Szelenkov@nginx.com
4231158Szelenkov@nginx.com        # 2_7
4241158Szelenkov@nginx.com
4251158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
4261158Szelenkov@nginx.com
4271158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PONG, '')
4281596Szelenkov@nginx.com        assert self.recvall(sock, read_timeout=0.1) == b'', '2_7'
4291158Szelenkov@nginx.com
4301158Szelenkov@nginx.com        # 2_8
4311158Szelenkov@nginx.com
4321158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PONG, 'unsolicited pong payload')
4331596Szelenkov@nginx.com        assert self.recvall(sock, read_timeout=0.1) == b'', '2_8'
4341158Szelenkov@nginx.com
4351158Szelenkov@nginx.com        # 2_9
4361158Szelenkov@nginx.com
4371158Szelenkov@nginx.com        payload = 'ping payload'
4381158Szelenkov@nginx.com
4391158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PONG, 'unsolicited pong payload')
4401158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, payload)
4411158Szelenkov@nginx.com
4421158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
4431158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PONG, payload)
4441158Szelenkov@nginx.com
4451158Szelenkov@nginx.com        self.close_connection(sock)
4461158Szelenkov@nginx.com
4471158Szelenkov@nginx.com    def test_java_websockets_2_10__2_11(self):
4481158Szelenkov@nginx.com        self.load('websockets_mirror')
4491158Szelenkov@nginx.com
4501158Szelenkov@nginx.com        # 2_10
4511158Szelenkov@nginx.com
4521158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
4531158Szelenkov@nginx.com
4541158Szelenkov@nginx.com        for i in range(0, 10):
4551158Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_PING, 'payload-%d' % i)
4561158Szelenkov@nginx.com
4571158Szelenkov@nginx.com        for i in range(0, 10):
4581158Szelenkov@nginx.com            frame = self.ws.frame_read(sock)
4591158Szelenkov@nginx.com            self.check_frame(frame, True, self.ws.OP_PONG, 'payload-%d' % i)
4601158Szelenkov@nginx.com
4611158Szelenkov@nginx.com        # 2_11
4621158Szelenkov@nginx.com
4631158Szelenkov@nginx.com        for i in range(0, 10):
4641158Szelenkov@nginx.com            opcode = self.ws.OP_PING
4651158Szelenkov@nginx.com            self.ws.frame_write(sock, opcode, 'payload-%d' % i, chopsize=1)
4661158Szelenkov@nginx.com
4671158Szelenkov@nginx.com        for i in range(0, 10):
4681158Szelenkov@nginx.com            frame = self.ws.frame_read(sock)
4691158Szelenkov@nginx.com            self.check_frame(frame, True, self.ws.OP_PONG, 'payload-%d' % i)
4701158Szelenkov@nginx.com
4711158Szelenkov@nginx.com        self.close_connection(sock)
4721158Szelenkov@nginx.com
4731596Szelenkov@nginx.com    @pytest.mark.skip('not yet')
4741158Szelenkov@nginx.com    def test_java_websockets_3_1__3_7(self):
4751158Szelenkov@nginx.com        self.load('websockets_mirror')
4761158Szelenkov@nginx.com
4771158Szelenkov@nginx.com        payload = 'Hello, world!'
4781158Szelenkov@nginx.com
4791158Szelenkov@nginx.com        # 3_1
4801158Szelenkov@nginx.com
4811158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
4821158Szelenkov@nginx.com
4831158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload, rsv1=True)
4841158Szelenkov@nginx.com        self.check_close(sock, 1002)
4851158Szelenkov@nginx.com
4861158Szelenkov@nginx.com        # 3_2
4871158Szelenkov@nginx.com
4881158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
4891158Szelenkov@nginx.com
4901158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
4911158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload, rsv2=True)
4921158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
4931158Szelenkov@nginx.com
4941158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
4951158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
4961158Szelenkov@nginx.com
4971158Szelenkov@nginx.com        self.check_close(sock, 1002, no_close=True)
4981158Szelenkov@nginx.com
4991596Szelenkov@nginx.com        assert self.recvall(sock, read_timeout=0.1) == b'', 'empty 3_2'
5001158Szelenkov@nginx.com        sock.close()
5011158Szelenkov@nginx.com
5021158Szelenkov@nginx.com        # 3_3
5031158Szelenkov@nginx.com
5041158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
5051158Szelenkov@nginx.com
5061158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
5071158Szelenkov@nginx.com
5081158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
5091158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
5101158Szelenkov@nginx.com
5111158Szelenkov@nginx.com        self.ws.frame_write(
5121158Szelenkov@nginx.com            sock, self.ws.OP_TEXT, payload, rsv1=True, rsv2=True
5131158Szelenkov@nginx.com        )
5141158Szelenkov@nginx.com
5151158Szelenkov@nginx.com        self.check_close(sock, 1002, no_close=True)
5161158Szelenkov@nginx.com
5171596Szelenkov@nginx.com        assert self.recvall(sock, read_timeout=0.1) == b'', 'empty 3_3'
5181158Szelenkov@nginx.com        sock.close()
5191158Szelenkov@nginx.com
5201158Szelenkov@nginx.com        # 3_4
5211158Szelenkov@nginx.com
5221158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
5231158Szelenkov@nginx.com
5241158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1)
5251158Szelenkov@nginx.com        self.ws.frame_write(
5261158Szelenkov@nginx.com            sock, self.ws.OP_TEXT, payload, rsv3=True, chopsize=1
5271158Szelenkov@nginx.com        )
5281158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
5291158Szelenkov@nginx.com
5301158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
5311158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
5321158Szelenkov@nginx.com
5331158Szelenkov@nginx.com        self.check_close(sock, 1002, no_close=True)
5341158Szelenkov@nginx.com
5351596Szelenkov@nginx.com        assert self.recvall(sock, read_timeout=0.1) == b'', 'empty 3_4'
5361158Szelenkov@nginx.com        sock.close()
5371158Szelenkov@nginx.com
5381158Szelenkov@nginx.com        # 3_5
5391158Szelenkov@nginx.com
5401158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
5411158Szelenkov@nginx.com
5421158Szelenkov@nginx.com        self.ws.frame_write(
5431158Szelenkov@nginx.com            sock,
5441158Szelenkov@nginx.com            self.ws.OP_BINARY,
5451158Szelenkov@nginx.com            b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff',
5461158Szelenkov@nginx.com            rsv1=True,
5471158Szelenkov@nginx.com            rsv3=True,
5481158Szelenkov@nginx.com        )
5491158Szelenkov@nginx.com
5501158Szelenkov@nginx.com        self.check_close(sock, 1002)
5511158Szelenkov@nginx.com
5521158Szelenkov@nginx.com        # 3_6
5531158Szelenkov@nginx.com
5541158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
5551158Szelenkov@nginx.com
5561158Szelenkov@nginx.com        self.ws.frame_write(
5571158Szelenkov@nginx.com            sock, self.ws.OP_PING, payload, rsv2=True, rsv3=True
5581158Szelenkov@nginx.com        )
5591158Szelenkov@nginx.com
5601158Szelenkov@nginx.com        self.check_close(sock, 1002)
5611158Szelenkov@nginx.com
5621158Szelenkov@nginx.com        # 3_7
5631158Szelenkov@nginx.com
5641158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
5651158Szelenkov@nginx.com
5661158Szelenkov@nginx.com        self.ws.frame_write(
5671158Szelenkov@nginx.com            sock, self.ws.OP_CLOSE, payload, rsv1=True, rsv2=True, rsv3=True
5681158Szelenkov@nginx.com        )
5691158Szelenkov@nginx.com
5701158Szelenkov@nginx.com        self.check_close(sock, 1002)
5711158Szelenkov@nginx.com
5721158Szelenkov@nginx.com    def test_java_websockets_4_1_1__4_2_5(self):
5731158Szelenkov@nginx.com        self.load('websockets_mirror')
5741158Szelenkov@nginx.com
5751158Szelenkov@nginx.com        payload = 'Hello, world!'
5761158Szelenkov@nginx.com
5771158Szelenkov@nginx.com        # 4_1_1
5781158Szelenkov@nginx.com
5791158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
5801158Szelenkov@nginx.com
5811158Szelenkov@nginx.com        self.ws.frame_write(sock, 0x03, '')
5821158Szelenkov@nginx.com        self.check_close(sock, 1002)
5831158Szelenkov@nginx.com
5841158Szelenkov@nginx.com        # 4_1_2
5851158Szelenkov@nginx.com
5861158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
5871158Szelenkov@nginx.com
5881158Szelenkov@nginx.com        self.ws.frame_write(sock, 0x04, 'reserved opcode payload')
5891158Szelenkov@nginx.com        self.check_close(sock, 1002)
5901158Szelenkov@nginx.com
5911158Szelenkov@nginx.com        # 4_1_3
5921158Szelenkov@nginx.com
5931158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
5941158Szelenkov@nginx.com
5951158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
5961158Szelenkov@nginx.com
5971158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
5981158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
5991158Szelenkov@nginx.com
6001158Szelenkov@nginx.com        self.ws.frame_write(sock, 0x05, '')
6011158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
6021158Szelenkov@nginx.com
6031158Szelenkov@nginx.com        self.check_close(sock, 1002)
6041158Szelenkov@nginx.com
6051158Szelenkov@nginx.com        # 4_1_4
6061158Szelenkov@nginx.com
6071158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
6081158Szelenkov@nginx.com
6091158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
6101158Szelenkov@nginx.com
6111158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
6121158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
6131158Szelenkov@nginx.com
6141158Szelenkov@nginx.com        self.ws.frame_write(sock, 0x06, payload)
6151158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
6161158Szelenkov@nginx.com
6171158Szelenkov@nginx.com        self.check_close(sock, 1002)
6181158Szelenkov@nginx.com
6191158Szelenkov@nginx.com        # 4_1_5
6201158Szelenkov@nginx.com
6211158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
6221158Szelenkov@nginx.com
6231158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1)
6241158Szelenkov@nginx.com
6251158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
6261158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
6271158Szelenkov@nginx.com
6281158Szelenkov@nginx.com        self.ws.frame_write(sock, 0x07, payload, chopsize=1)
6291158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
6301158Szelenkov@nginx.com
6311158Szelenkov@nginx.com        self.check_close(sock, 1002)
6321158Szelenkov@nginx.com
6331158Szelenkov@nginx.com        # 4_2_1
6341158Szelenkov@nginx.com
6351158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
6361158Szelenkov@nginx.com
6371158Szelenkov@nginx.com        self.ws.frame_write(sock, 0x0B, '')
6381158Szelenkov@nginx.com        self.check_close(sock, 1002)
6391158Szelenkov@nginx.com
6401158Szelenkov@nginx.com        # 4_2_2
6411158Szelenkov@nginx.com
6421158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
6431158Szelenkov@nginx.com
6441158Szelenkov@nginx.com        self.ws.frame_write(sock, 0x0C, 'reserved opcode payload')
6451158Szelenkov@nginx.com        self.check_close(sock, 1002)
6461158Szelenkov@nginx.com
6471158Szelenkov@nginx.com        # 4_2_3
6481158Szelenkov@nginx.com
6491158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
6501158Szelenkov@nginx.com
6511158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
6521158Szelenkov@nginx.com
6531158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
6541158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
6551158Szelenkov@nginx.com
6561158Szelenkov@nginx.com        self.ws.frame_write(sock, 0x0D, '')
6571158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
6581158Szelenkov@nginx.com
6591158Szelenkov@nginx.com        self.check_close(sock, 1002)
6601158Szelenkov@nginx.com
6611158Szelenkov@nginx.com        # 4_2_4
6621158Szelenkov@nginx.com
6631158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
6641158Szelenkov@nginx.com
6651158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
6661158Szelenkov@nginx.com
6671158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
6681158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
6691158Szelenkov@nginx.com
6701158Szelenkov@nginx.com        self.ws.frame_write(sock, 0x0E, payload)
6711158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
6721158Szelenkov@nginx.com
6731158Szelenkov@nginx.com        self.check_close(sock, 1002)
6741158Szelenkov@nginx.com
6751158Szelenkov@nginx.com        # 4_2_5
6761158Szelenkov@nginx.com
6771158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
6781158Szelenkov@nginx.com
6791158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1)
6801158Szelenkov@nginx.com
6811158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
6821158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
6831158Szelenkov@nginx.com
6841158Szelenkov@nginx.com        self.ws.frame_write(sock, 0x0F, payload, chopsize=1)
6851158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
6861158Szelenkov@nginx.com
6871158Szelenkov@nginx.com        self.check_close(sock, 1002)
6881158Szelenkov@nginx.com
6891158Szelenkov@nginx.com    def test_java_websockets_5_1__5_20(self):
6901158Szelenkov@nginx.com        self.load('websockets_mirror')
6911158Szelenkov@nginx.com
6921158Szelenkov@nginx.com        # 5_1
6931158Szelenkov@nginx.com
6941158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
6951158Szelenkov@nginx.com
6961158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, 'fragment1', fin=False)
6971158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
6981158Szelenkov@nginx.com        self.check_close(sock, 1002)
6991158Szelenkov@nginx.com
7001158Szelenkov@nginx.com        # 5_2
7011158Szelenkov@nginx.com
7021158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
7031158Szelenkov@nginx.com
7041158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PONG, 'fragment1', fin=False)
7051158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
7061158Szelenkov@nginx.com        self.check_close(sock, 1002)
7071158Szelenkov@nginx.com
7081158Szelenkov@nginx.com        # 5_3
7091158Szelenkov@nginx.com
7101158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
7111158Szelenkov@nginx.com
7121158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
7131158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
7141158Szelenkov@nginx.com
7151158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
7161158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
7171158Szelenkov@nginx.com
7181158Szelenkov@nginx.com        # 5_4
7191158Szelenkov@nginx.com
7201158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
7211596Szelenkov@nginx.com        assert self.recvall(sock, read_timeout=0.1) == b'', '5_4'
7221158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
7231158Szelenkov@nginx.com
7241158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
7251158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
7261158Szelenkov@nginx.com
7271158Szelenkov@nginx.com        # 5_5
7281158Szelenkov@nginx.com
7291158Szelenkov@nginx.com        self.ws.frame_write(
7301158Szelenkov@nginx.com            sock, self.ws.OP_TEXT, 'fragment1', fin=False, chopsize=1
7311158Szelenkov@nginx.com        )
7321158Szelenkov@nginx.com        self.ws.frame_write(
7331158Szelenkov@nginx.com            sock, self.ws.OP_CONT, 'fragment2', fin=True, chopsize=1
7341158Szelenkov@nginx.com        )
7351158Szelenkov@nginx.com
7361158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
7371158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
7381158Szelenkov@nginx.com
7391158Szelenkov@nginx.com        # 5_6
7401158Szelenkov@nginx.com
7411158Szelenkov@nginx.com        ping_payload = 'ping payload'
7421158Szelenkov@nginx.com
7431158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
7441158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, ping_payload)
7451158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
7461158Szelenkov@nginx.com
7471158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
7481158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PONG, ping_payload)
7491158Szelenkov@nginx.com
7501158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
7511158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
7521158Szelenkov@nginx.com
7531158Szelenkov@nginx.com        # 5_7
7541158Szelenkov@nginx.com
7551158Szelenkov@nginx.com        ping_payload = 'ping payload'
7561158Szelenkov@nginx.com
7571158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
7581596Szelenkov@nginx.com        assert self.recvall(sock, read_timeout=0.1) == b'', '5_7'
7591158Szelenkov@nginx.com
7601158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, ping_payload)
7611158Szelenkov@nginx.com
7621158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
7631158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PONG, ping_payload)
7641158Szelenkov@nginx.com
7651158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
7661158Szelenkov@nginx.com
7671158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
7681158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
7691158Szelenkov@nginx.com
7701158Szelenkov@nginx.com        # 5_8
7711158Szelenkov@nginx.com
7721158Szelenkov@nginx.com        ping_payload = 'ping payload'
7731158Szelenkov@nginx.com
7741158Szelenkov@nginx.com        self.ws.frame_write(
7751158Szelenkov@nginx.com            sock, self.ws.OP_TEXT, 'fragment1', fin=False, chopsize=1
7761158Szelenkov@nginx.com        )
7771158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, ping_payload, chopsize=1)
7781158Szelenkov@nginx.com        self.ws.frame_write(
7791158Szelenkov@nginx.com            sock, self.ws.OP_CONT, 'fragment2', fin=True, chopsize=1
7801158Szelenkov@nginx.com        )
7811158Szelenkov@nginx.com
7821158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
7831158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PONG, ping_payload)
7841158Szelenkov@nginx.com
7851158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
7861158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
7871158Szelenkov@nginx.com
7881158Szelenkov@nginx.com        # 5_9
7891158Szelenkov@nginx.com
7901158Szelenkov@nginx.com        self.ws.frame_write(
7911158Szelenkov@nginx.com            sock, self.ws.OP_CONT, 'non-continuation payload', fin=True
7921158Szelenkov@nginx.com        )
7931158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True)
7941158Szelenkov@nginx.com        self.check_close(sock, 1002)
7951158Szelenkov@nginx.com
7961158Szelenkov@nginx.com        # 5_10
7971158Szelenkov@nginx.com
7981158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
7991158Szelenkov@nginx.com
8001158Szelenkov@nginx.com        self.ws.frame_write(
8011158Szelenkov@nginx.com            sock, self.ws.OP_CONT, 'non-continuation payload', fin=True
8021158Szelenkov@nginx.com        )
8031158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True)
8041158Szelenkov@nginx.com        self.check_close(sock, 1002)
8051158Szelenkov@nginx.com
8061158Szelenkov@nginx.com        # 5_11
8071158Szelenkov@nginx.com
8081158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
8091158Szelenkov@nginx.com
8101158Szelenkov@nginx.com        self.ws.frame_write(
8111158Szelenkov@nginx.com            sock,
8121158Szelenkov@nginx.com            self.ws.OP_CONT,
8131158Szelenkov@nginx.com            'non-continuation payload',
8141158Szelenkov@nginx.com            fin=True,
8151158Szelenkov@nginx.com            chopsize=1,
8161158Szelenkov@nginx.com        )
8171158Szelenkov@nginx.com        self.ws.frame_write(
8181158Szelenkov@nginx.com            sock, self.ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1
8191158Szelenkov@nginx.com        )
8201158Szelenkov@nginx.com        self.check_close(sock, 1002)
8211158Szelenkov@nginx.com
8221158Szelenkov@nginx.com        # 5_12
8231158Szelenkov@nginx.com
8241158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
8251158Szelenkov@nginx.com
8261158Szelenkov@nginx.com        self.ws.frame_write(
8271158Szelenkov@nginx.com            sock, self.ws.OP_CONT, 'non-continuation payload', fin=False
8281158Szelenkov@nginx.com        )
8291158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True)
8301158Szelenkov@nginx.com        self.check_close(sock, 1002)
8311158Szelenkov@nginx.com
8321158Szelenkov@nginx.com        # 5_13
8331158Szelenkov@nginx.com
8341158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
8351158Szelenkov@nginx.com
8361158Szelenkov@nginx.com        self.ws.frame_write(
8371158Szelenkov@nginx.com            sock, self.ws.OP_CONT, 'non-continuation payload', fin=False
8381158Szelenkov@nginx.com        )
8391158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True)
8401158Szelenkov@nginx.com        self.check_close(sock, 1002)
8411158Szelenkov@nginx.com
8421158Szelenkov@nginx.com        # 5_14
8431158Szelenkov@nginx.com
8441158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
8451158Szelenkov@nginx.com
8461158Szelenkov@nginx.com        self.ws.frame_write(
8471158Szelenkov@nginx.com            sock,
8481158Szelenkov@nginx.com            self.ws.OP_CONT,
8491158Szelenkov@nginx.com            'non-continuation payload',
8501158Szelenkov@nginx.com            fin=False,
8511158Szelenkov@nginx.com            chopsize=1,
8521158Szelenkov@nginx.com        )
8531158Szelenkov@nginx.com        self.ws.frame_write(
8541158Szelenkov@nginx.com            sock, self.ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1
8551158Szelenkov@nginx.com        )
8561158Szelenkov@nginx.com        self.check_close(sock, 1002)
8571158Szelenkov@nginx.com
8581158Szelenkov@nginx.com        # 5_15
8591158Szelenkov@nginx.com
8601158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
8611158Szelenkov@nginx.com
8621158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
8631158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
8641158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False)
8651158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment4', fin=True)
866*1819Smax.romanov@nginx.com
867*1819Smax.romanov@nginx.com        frame = self.ws.frame_read(sock)
868*1819Smax.romanov@nginx.com
869*1819Smax.romanov@nginx.com        if frame['opcode'] == self.ws.OP_TEXT:
870*1819Smax.romanov@nginx.com            self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
871*1819Smax.romanov@nginx.com            frame = None
872*1819Smax.romanov@nginx.com
873*1819Smax.romanov@nginx.com        self.check_close(sock, 1002, frame=frame)
8741158Szelenkov@nginx.com
8751158Szelenkov@nginx.com        # 5_16
8761158Szelenkov@nginx.com
8771158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
8781158Szelenkov@nginx.com
8791158Szelenkov@nginx.com        for i in range(0, 2):
8801158Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment1', fin=False)
8811158Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2', fin=False)
8821158Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=True)
8831158Szelenkov@nginx.com        self.check_close(sock, 1002)
8841158Szelenkov@nginx.com
8851158Szelenkov@nginx.com        # 5_17
8861158Szelenkov@nginx.com
8871158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
8881158Szelenkov@nginx.com
8891158Szelenkov@nginx.com        for i in range(0, 2):
8901158Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment1', fin=True)
8911158Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2', fin=False)
8921158Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=True)
8931158Szelenkov@nginx.com        self.check_close(sock, 1002)
8941158Szelenkov@nginx.com
8951158Szelenkov@nginx.com        # 5_18
8961158Szelenkov@nginx.com
8971158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
8981158Szelenkov@nginx.com
8991158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
9001158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2')
9011158Szelenkov@nginx.com        self.check_close(sock, 1002)
9021158Szelenkov@nginx.com
9031158Szelenkov@nginx.com        # 5_19
9041158Szelenkov@nginx.com
9051158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
9061158Szelenkov@nginx.com
9071158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
9081158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=False)
9091158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 1!')
9101158Szelenkov@nginx.com
9111158Szelenkov@nginx.com        time.sleep(1)
9121158Szelenkov@nginx.com
9131158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False)
9141158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment4', fin=False)
9151158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 2!')
9161158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment5')
9171158Szelenkov@nginx.com
9181158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
9191158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 1!')
9201158Szelenkov@nginx.com
9211158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
9221158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 2!')
9231158Szelenkov@nginx.com
9241158Szelenkov@nginx.com        self.check_frame(
9251158Szelenkov@nginx.com            self.ws.frame_read(sock),
9261158Szelenkov@nginx.com            True,
9271158Szelenkov@nginx.com            self.ws.OP_TEXT,
9281158Szelenkov@nginx.com            'fragment1fragment2fragment3fragment4fragment5',
9291158Szelenkov@nginx.com        )
9301158Szelenkov@nginx.com
9311158Szelenkov@nginx.com        # 5_20
9321158Szelenkov@nginx.com
9331158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
9341158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=False)
9351158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 1!')
9361158Szelenkov@nginx.com
9371158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
9381158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 1!')
9391158Szelenkov@nginx.com
9401158Szelenkov@nginx.com        time.sleep(1)
9411158Szelenkov@nginx.com
9421158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False)
9431158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment4', fin=False)
9441158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 2!')
9451158Szelenkov@nginx.com
9461158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
9471158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 2!')
9481158Szelenkov@nginx.com
9491596Szelenkov@nginx.com        assert self.recvall(sock, read_timeout=0.1) == b'', '5_20'
9501158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment5')
9511158Szelenkov@nginx.com
9521158Szelenkov@nginx.com        self.check_frame(
9531158Szelenkov@nginx.com            self.ws.frame_read(sock),
9541158Szelenkov@nginx.com            True,
9551158Szelenkov@nginx.com            self.ws.OP_TEXT,
9561158Szelenkov@nginx.com            'fragment1fragment2fragment3fragment4fragment5',
9571158Szelenkov@nginx.com        )
9581158Szelenkov@nginx.com
9591158Szelenkov@nginx.com        self.close_connection(sock)
9601158Szelenkov@nginx.com
9611158Szelenkov@nginx.com    def test_java_websockets_6_1_1__6_4_4(self):
9621158Szelenkov@nginx.com        self.load('websockets_mirror')
9631158Szelenkov@nginx.com
9641158Szelenkov@nginx.com        # 6_1_1
9651158Szelenkov@nginx.com
9661158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
9671158Szelenkov@nginx.com
9681158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, '')
9691158Szelenkov@nginx.com        frame = self.ws.frame_read(sock, read_timeout=3)
9701158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, '')
9711158Szelenkov@nginx.com
9721158Szelenkov@nginx.com        # 6_1_2
9731158Szelenkov@nginx.com
9741158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, '', fin=False)
9751158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, '', fin=False)
9761158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, '')
9771158Szelenkov@nginx.com
9781158Szelenkov@nginx.com        frame = self.ws.frame_read(sock, read_timeout=3)
9791158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, '')
9801158Szelenkov@nginx.com
9811158Szelenkov@nginx.com        # 6_1_3
9821158Szelenkov@nginx.com
9831158Szelenkov@nginx.com        payload = 'middle frame payload'
9841158Szelenkov@nginx.com
9851158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, '', fin=False)
9861158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, payload, fin=False)
9871158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, '')
9881158Szelenkov@nginx.com
9891158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
9901158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
9911158Szelenkov@nginx.com
9921158Szelenkov@nginx.com        # 6_2_1
9931158Szelenkov@nginx.com
9941158Szelenkov@nginx.com        payload = 'Hello-µ@ßöäüàá-UTF-8!!'
9951158Szelenkov@nginx.com
9961158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
9971158Szelenkov@nginx.com
9981158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
9991158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
10001158Szelenkov@nginx.com
10011158Szelenkov@nginx.com        # 6_2_2
10021158Szelenkov@nginx.com
10031158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload[:12], fin=False)
10041158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, payload[12:])
10051158Szelenkov@nginx.com
10061158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
10071158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
10081158Szelenkov@nginx.com
10091158Szelenkov@nginx.com        # 6_2_3
10101158Szelenkov@nginx.com
10111158Szelenkov@nginx.com        self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1)
10121158Szelenkov@nginx.com
10131158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
10141158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
10151158Szelenkov@nginx.com
10161158Szelenkov@nginx.com        # 6_2_4
10171158Szelenkov@nginx.com
10181158Szelenkov@nginx.com        payload = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5'
10191158Szelenkov@nginx.com
10201158Szelenkov@nginx.com        self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1)
10211158Szelenkov@nginx.com
10221158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
10231158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
10241158Szelenkov@nginx.com
10251158Szelenkov@nginx.com        self.close_connection(sock)
10261158Szelenkov@nginx.com
10271158Szelenkov@nginx.com#        Unit does not support UTF-8 validation
10281158Szelenkov@nginx.com#
10291158Szelenkov@nginx.com#        # 6_3_1 FAIL
10301158Szelenkov@nginx.com#
10311158Szelenkov@nginx.com#        payload_1 = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5'
10321158Szelenkov@nginx.com#        payload_2 = '\xed\xa0\x80'
10331158Szelenkov@nginx.com#        payload_3 = '\x65\x64\x69\x74\x65\x64'
10341158Szelenkov@nginx.com#
10351158Szelenkov@nginx.com#        payload = payload_1 + payload_2 + payload_3
10361158Szelenkov@nginx.com#
10371158Szelenkov@nginx.com#        self.ws.message(sock, self.ws.OP_TEXT, payload)
10381158Szelenkov@nginx.com#        self.check_close(sock, 1007)
10391158Szelenkov@nginx.com#
10401158Szelenkov@nginx.com#        # 6_3_2 FAIL
10411158Szelenkov@nginx.com#
10421158Szelenkov@nginx.com#        _, sock, _ = self.ws.upgrade()
10431158Szelenkov@nginx.com#
10441158Szelenkov@nginx.com#        self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1)
10451158Szelenkov@nginx.com#        self.check_close(sock, 1007)
10461158Szelenkov@nginx.com#
10471158Szelenkov@nginx.com#        # 6_4_1 ... 6_4_4 FAIL
10481158Szelenkov@nginx.com
10491158Szelenkov@nginx.com    def test_java_websockets_7_1_1__7_5_1(self):
10501158Szelenkov@nginx.com        self.load('websockets_mirror')
10511158Szelenkov@nginx.com
10521158Szelenkov@nginx.com        # 7_1_1
10531158Szelenkov@nginx.com
10541158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
10551158Szelenkov@nginx.com
10561158Szelenkov@nginx.com        payload = "Hello World!"
10571158Szelenkov@nginx.com
10581158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
10591158Szelenkov@nginx.com
10601158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
10611158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
10621158Szelenkov@nginx.com
10631158Szelenkov@nginx.com        self.close_connection(sock)
10641158Szelenkov@nginx.com
10651158Szelenkov@nginx.com        # 7_1_2
10661158Szelenkov@nginx.com
10671158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
10681158Szelenkov@nginx.com
10691158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
10701158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
10711158Szelenkov@nginx.com
10721158Szelenkov@nginx.com        self.check_close(sock)
10731158Szelenkov@nginx.com
10741158Szelenkov@nginx.com        # 7_1_3
10751158Szelenkov@nginx.com
10761158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
10771158Szelenkov@nginx.com
10781158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
10791158Szelenkov@nginx.com        self.check_close(sock, no_close=True)
10801158Szelenkov@nginx.com
10811158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
10821596Szelenkov@nginx.com        assert self.recvall(sock, read_timeout=0.1) == b'', 'empty soc'
10831158Szelenkov@nginx.com
10841158Szelenkov@nginx.com        sock.close()
10851158Szelenkov@nginx.com
10861158Szelenkov@nginx.com        # 7_1_4
10871158Szelenkov@nginx.com
10881158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
10891158Szelenkov@nginx.com
10901158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
10911158Szelenkov@nginx.com        self.check_close(sock, no_close=True)
10921158Szelenkov@nginx.com
10931158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
10941596Szelenkov@nginx.com        assert self.recvall(sock, read_timeout=0.1) == b'', 'empty soc'
10951158Szelenkov@nginx.com
10961158Szelenkov@nginx.com        sock.close()
10971158Szelenkov@nginx.com
10981158Szelenkov@nginx.com        # 7_1_5
10991158Szelenkov@nginx.com
11001158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
11011158Szelenkov@nginx.com
11021158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
11031158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
11041158Szelenkov@nginx.com        self.check_close(sock, no_close=True)
11051158Szelenkov@nginx.com
11061158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2')
11071596Szelenkov@nginx.com        assert self.recvall(sock, read_timeout=0.1) == b'', 'empty soc'
11081158Szelenkov@nginx.com
11091158Szelenkov@nginx.com        sock.close()
11101158Szelenkov@nginx.com
11111158Szelenkov@nginx.com        # 7_1_6
11121158Szelenkov@nginx.com
11131158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
11141158Szelenkov@nginx.com
11151158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'BAsd7&jh23' * 26 * 2 ** 10)
11161158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
11171158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
11181158Szelenkov@nginx.com
11191158Szelenkov@nginx.com        self.recvall(sock, read_timeout=1)
11201158Szelenkov@nginx.com
11211158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
11221596Szelenkov@nginx.com        assert self.recvall(sock, read_timeout=0.1) == b'', 'empty soc'
11231158Szelenkov@nginx.com
11241158Szelenkov@nginx.com        sock.close()
11251158Szelenkov@nginx.com
11261262Szelenkov@nginx.com        # 7_3_1
11271158Szelenkov@nginx.com
11281158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
11291158Szelenkov@nginx.com
11301158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, '')
11311158Szelenkov@nginx.com        self.check_close(sock)
11321158Szelenkov@nginx.com
11331158Szelenkov@nginx.com        # 7_3_2
11341158Szelenkov@nginx.com
11351158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
11361158Szelenkov@nginx.com
11371158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, 'a')
11381158Szelenkov@nginx.com        self.check_close(sock, 1002)
11391158Szelenkov@nginx.com
11401158Szelenkov@nginx.com        # 7_3_3
11411158Szelenkov@nginx.com
11421158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
11431158Szelenkov@nginx.com
11441158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
11451158Szelenkov@nginx.com        self.check_close(sock)
11461158Szelenkov@nginx.com
11471158Szelenkov@nginx.com        # 7_3_4
11481158Szelenkov@nginx.com
11491158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
11501158Szelenkov@nginx.com
11511158Szelenkov@nginx.com        payload = self.ws.serialize_close(reason='Hello World!')
11521158Szelenkov@nginx.com
11531158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
11541158Szelenkov@nginx.com        self.check_close(sock)
11551158Szelenkov@nginx.com
11561158Szelenkov@nginx.com        # 7_3_5
11571158Szelenkov@nginx.com
11581158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
11591158Szelenkov@nginx.com
11601158Szelenkov@nginx.com        payload = self.ws.serialize_close(reason='*' * 123)
11611158Szelenkov@nginx.com
11621158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
11631158Szelenkov@nginx.com        self.check_close(sock)
11641158Szelenkov@nginx.com
11651158Szelenkov@nginx.com        # 7_3_6
11661158Szelenkov@nginx.com
11671158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
11681158Szelenkov@nginx.com
11691158Szelenkov@nginx.com        payload = self.ws.serialize_close(reason='*' * 124)
11701158Szelenkov@nginx.com
11711158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
11721158Szelenkov@nginx.com        self.check_close(sock, 1002)
11731158Szelenkov@nginx.com
11741158Szelenkov@nginx.com#        # 7_5_1 FAIL Unit does not support UTF-8 validation
11751158Szelenkov@nginx.com#
11761158Szelenkov@nginx.com#        _, sock, _ = self.ws.upgrade()
11771158Szelenkov@nginx.com#
11781158Szelenkov@nginx.com#        payload = self.ws.serialize_close(reason = '\xce\xba\xe1\xbd\xb9\xcf' \
11791158Szelenkov@nginx.com#            '\x83\xce\xbc\xce\xb5\xed\xa0\x80\x65\x64\x69\x74\x65\x64')
11801158Szelenkov@nginx.com#
11811158Szelenkov@nginx.com#        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
11821158Szelenkov@nginx.com#        self.check_close(sock, 1007)
11831158Szelenkov@nginx.com
11841158Szelenkov@nginx.com    def test_java_websockets_7_7_X__7_9_X(self):
11851158Szelenkov@nginx.com        self.load('websockets_mirror')
11861158Szelenkov@nginx.com
11871158Szelenkov@nginx.com        valid_codes = [
11881158Szelenkov@nginx.com            1000,
11891158Szelenkov@nginx.com            1001,
11901158Szelenkov@nginx.com            1002,
11911158Szelenkov@nginx.com            1003,
11921158Szelenkov@nginx.com            1007,
11931158Szelenkov@nginx.com            1008,
11941158Szelenkov@nginx.com            1009,
11951158Szelenkov@nginx.com            1010,
11961158Szelenkov@nginx.com            1011,
11971158Szelenkov@nginx.com            3000,
11981158Szelenkov@nginx.com            3999,
11991158Szelenkov@nginx.com            4000,
12001158Szelenkov@nginx.com            4999,
12011158Szelenkov@nginx.com        ]
12021158Szelenkov@nginx.com
12031158Szelenkov@nginx.com        invalid_codes = [0, 999, 1004, 1005, 1006, 1016, 1100, 2000, 2999]
12041158Szelenkov@nginx.com
12051158Szelenkov@nginx.com        for code in valid_codes:
12061158Szelenkov@nginx.com            _, sock, _ = self.ws.upgrade()
12071158Szelenkov@nginx.com
12081158Szelenkov@nginx.com            payload = self.ws.serialize_close(code=code)
12091158Szelenkov@nginx.com
12101158Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
12111158Szelenkov@nginx.com            self.check_close(sock, code=code)
12121158Szelenkov@nginx.com
12131158Szelenkov@nginx.com        for code in invalid_codes:
12141158Szelenkov@nginx.com            _, sock, _ = self.ws.upgrade()
12151158Szelenkov@nginx.com
12161158Szelenkov@nginx.com            payload = self.ws.serialize_close(code=code)
12171158Szelenkov@nginx.com
12181158Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
12191158Szelenkov@nginx.com            self.check_close(sock, 1002)
12201158Szelenkov@nginx.com
12211158Szelenkov@nginx.com    def test_java_websockets_7_13_1__7_13_2(self):
12221158Szelenkov@nginx.com        self.load('websockets_mirror')
12231158Szelenkov@nginx.com
12241158Szelenkov@nginx.com        # 7_13_1
12251158Szelenkov@nginx.com
12261158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
12271158Szelenkov@nginx.com
12281158Szelenkov@nginx.com        payload = self.ws.serialize_close(code=5000)
12291158Szelenkov@nginx.com
12301158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
12311158Szelenkov@nginx.com        self.check_close(sock, 1002)
12321158Szelenkov@nginx.com
12331158Szelenkov@nginx.com        # 7_13_2
12341158Szelenkov@nginx.com
12351158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
12361158Szelenkov@nginx.com
12371158Szelenkov@nginx.com        payload = struct.pack('!I', 65536) + ''.encode('utf-8')
12381158Szelenkov@nginx.com
12391158Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
12401158Szelenkov@nginx.com        self.check_close(sock, 1002)
12411158Szelenkov@nginx.com
12421596Szelenkov@nginx.com    def test_java_websockets_9_1_1__9_6_6(self, is_unsafe):
12431596Szelenkov@nginx.com        if not is_unsafe:
12441596Szelenkov@nginx.com            pytest.skip('unsafe, long run')
12451158Szelenkov@nginx.com
12461158Szelenkov@nginx.com        self.load('websockets_mirror')
12471158Szelenkov@nginx.com
12481596Szelenkov@nginx.com        assert 'success' in self.conf(
12491596Szelenkov@nginx.com            {
12501596Szelenkov@nginx.com                'http': {
12511596Szelenkov@nginx.com                    'websocket': {
12521596Szelenkov@nginx.com                        'max_frame_size': 33554432,
12531596Szelenkov@nginx.com                        'keepalive_interval': 0,
12541158Szelenkov@nginx.com                    }
12551596Szelenkov@nginx.com                }
12561596Szelenkov@nginx.com            },
12571596Szelenkov@nginx.com            'settings',
12581596Szelenkov@nginx.com        ), 'increase max_frame_size and keepalive_interval'
12591158Szelenkov@nginx.com
12601158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
12611158Szelenkov@nginx.com
12621158Szelenkov@nginx.com        op_text = self.ws.OP_TEXT
12631158Szelenkov@nginx.com        op_binary = self.ws.OP_BINARY
12641158Szelenkov@nginx.com
12651158Szelenkov@nginx.com        def check_payload(opcode, length, chopsize=None):
12661158Szelenkov@nginx.com            if opcode == self.ws.OP_TEXT:
12671158Szelenkov@nginx.com                payload = '*' * length
12681158Szelenkov@nginx.com            else:
12691158Szelenkov@nginx.com                payload = b'*' * length
12701158Szelenkov@nginx.com
12711158Szelenkov@nginx.com            self.ws.frame_write(sock, opcode, payload, chopsize=chopsize)
12721158Szelenkov@nginx.com            frame = self.ws.frame_read(sock)
12731158Szelenkov@nginx.com            self.check_frame(frame, True, opcode, payload)
12741158Szelenkov@nginx.com
12751158Szelenkov@nginx.com        def check_message(opcode, f_size):
12761158Szelenkov@nginx.com            if opcode == self.ws.OP_TEXT:
12771158Szelenkov@nginx.com                payload = '*' * 4 * 2 ** 20
12781158Szelenkov@nginx.com            else:
12791158Szelenkov@nginx.com                payload = b'*' * 4 * 2 ** 20
12801158Szelenkov@nginx.com
12811158Szelenkov@nginx.com            self.ws.message(sock, opcode, payload, fragmention_size=f_size)
12821158Szelenkov@nginx.com            frame = self.ws.frame_read(sock, read_timeout=5)
12831158Szelenkov@nginx.com            self.check_frame(frame, True, opcode, payload)
12841158Szelenkov@nginx.com
12851158Szelenkov@nginx.com        check_payload(op_text, 64 * 2 ** 10)              # 9_1_1
12861158Szelenkov@nginx.com        check_payload(op_text, 256 * 2 ** 10)             # 9_1_2
12871158Szelenkov@nginx.com        check_payload(op_text, 2 ** 20)                   # 9_1_3
12881158Szelenkov@nginx.com        check_payload(op_text, 4 * 2 ** 20)               # 9_1_4
12891158Szelenkov@nginx.com        check_payload(op_text, 8 * 2 ** 20)               # 9_1_5
12901158Szelenkov@nginx.com        check_payload(op_text, 16 * 2 ** 20)              # 9_1_6
12911158Szelenkov@nginx.com
12921158Szelenkov@nginx.com        check_payload(op_binary, 64 * 2 ** 10)            # 9_2_1
12931158Szelenkov@nginx.com        check_payload(op_binary, 256 * 2 ** 10)           # 9_2_2
12941158Szelenkov@nginx.com        check_payload(op_binary, 2 ** 20)                 # 9_2_3
12951158Szelenkov@nginx.com        check_payload(op_binary, 4 * 2 ** 20)             # 9_2_4
12961158Szelenkov@nginx.com        check_payload(op_binary, 8 * 2 ** 20)             # 9_2_5
12971158Szelenkov@nginx.com        check_payload(op_binary, 16 * 2 ** 20)            # 9_2_6
12981158Szelenkov@nginx.com
12991596Szelenkov@nginx.com        if option.system != 'Darwin' and option.system != 'FreeBSD':
13001158Szelenkov@nginx.com            check_message(op_text, 64)                    # 9_3_1
13011158Szelenkov@nginx.com            check_message(op_text, 256)                   # 9_3_2
13021158Szelenkov@nginx.com            check_message(op_text, 2 ** 10)               # 9_3_3
13031158Szelenkov@nginx.com            check_message(op_text, 4 * 2 ** 10)           # 9_3_4
13041158Szelenkov@nginx.com            check_message(op_text, 16 * 2 ** 10)          # 9_3_5
13051158Szelenkov@nginx.com            check_message(op_text, 64 * 2 ** 10)          # 9_3_6
13061158Szelenkov@nginx.com            check_message(op_text, 256 * 2 ** 10)         # 9_3_7
13071158Szelenkov@nginx.com            check_message(op_text, 2 ** 20)               # 9_3_8
13081158Szelenkov@nginx.com            check_message(op_text, 4 * 2 ** 20)           # 9_3_9
13091158Szelenkov@nginx.com
13101158Szelenkov@nginx.com            check_message(op_binary, 64)                  # 9_4_1
13111158Szelenkov@nginx.com            check_message(op_binary, 256)                 # 9_4_2
13121158Szelenkov@nginx.com            check_message(op_binary, 2 ** 10)             # 9_4_3
13131158Szelenkov@nginx.com            check_message(op_binary, 4 * 2 ** 10)         # 9_4_4
13141158Szelenkov@nginx.com            check_message(op_binary, 16 * 2 ** 10)        # 9_4_5
13151158Szelenkov@nginx.com            check_message(op_binary, 64 * 2 ** 10)        # 9_4_6
13161158Szelenkov@nginx.com            check_message(op_binary, 256 * 2 ** 10)       # 9_4_7
13171158Szelenkov@nginx.com            check_message(op_binary, 2 ** 20)             # 9_4_8
13181158Szelenkov@nginx.com            check_message(op_binary, 4 * 2 ** 20)         # 9_4_9
13191158Szelenkov@nginx.com
13201158Szelenkov@nginx.com        check_payload(op_text, 2 ** 20, chopsize=64)      # 9_5_1
13211158Szelenkov@nginx.com        check_payload(op_text, 2 ** 20, chopsize=128)     # 9_5_2
13221158Szelenkov@nginx.com        check_payload(op_text, 2 ** 20, chopsize=256)     # 9_5_3
13231158Szelenkov@nginx.com        check_payload(op_text, 2 ** 20, chopsize=512)     # 9_5_4
13241158Szelenkov@nginx.com        check_payload(op_text, 2 ** 20, chopsize=1024)    # 9_5_5
13251158Szelenkov@nginx.com        check_payload(op_text, 2 ** 20, chopsize=2048)    # 9_5_6
13261158Szelenkov@nginx.com
13271158Szelenkov@nginx.com        check_payload(op_binary, 2 ** 20, chopsize=64)    # 9_6_1
13281158Szelenkov@nginx.com        check_payload(op_binary, 2 ** 20, chopsize=128)   # 9_6_2
13291158Szelenkov@nginx.com        check_payload(op_binary, 2 ** 20, chopsize=256)   # 9_6_3
13301158Szelenkov@nginx.com        check_payload(op_binary, 2 ** 20, chopsize=512)   # 9_6_4
13311158Szelenkov@nginx.com        check_payload(op_binary, 2 ** 20, chopsize=1024)  # 9_6_5
13321158Szelenkov@nginx.com        check_payload(op_binary, 2 ** 20, chopsize=2048)  # 9_6_6
13331158Szelenkov@nginx.com
13341158Szelenkov@nginx.com        self.close_connection(sock)
13351158Szelenkov@nginx.com
13361158Szelenkov@nginx.com    def test_java_websockets_10_1_1(self):
13371158Szelenkov@nginx.com        self.load('websockets_mirror')
13381158Szelenkov@nginx.com
13391158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
13401158Szelenkov@nginx.com
13411158Szelenkov@nginx.com        payload = '*' * 65536
13421158Szelenkov@nginx.com
13431158Szelenkov@nginx.com        self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1300)
13441158Szelenkov@nginx.com
13451158Szelenkov@nginx.com        frame = self.ws.message_read(sock)
13461158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
13471158Szelenkov@nginx.com
13481158Szelenkov@nginx.com        self.close_connection(sock)
13491158Szelenkov@nginx.com
13501158Szelenkov@nginx.com    # settings
13511158Szelenkov@nginx.com
13521158Szelenkov@nginx.com    def test_java_websockets_max_frame_size(self):
13531158Szelenkov@nginx.com        self.load('websockets_mirror')
13541158Szelenkov@nginx.com
13551596Szelenkov@nginx.com        assert 'success' in self.conf(
13561596Szelenkov@nginx.com            {'http': {'websocket': {'max_frame_size': 100}}}, 'settings'
13571596Szelenkov@nginx.com        ), 'configure max_frame_size'
13581158Szelenkov@nginx.com
13591158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
13601158Szelenkov@nginx.com
13611158Szelenkov@nginx.com        payload = '*' * 94
13621158Szelenkov@nginx.com        opcode = self.ws.OP_TEXT
13631158Szelenkov@nginx.com
13641158Szelenkov@nginx.com        self.ws.frame_write(sock, opcode, payload)  # frame length is 100
13651158Szelenkov@nginx.com
13661158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
13671158Szelenkov@nginx.com        self.check_frame(frame, True, opcode, payload)
13681158Szelenkov@nginx.com
13691158Szelenkov@nginx.com        payload = '*' * 95
13701158Szelenkov@nginx.com
13711158Szelenkov@nginx.com        self.ws.frame_write(sock, opcode, payload)  # frame length is 101
13721158Szelenkov@nginx.com        self.check_close(sock, 1009)  # 1009 - CLOSE_TOO_LARGE
13731158Szelenkov@nginx.com
13741158Szelenkov@nginx.com    def test_java_websockets_read_timeout(self):
13751158Szelenkov@nginx.com        self.load('websockets_mirror')
13761158Szelenkov@nginx.com
13771596Szelenkov@nginx.com        assert 'success' in self.conf(
13781596Szelenkov@nginx.com            {'http': {'websocket': {'read_timeout': 5}}}, 'settings'
13791596Szelenkov@nginx.com        ), 'configure read_timeout'
13801158Szelenkov@nginx.com
13811158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
13821158Szelenkov@nginx.com
13831158Szelenkov@nginx.com        frame = self.ws.frame_to_send(self.ws.OP_TEXT, 'blah')
13841158Szelenkov@nginx.com        sock.sendall(frame[:2])
13851158Szelenkov@nginx.com
13861158Szelenkov@nginx.com        time.sleep(2)
13871158Szelenkov@nginx.com
13881158Szelenkov@nginx.com        self.check_close(sock, 1001)  # 1001 - CLOSE_GOING_AWAY
13891158Szelenkov@nginx.com
13901158Szelenkov@nginx.com    def test_java_websockets_keepalive_interval(self):
13911158Szelenkov@nginx.com        self.load('websockets_mirror')
13921158Szelenkov@nginx.com
13931596Szelenkov@nginx.com        assert 'success' in self.conf(
13941596Szelenkov@nginx.com            {'http': {'websocket': {'keepalive_interval': 5}}}, 'settings'
13951596Szelenkov@nginx.com        ), 'configure keepalive_interval'
13961158Szelenkov@nginx.com
13971158Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
13981158Szelenkov@nginx.com
13991158Szelenkov@nginx.com        frame = self.ws.frame_to_send(self.ws.OP_TEXT, 'blah')
14001158Szelenkov@nginx.com        sock.sendall(frame[:2])
14011158Szelenkov@nginx.com
14021158Szelenkov@nginx.com        time.sleep(2)
14031158Szelenkov@nginx.com
14041158Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
14051158Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PING, '')  # PING frame
14061158Szelenkov@nginx.com
14071158Szelenkov@nginx.com        sock.close()
1408