OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of dart.io; | 5 part of dart.io; |
6 | 6 |
7 const String _webSocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; | 7 const String _webSocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; |
8 const String _clientNoContextTakeover = "client_no_context_takeover"; | 8 const String _clientNoContextTakeover = "client_no_context_takeover"; |
9 const String _serverNoContextTakeover = "server_no_context_takeover"; | 9 const String _serverNoContextTakeover = "server_no_context_takeover"; |
10 const String _clientMaxWindowBits = "client_max_window_bits"; | 10 const String _clientMaxWindowBits = "client_max_window_bits"; |
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 var extensionHeader = request.headers.value("Sec-WebSocket-Extensions"); | 474 var extensionHeader = request.headers.value("Sec-WebSocket-Extensions"); |
475 | 475 |
476 extensionHeader ??= ""; | 476 extensionHeader ??= ""; |
477 | 477 |
478 var hv = HeaderValue.parse(extensionHeader, valueSeparator: ','); | 478 var hv = HeaderValue.parse(extensionHeader, valueSeparator: ','); |
479 if (compression.enabled && hv.value == _WebSocketImpl.PER_MESSAGE_DEFLATE) { | 479 if (compression.enabled && hv.value == _WebSocketImpl.PER_MESSAGE_DEFLATE) { |
480 var info = compression._createHeader(hv); | 480 var info = compression._createHeader(hv); |
481 | 481 |
482 response.headers.add("Sec-WebSocket-Extensions", info.headerValue); | 482 response.headers.add("Sec-WebSocket-Extensions", info.headerValue); |
483 var serverNoContextTakeover = | 483 var serverNoContextTakeover = |
484 hv.parameters.containsKey(_serverNoContextTakeover); | 484 (hv.parameters.containsKey(_serverNoContextTakeover) && |
| 485 compression.serverNoContextTakeover); |
485 var clientNoContextTakeover = | 486 var clientNoContextTakeover = |
486 hv.parameters.containsKey(_clientNoContextTakeover); | 487 (hv.parameters.containsKey(_clientNoContextTakeover) && |
| 488 compression.clientNoContextTakeover); |
487 var deflate = new _WebSocketPerMessageDeflate( | 489 var deflate = new _WebSocketPerMessageDeflate( |
488 serverNoContextTakeover: serverNoContextTakeover, | 490 serverNoContextTakeover: serverNoContextTakeover, |
489 clientNoContextTakeover: clientNoContextTakeover, | 491 clientNoContextTakeover: clientNoContextTakeover, |
490 serverMaxWindowBits: info.maxWindowBits, | 492 serverMaxWindowBits: info.maxWindowBits, |
491 clientMaxWindowBits: info.maxWindowBits, | 493 clientMaxWindowBits: info.maxWindowBits, |
492 serverSide: true); | 494 serverSide: true); |
493 | 495 |
494 return deflate; | 496 return deflate; |
495 } | 497 } |
496 | 498 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
570 data.addAll(const [0x00, 0x00, 0xff, 0xff]); | 572 data.addAll(const [0x00, 0x00, 0xff, 0xff]); |
571 | 573 |
572 decoder.process(data, 0, data.length); | 574 decoder.process(data, 0, data.length); |
573 var result = []; | 575 var result = []; |
574 var out; | 576 var out; |
575 | 577 |
576 while ((out = decoder.processed()) != null) { | 578 while ((out = decoder.processed()) != null) { |
577 result.addAll(out); | 579 result.addAll(out); |
578 } | 580 } |
579 | 581 |
| 582 if ((serverSide && clientNoContextTakeover) || |
| 583 (!serverSide && serverNoContextTakeover)) { |
| 584 decoder.end(); |
| 585 decoder = null; |
| 586 } |
| 587 |
580 return new Uint8List.fromList(result); | 588 return new Uint8List.fromList(result); |
581 } | 589 } |
582 | 590 |
583 List<int> processOutgoingMessage(List<int> msg) { | 591 List<int> processOutgoingMessage(List<int> msg) { |
584 _ensureEncoder(); | 592 _ensureEncoder(); |
585 var result = []; | 593 var result = []; |
586 Uint8List buffer; | 594 Uint8List buffer; |
587 var out; | 595 var out; |
588 | 596 |
589 if (msg is! Uint8List) { | 597 if (msg is! Uint8List) { |
590 for (var i = 0; i < msg.length; i++) { | 598 for (var i = 0; i < msg.length; i++) { |
591 if (msg[i] < 0 || 255 < msg[i]) { | 599 if (msg[i] < 0 || 255 < msg[i]) { |
592 throw new ArgumentError("List element is not a byte value " | 600 throw new ArgumentError("List element is not a byte value " |
593 "(value ${msg[i]} at index $i)"); | 601 "(value ${msg[i]} at index $i)"); |
594 } | 602 } |
595 } | 603 } |
596 buffer = new Uint8List.fromList(msg); | 604 buffer = new Uint8List.fromList(msg); |
597 } else { | 605 } else { |
598 buffer = msg; | 606 buffer = msg; |
599 } | 607 } |
600 | 608 |
601 encoder.process(buffer, 0, buffer.length); | 609 encoder.process(buffer, 0, buffer.length); |
602 | 610 |
603 while ((out = encoder.processed()) != null) { | 611 while ((out = encoder.processed()) != null) { |
604 result.addAll(out); | 612 result.addAll(out); |
605 } | 613 } |
606 | 614 |
607 if (!serverSide && clientNoContextTakeover) { | 615 if ((!serverSide && clientNoContextTakeover) || |
| 616 (serverSide && serverNoContextTakeover)) { |
608 encoder.end(); | 617 encoder.end(); |
609 encoder = null; | 618 encoder = null; |
610 } | 619 } |
611 | 620 |
612 if (result.length > 4) { | 621 if (result.length > 4) { |
613 result = result.sublist(0, result.length - 4); | 622 result = result.sublist(0, result.length - 4); |
614 } | 623 } |
615 | 624 |
616 return result; | 625 return result; |
617 } | 626 } |
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1234 return code != null && | 1243 return code != null && |
1235 (code < WebSocketStatus.NORMAL_CLOSURE || | 1244 (code < WebSocketStatus.NORMAL_CLOSURE || |
1236 code == WebSocketStatus.RESERVED_1004 || | 1245 code == WebSocketStatus.RESERVED_1004 || |
1237 code == WebSocketStatus.NO_STATUS_RECEIVED || | 1246 code == WebSocketStatus.NO_STATUS_RECEIVED || |
1238 code == WebSocketStatus.ABNORMAL_CLOSURE || | 1247 code == WebSocketStatus.ABNORMAL_CLOSURE || |
1239 (code > WebSocketStatus.INTERNAL_SERVER_ERROR && | 1248 (code > WebSocketStatus.INTERNAL_SERVER_ERROR && |
1240 code < WebSocketStatus.RESERVED_1015) || | 1249 code < WebSocketStatus.RESERVED_1015) || |
1241 (code >= WebSocketStatus.RESERVED_1015 && code < 3000)); | 1250 (code >= WebSocketStatus.RESERVED_1015 && code < 3000)); |
1242 } | 1251 } |
1243 } | 1252 } |
OLD | NEW |