1import time 2import struct 3import unittest 4from unit.applications.lang.java import TestApplicationJava 5from unit.applications.websockets import TestApplicationWebsocket 6 7 8class TestJavaWebsockets(TestApplicationJava): 9 prerequisites = {'modules': ['java']} 10 11 ws = TestApplicationWebsocket() 12 13 def setUp(self): 14 super().setUp() 15 16 self.assertIn( 17 'success', 18 self.conf( 19 {'http': {'websocket': {'keepalive_interval': 0}}}, 'settings' 20 ), 21 'clear keepalive_interval', 22 ) 23 24 self.skip_alerts.extend( 25 [r'last message send failed', r'socket close\(\d+\) failed'] 26 ) 27 28 def close_connection(self, sock): 29 self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock') 30 31 self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 32 33 self.check_close(sock) 34 35 def check_close(self, sock, code=1000, no_close=False): 36 frame = self.ws.frame_read(sock) 37 38 self.assertEqual(frame['fin'], True, 'close fin') 39 self.assertEqual(frame['opcode'], self.ws.OP_CLOSE, 'close opcode') 40 self.assertEqual(frame['code'], code, 'close code') 41 42 if not no_close: 43 sock.close() 44 45 def check_frame(self, frame, fin, opcode, payload, decode=True): 46 if opcode == self.ws.OP_BINARY or not decode: 47 data = frame['data'] 48 else: 49 data = frame['data'].decode('utf-8') 50 51 self.assertEqual(frame['fin'], fin, 'fin') 52 self.assertEqual(frame['opcode'], opcode, 'opcode') 53 self.assertEqual(data, payload, 'payload') 54 55 def test_java_websockets_handshake(self): 56 self.load('websockets_mirror') 57 58 resp, sock, key = self.ws.upgrade() 59 sock.close() 60 61 self.assertEqual(resp['status'], 101, 'status') 62 self.assertEqual(resp['headers']['Upgrade'], 'websocket', 'upgrade') 63 self.assertEqual( 64 resp['headers']['Connection'], 'Upgrade', 'connection' 65 ) 66 self.assertEqual( 67 resp['headers']['Sec-WebSocket-Accept'], self.ws.accept(key), 'key' 68 ) 69 70 def test_java_websockets_mirror(self): 71 self.load('websockets_mirror') 72 73 message = 'blah' 74 75 _, sock, _ = self.ws.upgrade() 76 77 self.ws.frame_write(sock, self.ws.OP_TEXT, message) 78 frame = self.ws.frame_read(sock) 79 80 self.assertEqual(message, frame['data'].decode('utf-8'), 'mirror') 81 82 self.ws.frame_write(sock, self.ws.OP_TEXT, message) 83 frame = self.ws.frame_read(sock) 84 85 self.assertEqual(message, frame['data'].decode('utf-8'), 'mirror 2') 86 87 sock.close() 88 89 def test_java_websockets_no_mask(self): 90 self.load('websockets_mirror') 91 92 message = 'blah' 93 94 _, sock, _ = self.ws.upgrade() 95 96 self.ws.frame_write(sock, self.ws.OP_TEXT, message, mask=False) 97 98 frame = self.ws.frame_read(sock) 99 100 self.assertEqual(frame['opcode'], self.ws.OP_CLOSE, 'no mask opcode') 101 self.assertEqual(frame['code'], 1002, 'no mask close code') 102 103 sock.close() 104 105 def test_java_websockets_fragmentation(self): 106 self.load('websockets_mirror') 107 108 message = 'blah' 109 110 _, sock, _ = self.ws.upgrade() 111 112 self.ws.frame_write(sock, self.ws.OP_TEXT, message, fin=False) 113 self.ws.frame_write(sock, self.ws.OP_CONT, ' ', fin=False) 114 self.ws.frame_write(sock, self.ws.OP_CONT, message) 115 116 frame = self.ws.frame_read(sock) 117 118 self.assertEqual( 119 message + ' ' + message, 120 frame['data'].decode('utf-8'), 121 'mirror framing', 122 ) 123 124 sock.close() 125 126 def test_java_websockets_frame_fragmentation_invalid(self): 127 self.load('websockets_mirror') 128 129 message = 'blah' 130 131 _, sock, _ = self.ws.upgrade() 132 133 self.ws.frame_write(sock, self.ws.OP_PING, message, fin=False) 134 135 frame = self.ws.frame_read(sock) 136 137 frame.pop('data') 138 self.assertDictEqual( 139 frame, 140 { 141 'fin': True, 142 'rsv1': False, 143 'rsv2': False, 144 'rsv3': False, 145 'opcode': self.ws.OP_CLOSE, 146 'mask': 0, 147 'code': 1002, 148 'reason': 'Fragmented control frame', 149 }, 150 'close frame', 151 ) 152 153 sock.close() 154 155 def test_java_websockets_two_clients(self): 156 self.load('websockets_mirror') 157 158 message1 = 'blah1' 159 message2 = 'blah2' 160 161 _, sock1, _ = self.ws.upgrade() 162 _, sock2, _ = self.ws.upgrade() 163 164 self.ws.frame_write(sock1, self.ws.OP_TEXT, message1) 165 self.ws.frame_write(sock2, self.ws.OP_TEXT, message2) 166 167 frame1 = self.ws.frame_read(sock1) 168 frame2 = self.ws.frame_read(sock2) 169 170 self.assertEqual(message1, frame1['data'].decode('utf-8'), 'client 1') 171 self.assertEqual(message2, frame2['data'].decode('utf-8'), 'client 2') 172 173 sock1.close() 174 sock2.close() 175 176 @unittest.skip('not yet') 177 def test_java_websockets_handshake_upgrade_absent( 178 self 179 ): # FAIL https://tools.ietf.org/html/rfc6455#section-4.2.1 180 self.load('websockets_mirror') 181 182 self.get() 183 184 key = self.ws.key() 185 resp = self.get( 186 headers={ 187 'Host': 'localhost', 188 'Connection': 'Upgrade', 189 'Sec-WebSocket-Key': key, 190 'Sec-WebSocket-Protocol': 'chat', 191 'Sec-WebSocket-Version': 13, 192 }, 193 read_timeout=1, 194 ) 195 196 self.assertEqual(resp['status'], 400, 'upgrade absent') 197 198 def test_java_websockets_handshake_case_insensitive(self): 199 self.load('websockets_mirror') 200 201 self.get() 202 203 key = self.ws.key() 204 resp = self.get( 205 headers={ 206 'Host': 'localhost', 207 'Upgrade': 'WEBSOCKET', 208 'Connection': 'UPGRADE', 209 'Sec-WebSocket-Key': key, 210 'Sec-WebSocket-Protocol': 'chat', 211 'Sec-WebSocket-Version': 13, 212 }, 213 read_timeout=1, 214 ) 215 216 self.assertEqual(resp['status'], 101, 'status') 217 218 @unittest.skip('not yet') 219 def test_java_websockets_handshake_connection_absent(self): # FAIL 220 self.load('websockets_mirror') 221 222 self.get() 223 224 key = self.ws.key() 225 resp = self.get( 226 headers={ 227 'Host': 'localhost', 228 'Upgrade': 'websocket', 229 'Sec-WebSocket-Key': key, 230 'Sec-WebSocket-Protocol': 'chat', 231 'Sec-WebSocket-Version': 13, 232 }, 233 read_timeout=1, 234 ) 235 236 self.assertEqual(resp['status'], 400, 'status') 237 238 def test_java_websockets_handshake_version_absent(self): 239 self.load('websockets_mirror') 240 241 self.get() 242 243 key = self.ws.key() 244 resp = self.get( 245 headers={ 246 'Host': 'localhost', 247 'Upgrade': 'websocket', 248 'Connection': 'Upgrade', 249 'Sec-WebSocket-Key': key, 250 'Sec-WebSocket-Protocol': 'chat', 251 }, 252 read_timeout=1, 253 ) 254 255 self.assertEqual(resp['status'], 426, 'status') 256 257 @unittest.skip('not yet') 258 def test_java_websockets_handshake_key_invalid(self): 259 self.load('websockets_mirror') 260 261 self.get() 262 263 resp = self.get( 264 headers={ 265 'Host': 'localhost', 266 'Upgrade': 'websocket', 267 'Connection': 'Upgrade', 268 'Sec-WebSocket-Key': '!', 269 'Sec-WebSocket-Protocol': 'chat', 270 'Sec-WebSocket-Version': 13, 271 }, 272 read_timeout=1, 273 ) 274 275 self.assertEqual(resp['status'], 400, 'key length') 276 277 key = self.ws.key() 278 resp = self.get( 279 headers={ 280 'Host': 'localhost', 281 'Upgrade': 'websocket', 282 'Connection': 'Upgrade', 283 'Sec-WebSocket-Key': [key, key], 284 'Sec-WebSocket-Protocol': 'chat', 285 'Sec-WebSocket-Version': 13, 286 }, 287 read_timeout=1, 288 ) 289 290 self.assertEqual( 291 resp['status'], 400, 'key double' 292 ) # FAIL https://tools.ietf.org/html/rfc6455#section-11.3.1 293 294 def test_java_websockets_handshake_method_invalid(self): 295 self.load('websockets_mirror') 296 297 self.get() 298 299 key = self.ws.key() 300 resp = self.post( 301 headers={ 302 'Host': 'localhost', 303 'Upgrade': 'websocket', 304 'Connection': 'Upgrade', 305 'Sec-WebSocket-Key': key, 306 'Sec-WebSocket-Protocol': 'chat', 307 'Sec-WebSocket-Version': 13, 308 }, 309 read_timeout=1, 310 ) 311 312 self.assertEqual(resp['status'], 400, 'status') 313 314 def test_java_websockets_handshake_http_10(self): 315 self.load('websockets_mirror') 316 317 self.get() 318 319 key = self.ws.key() 320 resp = self.get( 321 headers={ 322 'Host': 'localhost', 323 'Upgrade': 'websocket', 324 'Connection': 'Upgrade', 325 'Sec-WebSocket-Key': key, 326 'Sec-WebSocket-Protocol': 'chat', 327 'Sec-WebSocket-Version': 13, 328 }, 329 http_10=True, 330 read_timeout=1, 331 ) 332 333 self.assertEqual(resp['status'], 400, 'status') 334 335 def test_java_websockets_handshake_uri_invalid(self): 336 self.load('websockets_mirror') 337 338 self.get() 339 340 key = self.ws.key() 341 resp = self.get( 342 headers={ 343 'Host': 'localhost', 344 'Upgrade': 'websocket', 345 'Connection': 'Upgrade', 346 'Sec-WebSocket-Key': key, 347 'Sec-WebSocket-Protocol': 'chat', 348 'Sec-WebSocket-Version': 13, 349 }, 350 url='!', 351 read_timeout=1, 352 ) 353 354 self.assertEqual(resp['status'], 400, 'status') 355 356 def test_java_websockets_protocol_absent(self): 357 self.load('websockets_mirror') 358 359 self.get() 360 361 key = self.ws.key() 362 resp = self.get( 363 headers={ 364 'Host': 'localhost', 365 'Upgrade': 'websocket', 366 'Connection': 'Upgrade', 367 'Sec-WebSocket-Key': key, 368 'Sec-WebSocket-Version': 13, 369 }, 370 read_timeout=1, 371 ) 372 373 self.assertEqual(resp['status'], 101, 'status') 374 self.assertEqual(resp['headers']['Upgrade'], 'websocket', 'upgrade') 375 self.assertEqual( 376 resp['headers']['Connection'], 'Upgrade', 'connection' 377 ) 378 self.assertEqual( 379 resp['headers']['Sec-WebSocket-Accept'], self.ws.accept(key), 'key' 380 ) 381 382 # autobahn-testsuite 383 # 384 # Some following tests fail because of Unit does not support UTF-8 385 # validation for websocket frames. It should be implemented 386 # by application, if necessary. 387 388 def test_java_websockets_1_1_1__1_1_8(self): 389 self.load('websockets_mirror') 390 391 opcode = self.ws.OP_TEXT 392 393 _, sock, _ = self.ws.upgrade() 394 395 def check_length(length, chopsize=None): 396 payload = '*' * length 397 398 self.ws.frame_write(sock, opcode, payload, chopsize=chopsize) 399 400 frame = self.ws.message_read(sock) 401 self.check_frame(frame, True, opcode, payload) 402 403 check_length(0) # 1_1_1 404 check_length(125) # 1_1_2 405 check_length(126) # 1_1_3 406 check_length(127) # 1_1_4 407 check_length(128) # 1_1_5 408 check_length(65535) # 1_1_6 409 check_length(65536) # 1_1_7 410 check_length(65536, chopsize = 997) # 1_1_8 411 412 self.close_connection(sock) 413 414 def test_java_websockets_1_2_1__1_2_8(self): 415 self.load('websockets_mirror') 416 417 opcode = self.ws.OP_BINARY 418 419 _, sock, _ = self.ws.upgrade() 420 421 def check_length(length, chopsize=None): 422 payload = b'\xfe' * length 423 424 self.ws.frame_write(sock, opcode, payload, chopsize=chopsize) 425 426 frame = self.ws.message_read(sock) 427 self.check_frame(frame, True, opcode, payload) 428 429 check_length(0) # 1_2_1 430 check_length(125) # 1_2_2 431 check_length(126) # 1_2_3 432 check_length(127) # 1_2_4 433 check_length(128) # 1_2_5 434 check_length(65535) # 1_2_6 435 check_length(65536) # 1_2_7 436 check_length(65536, chopsize = 997) # 1_2_8 437 438 self.close_connection(sock) 439 440 def test_java_websockets_2_1__2_6(self): 441 self.load('websockets_mirror') 442 443 op_ping = self.ws.OP_PING 444 op_pong = self.ws.OP_PONG 445 446 _, sock, _ = self.ws.upgrade() 447 448 def check_ping(payload, chopsize=None, decode=True): 449 self.ws.frame_write(sock, op_ping, payload, chopsize=chopsize) 450 frame = self.ws.frame_read(sock) 451 452 self.check_frame(frame, True, op_pong, payload, decode=decode) 453 454 check_ping('') # 2_1 455 check_ping('Hello, world!') # 2_2 456 check_ping(b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff', decode=False) # 2_3 457 check_ping(b'\xfe' * 125, decode=False) # 2_4 458 check_ping(b'\xfe' * 125, chopsize=1, decode=False) # 2_6 459 460 self.close_connection(sock) 461 462 # 2_5 463 464 _, sock, _ = self.ws.upgrade() 465 466 self.ws.frame_write(sock, self.ws.OP_PING, b'\xfe' * 126) 467 self.check_close(sock, 1002) 468 469 def test_java_websockets_2_7__2_9(self): 470 self.load('websockets_mirror') 471 472 # 2_7 473 474 _, sock, _ = self.ws.upgrade() 475 476 self.ws.frame_write(sock, self.ws.OP_PONG, '') 477 self.assertEqual(self.recvall(sock, read_timeout=1), b'', '2_7') 478 479 # 2_8 480 481 self.ws.frame_write(sock, self.ws.OP_PONG, 'unsolicited pong payload') 482 self.assertEqual(self.recvall(sock, read_timeout=1), b'', '2_8') 483 484 # 2_9 485 486 payload = 'ping payload' 487 488 self.ws.frame_write(sock, self.ws.OP_PONG, 'unsolicited pong payload') 489 self.ws.frame_write(sock, self.ws.OP_PING, payload) 490 491 frame = self.ws.frame_read(sock) 492 self.check_frame(frame, True, self.ws.OP_PONG, payload) 493 494 self.close_connection(sock) 495 496 def test_java_websockets_2_10__2_11(self): 497 self.load('websockets_mirror') 498 499 # 2_10 500 501 _, sock, _ = self.ws.upgrade() 502 503 for i in range(0, 10): 504 self.ws.frame_write(sock, self.ws.OP_PING, 'payload-%d' % i) 505 506 for i in range(0, 10): 507 frame = self.ws.frame_read(sock) 508 self.check_frame(frame, True, self.ws.OP_PONG, 'payload-%d' % i) 509 510 # 2_11 511 512 for i in range(0, 10): 513 opcode = self.ws.OP_PING 514 self.ws.frame_write(sock, opcode, 'payload-%d' % i, chopsize=1) 515 516 for i in range(0, 10): 517 frame = self.ws.frame_read(sock) 518 self.check_frame(frame, True, self.ws.OP_PONG, 'payload-%d' % i) 519 520 self.close_connection(sock) 521 522 @unittest.skip('not yet') 523 def test_java_websockets_3_1__3_7(self): 524 self.load('websockets_mirror') 525 526 payload = 'Hello, world!' 527 528 # 3_1 529 530 _, sock, _ = self.ws.upgrade() 531 532 self.ws.frame_write(sock, self.ws.OP_TEXT, payload, rsv1=True) 533 self.check_close(sock, 1002) 534 535 # 3_2 536 537 _, sock, _ = self.ws.upgrade() 538 539 self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 540 self.ws.frame_write(sock, self.ws.OP_TEXT, payload, rsv2=True) 541 self.ws.frame_write(sock, self.ws.OP_PING, '') 542 543 frame = self.ws.frame_read(sock) 544 self.check_frame(frame, True, self.ws.OP_TEXT, payload) 545 546 self.check_close(sock, 1002, no_close=True) 547 548 self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty 3_2') 549 sock.close() 550 551 # 3_3 552 553 _, sock, _ = self.ws.upgrade() 554 555 self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 556 557 frame = self.ws.frame_read(sock) 558 self.check_frame(frame, True, self.ws.OP_TEXT, payload) 559 560 self.ws.frame_write( 561 sock, self.ws.OP_TEXT, payload, rsv1=True, rsv2=True 562 ) 563 564 self.check_close(sock, 1002, no_close=True) 565 566 self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty 3_3') 567 sock.close() 568 569 # 3_4 570 571 _, sock, _ = self.ws.upgrade() 572 573 self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1) 574 self.ws.frame_write( 575 sock, self.ws.OP_TEXT, payload, rsv3=True, chopsize=1 576 ) 577 self.ws.frame_write(sock, self.ws.OP_PING, '') 578 579 frame = self.ws.frame_read(sock) 580 self.check_frame(frame, True, self.ws.OP_TEXT, payload) 581 582 self.check_close(sock, 1002, no_close=True) 583 584 self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty 3_4') 585 sock.close() 586 587 # 3_5 588 589 _, sock, _ = self.ws.upgrade() 590 591 self.ws.frame_write( 592 sock, 593 self.ws.OP_BINARY, 594 b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff', 595 rsv1=True, 596 rsv3=True, 597 ) 598 599 self.check_close(sock, 1002) 600 601 # 3_6 602 603 _, sock, _ = self.ws.upgrade() 604 605 self.ws.frame_write( 606 sock, self.ws.OP_PING, payload, rsv2=True, rsv3=True 607 ) 608 609 self.check_close(sock, 1002) 610 611 # 3_7 612 613 _, sock, _ = self.ws.upgrade() 614 615 self.ws.frame_write( 616 sock, self.ws.OP_CLOSE, payload, rsv1=True, rsv2=True, rsv3=True 617 ) 618 619 self.check_close(sock, 1002) 620 621 def test_java_websockets_4_1_1__4_2_5(self): 622 self.load('websockets_mirror') 623 624 payload = 'Hello, world!' 625 626 # 4_1_1 627 628 _, sock, _ = self.ws.upgrade() 629 630 self.ws.frame_write(sock, 0x03, '') 631 self.check_close(sock, 1002) 632 633 # 4_1_2 634 635 _, sock, _ = self.ws.upgrade() 636 637 self.ws.frame_write(sock, 0x04, 'reserved opcode payload') 638 self.check_close(sock, 1002) 639 640 # 4_1_3 641 642 _, sock, _ = self.ws.upgrade() 643 644 self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 645 646 frame = self.ws.frame_read(sock) 647 self.check_frame(frame, True, self.ws.OP_TEXT, payload) 648 649 self.ws.frame_write(sock, 0x05, '') 650 self.ws.frame_write(sock, self.ws.OP_PING, '') 651 652 self.check_close(sock, 1002) 653 654 # 4_1_4 655 656 _, sock, _ = self.ws.upgrade() 657 658 self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 659 660 frame = self.ws.frame_read(sock) 661 self.check_frame(frame, True, self.ws.OP_TEXT, payload) 662 663 self.ws.frame_write(sock, 0x06, payload) 664 self.ws.frame_write(sock, self.ws.OP_PING, '') 665 666 self.check_close(sock, 1002) 667 668 # 4_1_5 669 670 _, sock, _ = self.ws.upgrade() 671 672 self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1) 673 674 frame = self.ws.frame_read(sock) 675 self.check_frame(frame, True, self.ws.OP_TEXT, payload) 676 677 self.ws.frame_write(sock, 0x07, payload, chopsize=1) 678 self.ws.frame_write(sock, self.ws.OP_PING, '') 679 680 self.check_close(sock, 1002) 681 682 # 4_2_1 683 684 _, sock, _ = self.ws.upgrade() 685 686 self.ws.frame_write(sock, 0x0B, '') 687 self.check_close(sock, 1002) 688 689 # 4_2_2 690 691 _, sock, _ = self.ws.upgrade() 692 693 self.ws.frame_write(sock, 0x0C, 'reserved opcode payload') 694 self.check_close(sock, 1002) 695 696 # 4_2_3 697 698 _, sock, _ = self.ws.upgrade() 699 700 self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 701 702 frame = self.ws.frame_read(sock) 703 self.check_frame(frame, True, self.ws.OP_TEXT, payload) 704 705 self.ws.frame_write(sock, 0x0D, '') 706 self.ws.frame_write(sock, self.ws.OP_PING, '') 707 708 self.check_close(sock, 1002) 709 710 # 4_2_4 711 712 _, sock, _ = self.ws.upgrade() 713 714 self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 715 716 frame = self.ws.frame_read(sock) 717 self.check_frame(frame, True, self.ws.OP_TEXT, payload) 718 719 self.ws.frame_write(sock, 0x0E, payload) 720 self.ws.frame_write(sock, self.ws.OP_PING, '') 721 722 self.check_close(sock, 1002) 723 724 # 4_2_5 725 726 _, sock, _ = self.ws.upgrade() 727 728 self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1) 729 730 frame = self.ws.frame_read(sock) 731 self.check_frame(frame, True, self.ws.OP_TEXT, payload) 732 733 self.ws.frame_write(sock, 0x0F, payload, chopsize=1) 734 self.ws.frame_write(sock, self.ws.OP_PING, '') 735 736 self.check_close(sock, 1002) 737 738 def test_java_websockets_5_1__5_20(self): 739 self.load('websockets_mirror') 740 741 # 5_1 742 743 _, sock, _ = self.ws.upgrade() 744 745 self.ws.frame_write(sock, self.ws.OP_PING, 'fragment1', fin=False) 746 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 747 self.check_close(sock, 1002) 748 749 # 5_2 750 751 _, sock, _ = self.ws.upgrade() 752 753 self.ws.frame_write(sock, self.ws.OP_PONG, 'fragment1', fin=False) 754 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 755 self.check_close(sock, 1002) 756 757 # 5_3 758 759 _, sock, _ = self.ws.upgrade() 760 761 self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 762 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 763 764 frame = self.ws.frame_read(sock) 765 self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 766 767 # 5_4 768 769 self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 770 self.assertEqual(self.recvall(sock, read_timeout=1), b'', '5_4') 771 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 772 773 frame = self.ws.frame_read(sock) 774 self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 775 776 # 5_5 777 778 self.ws.frame_write( 779 sock, self.ws.OP_TEXT, 'fragment1', fin=False, chopsize=1 780 ) 781 self.ws.frame_write( 782 sock, self.ws.OP_CONT, 'fragment2', fin=True, chopsize=1 783 ) 784 785 frame = self.ws.frame_read(sock) 786 self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 787 788 # 5_6 789 790 ping_payload = 'ping payload' 791 792 self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 793 self.ws.frame_write(sock, self.ws.OP_PING, ping_payload) 794 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 795 796 frame = self.ws.frame_read(sock) 797 self.check_frame(frame, True, self.ws.OP_PONG, ping_payload) 798 799 frame = self.ws.frame_read(sock) 800 self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 801 802 # 5_7 803 804 ping_payload = 'ping payload' 805 806 self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 807 self.assertEqual(self.recvall(sock, read_timeout=1), b'', '5_7') 808 809 self.ws.frame_write(sock, self.ws.OP_PING, ping_payload) 810 811 frame = self.ws.frame_read(sock) 812 self.check_frame(frame, True, self.ws.OP_PONG, ping_payload) 813 814 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 815 816 frame = self.ws.frame_read(sock) 817 self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 818 819 # 5_8 820 821 ping_payload = 'ping payload' 822 823 self.ws.frame_write( 824 sock, self.ws.OP_TEXT, 'fragment1', fin=False, chopsize=1 825 ) 826 self.ws.frame_write(sock, self.ws.OP_PING, ping_payload, chopsize=1) 827 self.ws.frame_write( 828 sock, self.ws.OP_CONT, 'fragment2', fin=True, chopsize=1 829 ) 830 831 frame = self.ws.frame_read(sock) 832 self.check_frame(frame, True, self.ws.OP_PONG, ping_payload) 833 834 frame = self.ws.frame_read(sock) 835 self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2') 836 837 # 5_9 838 839 self.ws.frame_write( 840 sock, self.ws.OP_CONT, 'non-continuation payload', fin=True 841 ) 842 self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True) 843 self.check_close(sock, 1002) 844 845 # 5_10 846 847 _, sock, _ = self.ws.upgrade() 848 849 self.ws.frame_write( 850 sock, self.ws.OP_CONT, 'non-continuation payload', fin=True 851 ) 852 self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True) 853 self.check_close(sock, 1002) 854 855 # 5_11 856 857 _, sock, _ = self.ws.upgrade() 858 859 self.ws.frame_write( 860 sock, 861 self.ws.OP_CONT, 862 'non-continuation payload', 863 fin=True, 864 chopsize=1, 865 ) 866 self.ws.frame_write( 867 sock, self.ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1 868 ) 869 self.check_close(sock, 1002) 870 871 # 5_12 872 873 _, sock, _ = self.ws.upgrade() 874 875 self.ws.frame_write( 876 sock, self.ws.OP_CONT, 'non-continuation payload', fin=False 877 ) 878 self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True) 879 self.check_close(sock, 1002) 880 881 # 5_13 882 883 _, sock, _ = self.ws.upgrade() 884 885 self.ws.frame_write( 886 sock, self.ws.OP_CONT, 'non-continuation payload', fin=False 887 ) 888 self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True) 889 self.check_close(sock, 1002) 890 891 # 5_14 892 893 _, sock, _ = self.ws.upgrade() 894 895 self.ws.frame_write( 896 sock, 897 self.ws.OP_CONT, 898 'non-continuation payload', 899 fin=False, 900 chopsize=1, 901 ) 902 self.ws.frame_write( 903 sock, self.ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1 904 ) 905 self.check_close(sock, 1002) 906 907 # 5_15 908 909 _, sock, _ = self.ws.upgrade() 910 911 self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 912 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True) 913 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False) 914 self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment4', fin=True) 915 self.check_close(sock, 1002) 916 917 # 5_16 918 919 _, sock, _ = self.ws.upgrade() 920 921 for i in range(0, 2): 922 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment1', fin=False) 923 self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2', fin=False) 924 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=True) 925 self.check_close(sock, 1002) 926 927 # 5_17 928 929 _, sock, _ = self.ws.upgrade() 930 931 for i in range(0, 2): 932 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment1', fin=True) 933 self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2', fin=False) 934 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=True) 935 self.check_close(sock, 1002) 936 937 # 5_18 938 939 _, sock, _ = self.ws.upgrade() 940 941 self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 942 self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2') 943 self.check_close(sock, 1002) 944 945 # 5_19 946 947 _, sock, _ = self.ws.upgrade() 948 949 self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 950 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=False) 951 self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 1!') 952 953 time.sleep(1) 954 955 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False) 956 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment4', fin=False) 957 self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 2!') 958 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment5') 959 960 frame = self.ws.frame_read(sock) 961 self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 1!') 962 963 frame = self.ws.frame_read(sock) 964 self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 2!') 965 966 self.check_frame( 967 self.ws.frame_read(sock), 968 True, 969 self.ws.OP_TEXT, 970 'fragment1fragment2fragment3fragment4fragment5', 971 ) 972 973 # 5_20 974 975 self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 976 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=False) 977 self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 1!') 978 979 frame = self.ws.frame_read(sock) 980 self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 1!') 981 982 time.sleep(1) 983 984 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False) 985 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment4', fin=False) 986 self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 2!') 987 988 frame = self.ws.frame_read(sock) 989 self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 2!') 990 991 self.assertEqual(self.recvall(sock, read_timeout=1), b'', '5_20') 992 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment5') 993 994 self.check_frame( 995 self.ws.frame_read(sock), 996 True, 997 self.ws.OP_TEXT, 998 'fragment1fragment2fragment3fragment4fragment5', 999 ) 1000 1001 self.close_connection(sock) 1002 1003 def test_java_websockets_6_1_1__6_4_4(self): 1004 self.load('websockets_mirror') 1005 1006 # 6_1_1 1007 1008 _, sock, _ = self.ws.upgrade() 1009 1010 self.ws.frame_write(sock, self.ws.OP_TEXT, '') 1011 frame = self.ws.frame_read(sock, read_timeout=3) 1012 self.check_frame(frame, True, self.ws.OP_TEXT, '') 1013 1014 # 6_1_2 1015 1016 self.ws.frame_write(sock, self.ws.OP_TEXT, '', fin=False) 1017 self.ws.frame_write(sock, self.ws.OP_CONT, '', fin=False) 1018 self.ws.frame_write(sock, self.ws.OP_CONT, '') 1019 1020 frame = self.ws.frame_read(sock, read_timeout=3) 1021 self.check_frame(frame, True, self.ws.OP_TEXT, '') 1022 1023 # 6_1_3 1024 1025 payload = 'middle frame payload' 1026 1027 self.ws.frame_write(sock, self.ws.OP_TEXT, '', fin=False) 1028 self.ws.frame_write(sock, self.ws.OP_CONT, payload, fin=False) 1029 self.ws.frame_write(sock, self.ws.OP_CONT, '') 1030 1031 frame = self.ws.frame_read(sock) 1032 self.check_frame(frame, True, self.ws.OP_TEXT, payload) 1033 1034 # 6_2_1 1035 1036 payload = 'Hello-µ@ßöäüàá-UTF-8!!' 1037 1038 self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 1039 1040 frame = self.ws.frame_read(sock) 1041 self.check_frame(frame, True, self.ws.OP_TEXT, payload) 1042 1043 # 6_2_2 1044 1045 self.ws.frame_write(sock, self.ws.OP_TEXT, payload[:12], fin=False) 1046 self.ws.frame_write(sock, self.ws.OP_CONT, payload[12:]) 1047 1048 frame = self.ws.frame_read(sock) 1049 self.check_frame(frame, True, self.ws.OP_TEXT, payload) 1050 1051 # 6_2_3 1052 1053 self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1) 1054 1055 frame = self.ws.frame_read(sock) 1056 self.check_frame(frame, True, self.ws.OP_TEXT, payload) 1057 1058 # 6_2_4 1059 1060 payload = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5' 1061 1062 self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1) 1063 1064 frame = self.ws.frame_read(sock) 1065 self.check_frame(frame, True, self.ws.OP_TEXT, payload) 1066 1067 self.close_connection(sock) 1068 1069# Unit does not support UTF-8 validation 1070# 1071# # 6_3_1 FAIL 1072# 1073# payload_1 = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5' 1074# payload_2 = '\xed\xa0\x80' 1075# payload_3 = '\x65\x64\x69\x74\x65\x64' 1076# 1077# payload = payload_1 + payload_2 + payload_3 1078# 1079# self.ws.message(sock, self.ws.OP_TEXT, payload) 1080# self.check_close(sock, 1007) 1081# 1082# # 6_3_2 FAIL 1083# 1084# _, sock, _ = self.ws.upgrade() 1085# 1086# self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1) 1087# self.check_close(sock, 1007) 1088# 1089# # 6_4_1 ... 6_4_4 FAIL 1090 1091 def test_java_websockets_7_1_1__7_5_1(self): 1092 self.load('websockets_mirror') 1093 1094 # 7_1_1 1095 1096 _, sock, _ = self.ws.upgrade() 1097 1098 payload = "Hello World!" 1099 1100 self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 1101 1102 frame = self.ws.frame_read(sock) 1103 self.check_frame(frame, True, self.ws.OP_TEXT, payload) 1104 1105 self.close_connection(sock) 1106 1107 # 7_1_2 1108 1109 _, sock, _ = self.ws.upgrade() 1110 1111 self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 1112 self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 1113 1114 self.check_close(sock) 1115 1116 # 7_1_3 1117 1118 _, sock, _ = self.ws.upgrade() 1119 1120 self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 1121 self.check_close(sock, no_close=True) 1122 1123 self.ws.frame_write(sock, self.ws.OP_PING, '') 1124 self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock') 1125 1126 sock.close() 1127 1128 # 7_1_4 1129 1130 _, sock, _ = self.ws.upgrade() 1131 1132 self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 1133 self.check_close(sock, no_close=True) 1134 1135 self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 1136 self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock') 1137 1138 sock.close() 1139 1140 # 7_1_5 1141 1142 _, sock, _ = self.ws.upgrade() 1143 1144 self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False) 1145 self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 1146 self.check_close(sock, no_close=True) 1147 1148 self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2') 1149 self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock') 1150 1151 sock.close() 1152 1153 # 7_1_6 1154 1155 _, sock, _ = self.ws.upgrade() 1156 1157 self.ws.frame_write(sock, self.ws.OP_TEXT, 'BAsd7&jh23' * 26 * 2 ** 10) 1158 self.ws.frame_write(sock, self.ws.OP_TEXT, payload) 1159 self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 1160 1161 self.recvall(sock, read_timeout=1) 1162 1163 self.ws.frame_write(sock, self.ws.OP_PING, '') 1164 self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock') 1165 1166 sock.close() 1167 1168 # 7_3_1 # FAIL 1169 1170 _, sock, _ = self.ws.upgrade() 1171 1172 self.ws.frame_write(sock, self.ws.OP_CLOSE, '') 1173 self.check_close(sock) 1174 1175 # 7_3_2 1176 1177 _, sock, _ = self.ws.upgrade() 1178 1179 self.ws.frame_write(sock, self.ws.OP_CLOSE, 'a') 1180 self.check_close(sock, 1002) 1181 1182 # 7_3_3 1183 1184 _, sock, _ = self.ws.upgrade() 1185 1186 self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close()) 1187 self.check_close(sock) 1188 1189 # 7_3_4 1190 1191 _, sock, _ = self.ws.upgrade() 1192 1193 payload = self.ws.serialize_close(reason='Hello World!') 1194 1195 self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 1196 self.check_close(sock) 1197 1198 # 7_3_5 1199 1200 _, sock, _ = self.ws.upgrade() 1201 1202 payload = self.ws.serialize_close(reason='*' * 123) 1203 1204 self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 1205 self.check_close(sock) 1206 1207 # 7_3_6 1208 1209 _, sock, _ = self.ws.upgrade() 1210 1211 payload = self.ws.serialize_close(reason='*' * 124) 1212 1213 self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 1214 self.check_close(sock, 1002) 1215 1216# # 7_5_1 FAIL Unit does not support UTF-8 validation 1217# 1218# _, sock, _ = self.ws.upgrade() 1219# 1220# payload = self.ws.serialize_close(reason = '\xce\xba\xe1\xbd\xb9\xcf' \ 1221# '\x83\xce\xbc\xce\xb5\xed\xa0\x80\x65\x64\x69\x74\x65\x64') 1222# 1223# self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 1224# self.check_close(sock, 1007) 1225 1226 def test_java_websockets_7_7_X__7_9_X(self): 1227 self.load('websockets_mirror') 1228 1229 valid_codes = [ 1230 1000, 1231 1001, 1232 1002, 1233 1003, 1234 1007, 1235 1008, 1236 1009, 1237 1010, 1238 1011, 1239 3000, 1240 3999, 1241 4000, 1242 4999, 1243 ] 1244 1245 invalid_codes = [0, 999, 1004, 1005, 1006, 1016, 1100, 2000, 2999] 1246 1247 for code in valid_codes: 1248 _, sock, _ = self.ws.upgrade() 1249 1250 payload = self.ws.serialize_close(code=code) 1251 1252 self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 1253 self.check_close(sock, code=code) 1254 1255 for code in invalid_codes: 1256 _, sock, _ = self.ws.upgrade() 1257 1258 payload = self.ws.serialize_close(code=code) 1259 1260 self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 1261 self.check_close(sock, 1002) 1262 1263 def test_java_websockets_7_13_1__7_13_2(self): 1264 self.load('websockets_mirror') 1265 1266 # 7_13_1 1267 1268 _, sock, _ = self.ws.upgrade() 1269 1270 payload = self.ws.serialize_close(code=5000) 1271 1272 self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 1273 self.check_close(sock, 1002) 1274 1275 # 7_13_2 1276 1277 _, sock, _ = self.ws.upgrade() 1278 1279 payload = struct.pack('!I', 65536) + ''.encode('utf-8') 1280 1281 self.ws.frame_write(sock, self.ws.OP_CLOSE, payload) 1282 self.check_close(sock, 1002) 1283 1284 def test_java_websockets_9_1_1__9_6_6(self): 1285 if not self.unsafe: 1286 self.skipTest("unsafe, long run") 1287 1288 self.load('websockets_mirror') 1289 1290 self.assertIn( 1291 'success', 1292 self.conf( 1293 { 1294 'http': { 1295 'websocket': { 1296 'max_frame_size': 33554432, 1297 'keepalive_interval': 0, 1298 } 1299 } 1300 }, 1301 'settings', 1302 ), 1303 'increase max_frame_size and keepalive_interval', 1304 ) 1305 1306 _, sock, _ = self.ws.upgrade() 1307 1308 op_text = self.ws.OP_TEXT 1309 op_binary = self.ws.OP_BINARY 1310 1311 def check_payload(opcode, length, chopsize=None): 1312 if opcode == self.ws.OP_TEXT: 1313 payload = '*' * length 1314 else: 1315 payload = b'*' * length 1316 1317 self.ws.frame_write(sock, opcode, payload, chopsize=chopsize) 1318 frame = self.ws.frame_read(sock) 1319 self.check_frame(frame, True, opcode, payload) 1320 1321 def check_message(opcode, f_size): 1322 if opcode == self.ws.OP_TEXT: 1323 payload = '*' * 4 * 2 ** 20 1324 else: 1325 payload = b'*' * 4 * 2 ** 20 1326 1327 self.ws.message(sock, opcode, payload, fragmention_size=f_size) 1328 frame = self.ws.frame_read(sock, read_timeout=5) 1329 self.check_frame(frame, True, opcode, payload) 1330 1331 check_payload(op_text, 64 * 2 ** 10) # 9_1_1 1332 check_payload(op_text, 256 * 2 ** 10) # 9_1_2 1333 check_payload(op_text, 2 ** 20) # 9_1_3 1334 check_payload(op_text, 4 * 2 ** 20) # 9_1_4 1335 check_payload(op_text, 8 * 2 ** 20) # 9_1_5 1336 check_payload(op_text, 16 * 2 ** 20) # 9_1_6 1337 1338 check_payload(op_binary, 64 * 2 ** 10) # 9_2_1 1339 check_payload(op_binary, 256 * 2 ** 10) # 9_2_2 1340 check_payload(op_binary, 2 ** 20) # 9_2_3 1341 check_payload(op_binary, 4 * 2 ** 20) # 9_2_4 1342 check_payload(op_binary, 8 * 2 ** 20) # 9_2_5 1343 check_payload(op_binary, 16 * 2 ** 20) # 9_2_6 1344 1345 if self.system != 'Darwin' and self.system != 'FreeBSD': 1346 check_message(op_text, 64) # 9_3_1 1347 check_message(op_text, 256) # 9_3_2 1348 check_message(op_text, 2 ** 10) # 9_3_3 1349 check_message(op_text, 4 * 2 ** 10) # 9_3_4 1350 check_message(op_text, 16 * 2 ** 10) # 9_3_5 1351 check_message(op_text, 64 * 2 ** 10) # 9_3_6 1352 check_message(op_text, 256 * 2 ** 10) # 9_3_7 1353 check_message(op_text, 2 ** 20) # 9_3_8 1354 check_message(op_text, 4 * 2 ** 20) # 9_3_9 1355 1356 check_message(op_binary, 64) # 9_4_1 1357 check_message(op_binary, 256) # 9_4_2 1358 check_message(op_binary, 2 ** 10) # 9_4_3 1359 check_message(op_binary, 4 * 2 ** 10) # 9_4_4 1360 check_message(op_binary, 16 * 2 ** 10) # 9_4_5 1361 check_message(op_binary, 64 * 2 ** 10) # 9_4_6 1362 check_message(op_binary, 256 * 2 ** 10) # 9_4_7 1363 check_message(op_binary, 2 ** 20) # 9_4_8 1364 check_message(op_binary, 4 * 2 ** 20) # 9_4_9 1365 1366 check_payload(op_text, 2 ** 20, chopsize=64) # 9_5_1 1367 check_payload(op_text, 2 ** 20, chopsize=128) # 9_5_2 1368 check_payload(op_text, 2 ** 20, chopsize=256) # 9_5_3 1369 check_payload(op_text, 2 ** 20, chopsize=512) # 9_5_4 1370 check_payload(op_text, 2 ** 20, chopsize=1024) # 9_5_5 1371 check_payload(op_text, 2 ** 20, chopsize=2048) # 9_5_6 1372 1373 check_payload(op_binary, 2 ** 20, chopsize=64) # 9_6_1 1374 check_payload(op_binary, 2 ** 20, chopsize=128) # 9_6_2 1375 check_payload(op_binary, 2 ** 20, chopsize=256) # 9_6_3 1376 check_payload(op_binary, 2 ** 20, chopsize=512) # 9_6_4 1377 check_payload(op_binary, 2 ** 20, chopsize=1024) # 9_6_5 1378 check_payload(op_binary, 2 ** 20, chopsize=2048) # 9_6_6 1379 1380 self.close_connection(sock) 1381 1382 def test_java_websockets_10_1_1(self): 1383 self.load('websockets_mirror') 1384 1385 _, sock, _ = self.ws.upgrade() 1386 1387 payload = '*' * 65536 1388 1389 self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1300) 1390 1391 frame = self.ws.message_read(sock) 1392 self.check_frame(frame, True, self.ws.OP_TEXT, payload) 1393 1394 self.close_connection(sock) 1395 1396 # settings 1397 1398 def test_java_websockets_max_frame_size(self): 1399 self.load('websockets_mirror') 1400 1401 self.assertIn( 1402 'success', 1403 self.conf( 1404 {'http': {'websocket': {'max_frame_size': 100}}}, 'settings' 1405 ), 1406 'configure max_frame_size', 1407 ) 1408 1409 _, sock, _ = self.ws.upgrade() 1410 1411 payload = '*' * 94 1412 opcode = self.ws.OP_TEXT 1413 1414 self.ws.frame_write(sock, opcode, payload) # frame length is 100 1415 1416 frame = self.ws.frame_read(sock) 1417 self.check_frame(frame, True, opcode, payload) 1418 1419 payload = '*' * 95 1420 1421 self.ws.frame_write(sock, opcode, payload) # frame length is 101 1422 self.check_close(sock, 1009) # 1009 - CLOSE_TOO_LARGE 1423 1424 def test_java_websockets_read_timeout(self): 1425 self.load('websockets_mirror') 1426 1427 self.assertIn( 1428 'success', 1429 self.conf( 1430 {'http': {'websocket': {'read_timeout': 5}}}, 'settings' 1431 ), 1432 'configure read_timeout', 1433 ) 1434 1435 _, sock, _ = self.ws.upgrade() 1436 1437 frame = self.ws.frame_to_send(self.ws.OP_TEXT, 'blah') 1438 sock.sendall(frame[:2]) 1439 1440 time.sleep(2) 1441 1442 self.check_close(sock, 1001) # 1001 - CLOSE_GOING_AWAY 1443 1444 def test_java_websockets_keepalive_interval(self): 1445 self.load('websockets_mirror') 1446 1447 self.assertIn( 1448 'success', 1449 self.conf( 1450 {'http': {'websocket': {'keepalive_interval': 5}}}, 'settings' 1451 ), 1452 'configure keepalive_interval', 1453 ) 1454 1455 _, sock, _ = self.ws.upgrade() 1456 1457 frame = self.ws.frame_to_send(self.ws.OP_TEXT, 'blah') 1458 sock.sendall(frame[:2]) 1459 1460 time.sleep(2) 1461 1462 frame = self.ws.frame_read(sock) 1463 self.check_frame(frame, True, self.ws.OP_PING, '') # PING frame 1464 1465 sock.close() 1466 1467 1468if __name__ == '__main__': 1469 TestJavaWebsockets.main() 1470