Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Side by Side Diff: sdk/lib/io/websocket_impl.dart

Issue 218493012: Make non-copying version of BytesBuidler and make file-reads faster. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « sdk/lib/io/file_impl.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 8
9 // Matches _WebSocketOpcode. 9 // Matches _WebSocketOpcode.
10 class _WebSocketMessageType { 10 class _WebSocketMessageType {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 int _remainingPayloadBytes = -1; 62 int _remainingPayloadBytes = -1;
63 int _unmaskingIndex = 0; 63 int _unmaskingIndex = 0;
64 int _currentMessageType = _WebSocketMessageType.NONE; 64 int _currentMessageType = _WebSocketMessageType.NONE;
65 int closeCode = WebSocketStatus.NO_STATUS_RECEIVED; 65 int closeCode = WebSocketStatus.NO_STATUS_RECEIVED;
66 String closeReason = ""; 66 String closeReason = "";
67 67
68 EventSink _eventSink; 68 EventSink _eventSink;
69 69
70 final bool _serverSide; 70 final bool _serverSide;
71 final List _maskingBytes = new List(4); 71 final List _maskingBytes = new List(4);
72 final List<Uint8List> _payloads = new List<Uint8List>(); 72 final BytesBuilder _payload = new BytesBuilder(copy: false);
73 73
74 _WebSocketProtocolTransformer([this._serverSide = false]); 74 _WebSocketProtocolTransformer([this._serverSide = false]);
75 75
76 Stream bind(Stream stream) { 76 Stream bind(Stream stream) {
77 return new Stream.eventTransformed( 77 return new Stream.eventTransformed(
78 stream, 78 stream,
79 (EventSink eventSink) { 79 (EventSink eventSink) {
80 if (_eventSink != null) { 80 if (_eventSink != null) {
81 throw new StateError("WebSocket transformer already used."); 81 throw new StateError("WebSocket transformer already used.");
82 } 82 }
83 _eventSink = eventSink; 83 _eventSink = eventSink;
84 return this; 84 return this;
85 }); 85 });
86 } 86 }
87 87
88 void addError(Object error, [StackTrace stackTrace]) => 88 void addError(Object error, [StackTrace stackTrace]) =>
89 _eventSink.addError(error, stackTrace); 89 _eventSink.addError(error, stackTrace);
90 90
91 void close() => _eventSink.close(); 91 void close() => _eventSink.close();
92 92
93 Uint8List _takePayload() {
94 if (_payloads.length == 0) return new Uint8List(0);
95 if (_payloads.length == 1) {
96 Uint8List result = _payloads.single;
97 _payloads.clear();
98 return result;
99 }
100 int length = 0;
101 for (Uint8List payload in _payloads) {
102 length += payload.length;
103 }
104 Uint8List result = new Uint8List(length);
105 int offset = 0;
106 for (Uint8List payload in _payloads) {
107 result.setRange(offset, offset + payload.length, payload);
108 offset += payload.length;
109 }
110 _payloads.clear();
111 return result;
112 }
113
114 /** 93 /**
115 * Process data received from the underlying communication channel. 94 * Process data received from the underlying communication channel.
116 */ 95 */
117 void add(Uint8List buffer) { 96 void add(Uint8List buffer) {
118 int count = buffer.length; 97 int count = buffer.length;
119 int index = 0; 98 int index = 0;
120 int lastIndex = count; 99 int lastIndex = count;
121 if (_state == CLOSED) { 100 if (_state == CLOSED) {
122 throw new WebSocketException("Data on closed connection"); 101 throw new WebSocketException("Data on closed connection");
123 } 102 }
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 } else { 169 } else {
191 assert(_state == PAYLOAD); 170 assert(_state == PAYLOAD);
192 // The payload is not handled one byte at a time but in blocks. 171 // The payload is not handled one byte at a time but in blocks.
193 int payloadLength = min(lastIndex - index, _remainingPayloadBytes); 172 int payloadLength = min(lastIndex - index, _remainingPayloadBytes);
194 _remainingPayloadBytes -= payloadLength; 173 _remainingPayloadBytes -= payloadLength;
195 // Unmask payload if masked. 174 // Unmask payload if masked.
196 if (_masked) { 175 if (_masked) {
197 _unmask(index, payloadLength, buffer); 176 _unmask(index, payloadLength, buffer);
198 } 177 }
199 // Control frame and data frame share _payloads. 178 // Control frame and data frame share _payloads.
200 _payloads.add( 179 _payload.add(
201 new Uint8List.view(buffer.buffer, index, payloadLength)); 180 new Uint8List.view(buffer.buffer, index, payloadLength));
202 index += payloadLength; 181 index += payloadLength;
203 if (_isControlFrame()) { 182 if (_isControlFrame()) {
204 if (_remainingPayloadBytes == 0) _controlFrameEnd(); 183 if (_remainingPayloadBytes == 0) _controlFrameEnd();
205 } else { 184 } else {
206 if (_currentMessageType != _WebSocketMessageType.TEXT && 185 if (_currentMessageType != _WebSocketMessageType.TEXT &&
207 _currentMessageType != _WebSocketMessageType.BINARY) { 186 _currentMessageType != _WebSocketMessageType.BINARY) {
208 throw new WebSocketException("Protocol error"); 187 throw new WebSocketException("Protocol error");
209 } 188 }
210 if (_remainingPayloadBytes == 0) _messageFrameEnd(); 189 if (_remainingPayloadBytes == 0) _messageFrameEnd();
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 } 279 }
301 } else { 280 } else {
302 _state = PAYLOAD; 281 _state = PAYLOAD;
303 } 282 }
304 } 283 }
305 284
306 void _messageFrameEnd() { 285 void _messageFrameEnd() {
307 if (_fin) { 286 if (_fin) {
308 switch (_currentMessageType) { 287 switch (_currentMessageType) {
309 case _WebSocketMessageType.TEXT: 288 case _WebSocketMessageType.TEXT:
310 _eventSink.add(UTF8.decode(_takePayload())); 289 _eventSink.add(UTF8.decode(_payload.takeBytes()));
311 break; 290 break;
312 case _WebSocketMessageType.BINARY: 291 case _WebSocketMessageType.BINARY:
313 _eventSink.add(_takePayload()); 292 _eventSink.add(_payload.takeBytes());
314 break; 293 break;
315 } 294 }
316 _currentMessageType = _WebSocketMessageType.NONE; 295 _currentMessageType = _WebSocketMessageType.NONE;
317 } 296 }
318 _prepareForNextFrame(); 297 _prepareForNextFrame();
319 } 298 }
320 299
321 void _controlFrameEnd() { 300 void _controlFrameEnd() {
322 switch (_opcode) { 301 switch (_opcode) {
323 case _WebSocketOpcode.CLOSE: 302 case _WebSocketOpcode.CLOSE:
324 closeCode = WebSocketStatus.NO_STATUS_RECEIVED; 303 closeCode = WebSocketStatus.NO_STATUS_RECEIVED;
325 var payload = _takePayload(); 304 var payload = _payload.takeBytes();
326 if (payload.length > 0) { 305 if (payload.length > 0) {
327 if (payload.length == 1) { 306 if (payload.length == 1) {
328 throw new WebSocketException("Protocol error"); 307 throw new WebSocketException("Protocol error");
329 } 308 }
330 closeCode = payload[0] << 8 | payload[1]; 309 closeCode = payload[0] << 8 | payload[1];
331 if (closeCode == WebSocketStatus.NO_STATUS_RECEIVED) { 310 if (closeCode == WebSocketStatus.NO_STATUS_RECEIVED) {
332 throw new WebSocketException("Protocol error"); 311 throw new WebSocketException("Protocol error");
333 } 312 }
334 if (payload.length > 2) { 313 if (payload.length > 2) {
335 closeReason = UTF8.decode(payload.sublist(2)); 314 closeReason = UTF8.decode(payload.sublist(2));
336 } 315 }
337 } 316 }
338 _state = CLOSED; 317 _state = CLOSED;
339 _eventSink.close(); 318 _eventSink.close();
340 break; 319 break;
341 320
342 case _WebSocketOpcode.PING: 321 case _WebSocketOpcode.PING:
343 _eventSink.add(new _WebSocketPing(_takePayload())); 322 _eventSink.add(new _WebSocketPing(_payload.takeBytes()));
344 break; 323 break;
345 324
346 case _WebSocketOpcode.PONG: 325 case _WebSocketOpcode.PONG:
347 _eventSink.add(new _WebSocketPong(_takePayload())); 326 _eventSink.add(new _WebSocketPong(_payload.takeBytes()));
348 break; 327 break;
349 } 328 }
350 _prepareForNextFrame(); 329 _prepareForNextFrame();
351 } 330 }
352 331
353 bool _isControlFrame() { 332 bool _isControlFrame() {
354 return _opcode == _WebSocketOpcode.CLOSE || 333 return _opcode == _WebSocketOpcode.CLOSE ||
355 _opcode == _WebSocketOpcode.PING || 334 _opcode == _WebSocketOpcode.PING ||
356 _opcode == _WebSocketOpcode.PONG; 335 _opcode == _WebSocketOpcode.PONG;
357 } 336 }
(...skipping 627 matching lines...) Expand 10 before | Expand all | Expand 10 after
985 (code < WebSocketStatus.NORMAL_CLOSURE || 964 (code < WebSocketStatus.NORMAL_CLOSURE ||
986 code == WebSocketStatus.RESERVED_1004 || 965 code == WebSocketStatus.RESERVED_1004 ||
987 code == WebSocketStatus.NO_STATUS_RECEIVED || 966 code == WebSocketStatus.NO_STATUS_RECEIVED ||
988 code == WebSocketStatus.ABNORMAL_CLOSURE || 967 code == WebSocketStatus.ABNORMAL_CLOSURE ||
989 (code > WebSocketStatus.INTERNAL_SERVER_ERROR && 968 (code > WebSocketStatus.INTERNAL_SERVER_ERROR &&
990 code < WebSocketStatus.RESERVED_1015) || 969 code < WebSocketStatus.RESERVED_1015) ||
991 (code >= WebSocketStatus.RESERVED_1015 && 970 (code >= WebSocketStatus.RESERVED_1015 &&
992 code < 3000)); 971 code < 3000));
993 } 972 }
994 } 973 }
OLDNEW
« no previous file with comments | « sdk/lib/io/file_impl.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698