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