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

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

Issue 12655003: Buffer the entire http header to one packet, and buffer other data in chunks of 4-16 kb. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 9 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/buffer_list.dart ('k') | sdk/lib/io/http_impl.dart » ('j') | 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 class _HttpHeaders implements HttpHeaders { 7 class _HttpHeaders implements HttpHeaders {
8 _HttpHeaders(String this.protocolVersion) 8 _HttpHeaders(String this.protocolVersion)
9 : _headers = new Map<String, List<String>>(); 9 : _headers = new Map<String, List<String>>();
10 10
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 protocolVersion == "1.1") { 337 protocolVersion == "1.1") {
338 contentLength = -1; 338 contentLength = -1;
339 } 339 }
340 } 340 }
341 341
342 void _finalize() { 342 void _finalize() {
343 _synchronize(); 343 _synchronize();
344 _mutable = false; 344 _mutable = false;
345 } 345 }
346 346
347 _write(IOSink sink) { 347 _write(_BufferList buffer) {
348 final COLONSP = const [_CharCode.COLON, _CharCode.SP]; 348 final COLONSP = const [_CharCode.COLON, _CharCode.SP];
349 final COMMASP = const [_CharCode.COMMA, _CharCode.SP]; 349 final COMMASP = const [_CharCode.COMMA, _CharCode.SP];
350 final CRLF = const [_CharCode.CR, _CharCode.LF]; 350 final CRLF = const [_CharCode.CR, _CharCode.LF];
351 351
352 var bufferSize = 16 * 1024;
353 var buffer = new Uint8List(bufferSize);
354 var bufferPos = 0;
355
356 void writeBuffer() {
357 sink.writeBytes(buffer.getRange(0, bufferPos));
358 bufferPos = 0;
359 }
360
361 // Format headers. 352 // Format headers.
362 _headers.forEach((String name, List<String> values) { 353 _headers.forEach((String name, List<String> values) {
363 bool fold = _foldHeader(name); 354 bool fold = _foldHeader(name);
364 List<int> nameData; 355 var nameData = name.codeUnits;
365 nameData = name.codeUnits; 356 buffer.add(nameData);
366 int nameDataLen = nameData.length; 357 buffer.add(const [_CharCode.COLON, _CharCode.SP]);
367 if (nameDataLen + 2 > bufferSize - bufferPos) writeBuffer();
368 buffer.setRange(bufferPos, nameDataLen, nameData);
369 bufferPos += nameDataLen;
370 buffer[bufferPos++] = _CharCode.COLON;
371 buffer[bufferPos++] = _CharCode.SP;
372 for (int i = 0; i < values.length; i++) { 358 for (int i = 0; i < values.length; i++) {
373 List<int> data = values[i].codeUnits;
374 int dataLen = data.length;
375 // Worst case here is writing the name, value and 6 additional bytes.
376 if (nameDataLen + dataLen + 6 > bufferSize - bufferPos) writeBuffer();
377 if (i > 0) { 359 if (i > 0) {
378 if (fold) { 360 if (fold) {
379 buffer[bufferPos++] = _CharCode.COMMA; 361 buffer.add(const [_CharCode.COMMA, _CharCode.SP]);
380 buffer[bufferPos++] = _CharCode.SP;
381 } else { 362 } else {
382 buffer[bufferPos++] = _CharCode.CR; 363 buffer.add(const [_CharCode.CR, _CharCode.LF]);
383 buffer[bufferPos++] = _CharCode.LF; 364 buffer.add(nameData);
384 buffer.setRange(bufferPos, nameDataLen, nameData); 365 buffer.add(const [_CharCode.COLON, _CharCode.SP]);
385 bufferPos += nameDataLen;
386 buffer[bufferPos++] = _CharCode.COLON;
387 buffer[bufferPos++] = _CharCode.SP;
388 } 366 }
389 } 367 }
390 buffer.setRange(bufferPos, dataLen, data); 368 buffer.add(values[i].codeUnits);
391 bufferPos += dataLen;
392 } 369 }
393 buffer[bufferPos++] = _CharCode.CR; 370 buffer.add(const [_CharCode.CR, _CharCode.LF]);
394 buffer[bufferPos++] = _CharCode.LF;
395 }); 371 });
396 writeBuffer();
397 } 372 }
398 373
399 String toString() { 374 String toString() {
400 StringBuffer sb = new StringBuffer(); 375 StringBuffer sb = new StringBuffer();
401 _headers.forEach((String name, List<String> values) { 376 _headers.forEach((String name, List<String> values) {
402 sb.write(name); 377 sb.write(name);
403 sb.write(": "); 378 sb.write(": ");
404 bool fold = _foldHeader(name); 379 bool fold = _foldHeader(name);
405 for (int i = 0; i < values.length; i++) { 380 for (int i = 0; i < values.length; i++) {
406 if (i > 0) { 381 if (i > 0) {
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
787 762
788 String name; 763 String name;
789 String value; 764 String value;
790 DateTime expires; 765 DateTime expires;
791 int maxAge; 766 int maxAge;
792 String domain; 767 String domain;
793 String path; 768 String path;
794 bool httpOnly = false; 769 bool httpOnly = false;
795 bool secure = false; 770 bool secure = false;
796 } 771 }
OLDNEW
« no previous file with comments | « sdk/lib/io/buffer_list.dart ('k') | sdk/lib/io/http_impl.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698