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 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
437 }); | 437 }); |
438 return sb.toString(); | 438 return sb.toString(); |
439 } | 439 } |
440 | 440 |
441 List<Cookie> _parseCookies() { | 441 List<Cookie> _parseCookies() { |
442 // Parse a Cookie header value according to the rules in RFC 6265. | 442 // Parse a Cookie header value according to the rules in RFC 6265. |
443 var cookies = new List<Cookie>(); | 443 var cookies = new List<Cookie>(); |
444 void parseCookieString(String s) { | 444 void parseCookieString(String s) { |
445 int index = 0; | 445 int index = 0; |
446 | 446 |
447 bool done() => index == s.length; | 447 bool done() => index == -1 || index == s.length; |
448 | 448 |
449 void skipWS() { | 449 void skipWS() { |
450 while (!done()) { | 450 while (!done()) { |
451 if (s[index] != " " && s[index] != "\t") return; | 451 if (s[index] != " " && s[index] != "\t") return; |
452 index++; | 452 index++; |
453 } | 453 } |
454 } | 454 } |
455 | 455 |
456 String parseName() { | 456 String parseName() { |
457 int start = index; | 457 int start = index; |
458 while (!done()) { | 458 while (!done()) { |
459 if (s[index] == " " || s[index] == "\t" || s[index] == "=") break; | 459 if (s[index] == " " || s[index] == "\t" || s[index] == "=") break; |
460 index++; | 460 index++; |
461 } | 461 } |
462 return s.substring(start, index); | 462 return s.substring(start, index); |
463 } | 463 } |
464 | 464 |
465 String parseValue() { | 465 String parseValue() { |
466 int start = index; | 466 int start = index; |
467 while (!done()) { | 467 while (!done()) { |
468 if (s[index] == " " || s[index] == "\t" || s[index] == ";") break; | 468 if (s[index] == " " || s[index] == "\t" || s[index] == ";") break; |
469 index++; | 469 index++; |
470 } | 470 } |
471 return s.substring(start, index); | 471 return s.substring(start, index); |
472 } | 472 } |
473 | 473 |
474 void expect(String expected) { | 474 bool expect(String expected) { |
475 if (done()) { | 475 if (done()) return false; |
476 throw new HttpException("Failed to parse header value [$s]"); | 476 if (s[index] != expected) return false; |
477 } | |
478 if (s[index] != expected) { | |
479 throw new HttpException("Failed to parse header value [$s]"); | |
480 } | |
481 index++; | 477 index++; |
| 478 return true; |
482 } | 479 } |
483 | 480 |
484 while (!done()) { | 481 while (!done()) { |
485 skipWS(); | 482 skipWS(); |
486 if (done()) return; | 483 if (done()) return; |
487 String name = parseName(); | 484 String name = parseName(); |
488 skipWS(); | 485 skipWS(); |
489 expect("="); | 486 if (!expect("=")) { |
| 487 index = s.indexOf(';', index); |
| 488 continue; |
| 489 } |
490 skipWS(); | 490 skipWS(); |
491 String value = parseValue(); | 491 String value = parseValue(); |
492 cookies.add(new _Cookie(name, value)); | 492 cookies.add(new _Cookie(name, value)); |
493 skipWS(); | 493 skipWS(); |
494 if (done()) return; | 494 if (done()) return; |
495 expect(";"); | 495 if (!expect(";")) { |
| 496 index = s.indexOf(';', index); |
| 497 continue; |
| 498 } |
496 } | 499 } |
497 } | 500 } |
498 List<String> values = _headers[HttpHeaders.COOKIE]; | 501 List<String> values = _headers[HttpHeaders.COOKIE]; |
499 if (values != null) { | 502 if (values != null) { |
500 values.forEach((headerValue) => parseCookieString(headerValue)); | 503 values.forEach((headerValue) => parseCookieString(headerValue)); |
501 } | 504 } |
502 return cookies; | 505 return cookies; |
503 } | 506 } |
504 } | 507 } |
505 | 508 |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
846 void clear() { | 849 void clear() { |
847 throw new UnsupportedError("Cannot modify an unmodifiable map"); | 850 throw new UnsupportedError("Cannot modify an unmodifiable map"); |
848 } | 851 } |
849 void forEach(void f(K key, V value)) => _map.forEach(f); | 852 void forEach(void f(K key, V value)) => _map.forEach(f); |
850 Iterable<K> get keys => _map.keys; | 853 Iterable<K> get keys => _map.keys; |
851 Iterable<V> get values => _map.values; | 854 Iterable<V> get values => _map.values; |
852 int get length => _map.length; | 855 int get length => _map.length; |
853 bool get isEmpty => _map.isEmpty; | 856 bool get isEmpty => _map.isEmpty; |
854 bool get isNotEmpty => _map.isNotEmpty; | 857 bool get isNotEmpty => _map.isNotEmpty; |
855 } | 858 } |
OLD | NEW |