| 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 |