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 class _HttpHeaders implements HttpHeaders { | 7 class _HttpHeaders implements HttpHeaders { |
8 final Map<String, List<String>> _headers; | 8 final Map<String, List<String>> _headers; |
9 final String protocolVersion; | 9 final String protocolVersion; |
10 | 10 |
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
458 _noFoldingHeaders.indexOf(name) != -1)) { | 458 _noFoldingHeaders.indexOf(name) != -1)) { |
459 return false; | 459 return false; |
460 } | 460 } |
461 return true; | 461 return true; |
462 } | 462 } |
463 | 463 |
464 void _finalize() { | 464 void _finalize() { |
465 _mutable = false; | 465 _mutable = false; |
466 } | 466 } |
467 | 467 |
468 void _build(BytesBuilder builder) { | 468 int _write(Uint8List buffer, int offset) { |
| 469 void write(List<int> bytes) { |
| 470 int len = bytes.length; |
| 471 for (int i = 0; i < len; i++) { |
| 472 buffer[offset + i] = bytes[i]; |
| 473 } |
| 474 offset += len; |
| 475 } |
| 476 |
| 477 // Format headers. |
469 for (String name in _headers.keys) { | 478 for (String name in _headers.keys) { |
470 List<String> values = _headers[name]; | 479 List<String> values = _headers[name]; |
471 bool fold = _foldHeader(name); | 480 bool fold = _foldHeader(name); |
472 var nameData = name.codeUnits; | 481 var nameData = name.codeUnits; |
473 builder.add(nameData); | 482 write(nameData); |
474 builder.addByte(_CharCode.COLON); | 483 buffer[offset++] = _CharCode.COLON; |
475 builder.addByte(_CharCode.SP); | 484 buffer[offset++] = _CharCode.SP; |
476 for (int i = 0; i < values.length; i++) { | 485 for (int i = 0; i < values.length; i++) { |
477 if (i > 0) { | 486 if (i > 0) { |
478 if (fold) { | 487 if (fold) { |
479 builder.addByte(_CharCode.COMMA); | 488 buffer[offset++] = _CharCode.COMMA; |
480 builder.addByte(_CharCode.SP); | 489 buffer[offset++] = _CharCode.SP; |
481 } else { | 490 } else { |
482 builder.addByte(_CharCode.CR); | 491 buffer[offset++] = _CharCode.CR; |
483 builder.addByte(_CharCode.LF); | 492 buffer[offset++] = _CharCode.LF; |
484 builder.add(nameData); | 493 write(nameData); |
485 builder.addByte(_CharCode.COLON); | 494 buffer[offset++] = _CharCode.COLON; |
486 builder.addByte(_CharCode.SP); | 495 buffer[offset++] = _CharCode.SP; |
487 } | 496 } |
488 } | 497 } |
489 builder.add(values[i].codeUnits); | 498 write(values[i].codeUnits); |
490 } | 499 } |
491 builder.addByte(_CharCode.CR); | 500 buffer[offset++] = _CharCode.CR; |
492 builder.addByte(_CharCode.LF); | 501 buffer[offset++] = _CharCode.LF; |
493 } | 502 } |
| 503 return offset; |
494 } | 504 } |
495 | 505 |
496 String toString() { | 506 String toString() { |
497 StringBuffer sb = new StringBuffer(); | 507 StringBuffer sb = new StringBuffer(); |
498 _headers.forEach((String name, List<String> values) { | 508 _headers.forEach((String name, List<String> values) { |
499 sb..write(name)..write(": "); | 509 sb..write(name)..write(": "); |
500 bool fold = _foldHeader(name); | 510 bool fold = _foldHeader(name); |
501 for (int i = 0; i < values.length; i++) { | 511 for (int i = 0; i < values.length; i++) { |
502 if (i > 0) { | 512 if (i > 0) { |
503 if (fold) { | 513 if (fold) { |
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
980 (codeUnit >= 0x23 && codeUnit <= 0x2B) || | 990 (codeUnit >= 0x23 && codeUnit <= 0x2B) || |
981 (codeUnit >= 0x2D && codeUnit <= 0x3A) || | 991 (codeUnit >= 0x2D && codeUnit <= 0x3A) || |
982 (codeUnit >= 0x3C && codeUnit <= 0x5B) || | 992 (codeUnit >= 0x3C && codeUnit <= 0x5B) || |
983 (codeUnit >= 0x5D && codeUnit <= 0x7E))) { | 993 (codeUnit >= 0x5D && codeUnit <= 0x7E))) { |
984 throw new FormatException( | 994 throw new FormatException( |
985 "Invalid character in cookie value, code unit: '$codeUnit'"); | 995 "Invalid character in cookie value, code unit: '$codeUnit'"); |
986 } | 996 } |
987 } | 997 } |
988 } | 998 } |
989 } | 999 } |
OLD | NEW |