| 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 |
| 11 bool _mutable = true; // Are the headers currently mutable? | 11 bool _mutable = true; // Are the headers currently mutable? |
| 12 List<String> _noFoldingHeaders; | 12 List<String> _noFoldingHeaders; |
| 13 | 13 |
| 14 int _contentLength = -1; | 14 int _contentLength = -1; |
| 15 bool _persistentConnection = true; | 15 bool _persistentConnection = true; |
| 16 bool _chunkedTransferEncoding = false; | 16 bool _chunkedTransferEncoding = false; |
| 17 String _host; | 17 String _host; |
| 18 int _port; | 18 int _port; |
| 19 | 19 |
| 20 final int _defaultPortForScheme; | 20 final int _defaultPortForScheme; |
| 21 | 21 |
| 22 _HttpHeaders(this.protocolVersion, | 22 _HttpHeaders(this.protocolVersion, |
| 23 {int defaultPortForScheme: HttpClient.DEFAULT_HTTP_PORT}) | 23 {int defaultPortForScheme: HttpClient.DEFAULT_HTTP_PORT, |
| 24 _HttpHeaders initialHeaders}) |
| 24 : _headers = new HashMap<String, List<String>>(), | 25 : _headers = new HashMap<String, List<String>>(), |
| 25 _defaultPortForScheme = defaultPortForScheme { | 26 _defaultPortForScheme = defaultPortForScheme { |
| 27 if (initialHeaders != null) { |
| 28 initialHeaders._headers.forEach((name, value) => _headers[name] = value); |
| 29 _contentLength = initialHeaders._contentLength; |
| 30 _persistentConnection = initialHeaders._persistentConnection; |
| 31 _chunkedTransferEncoding = initialHeaders._chunkedTransferEncoding; |
| 32 _host = initialHeaders._host; |
| 33 _port = initialHeaders._port; |
| 34 } |
| 26 if (protocolVersion == "1.0") { | 35 if (protocolVersion == "1.0") { |
| 27 _persistentConnection = false; | 36 _persistentConnection = false; |
| 37 _chunkedTransferEncoding = false; |
| 28 } | 38 } |
| 29 } | 39 } |
| 30 | 40 |
| 31 List<String> operator[](String name) => _headers[name.toLowerCase()]; | 41 List<String> operator[](String name) => _headers[name.toLowerCase()]; |
| 32 | 42 |
| 33 String value(String name) { | 43 String value(String name) { |
| 34 name = name.toLowerCase(); | 44 name = name.toLowerCase(); |
| 35 List<String> values = _headers[name]; | 45 List<String> values = _headers[name]; |
| 36 if (values == null) return null; | 46 if (values == null) return null; |
| 37 if (values.length > 1) { | 47 if (values.length > 1) { |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 } else { | 255 } else { |
| 246 return null; | 256 return null; |
| 247 } | 257 } |
| 248 } | 258 } |
| 249 | 259 |
| 250 void set contentType(ContentType contentType) { | 260 void set contentType(ContentType contentType) { |
| 251 _checkMutable(); | 261 _checkMutable(); |
| 252 _set(HttpHeaders.CONTENT_TYPE, contentType.toString()); | 262 _set(HttpHeaders.CONTENT_TYPE, contentType.toString()); |
| 253 } | 263 } |
| 254 | 264 |
| 265 void clear() { |
| 266 _checkMutable(); |
| 267 _headers.clear(); |
| 268 _contentLength = -1; |
| 269 _persistentConnection = true; |
| 270 _chunkedTransferEncoding = false; |
| 271 _host = null; |
| 272 _port = null; |
| 273 } |
| 274 |
| 255 // [name] must be a lower-case version of the name. | 275 // [name] must be a lower-case version of the name. |
| 256 void _add(String name, value) { | 276 void _add(String name, value) { |
| 257 assert(name == _validateField(name)); | 277 assert(name == _validateField(name)); |
| 258 // Use the length as index on what method to call. This is notable | 278 // Use the length as index on what method to call. This is notable |
| 259 // faster than computing hash and looking up in a hash-map. | 279 // faster than computing hash and looking up in a hash-map. |
| 260 switch (name.length) { | 280 switch (name.length) { |
| 261 case 4: | 281 case 4: |
| 262 if (HttpHeaders.DATE == name) { | 282 if (HttpHeaders.DATE == name) { |
| 263 _addDate(name, value); | 283 _addDate(name, value); |
| 264 return; | 284 return; |
| (...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 794 String name; | 814 String name; |
| 795 String value; | 815 String value; |
| 796 DateTime expires; | 816 DateTime expires; |
| 797 int maxAge; | 817 int maxAge; |
| 798 String domain; | 818 String domain; |
| 799 String path; | 819 String path; |
| 800 bool httpOnly = false; | 820 bool httpOnly = false; |
| 801 bool secure = false; | 821 bool secure = false; |
| 802 | 822 |
| 803 _Cookie([this.name, this.value]) { | 823 _Cookie([this.name, this.value]) { |
| 824 // Default value of httponly is true. |
| 825 httpOnly = true; |
| 804 _validate(); | 826 _validate(); |
| 805 } | 827 } |
| 806 | 828 |
| 807 _Cookie.fromSetCookieValue(String value) { | 829 _Cookie.fromSetCookieValue(String value) { |
| 808 // Parse the 'set-cookie' header value. | 830 // Parse the 'set-cookie' header value. |
| 809 _parseSetCookieValue(value); | 831 _parseSetCookieValue(value); |
| 810 } | 832 } |
| 811 | 833 |
| 812 // Parse a 'set-cookie' header value according to the rules in RFC 6265. | 834 // Parse a 'set-cookie' header value according to the rules in RFC 6265. |
| 813 void _parseSetCookieValue(String s) { | 835 void _parseSetCookieValue(String s) { |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 935 (codeUnit >= 0x23 && codeUnit <= 0x2B) || | 957 (codeUnit >= 0x23 && codeUnit <= 0x2B) || |
| 936 (codeUnit >= 0x2D && codeUnit <= 0x3A) || | 958 (codeUnit >= 0x2D && codeUnit <= 0x3A) || |
| 937 (codeUnit >= 0x3C && codeUnit <= 0x5B) || | 959 (codeUnit >= 0x3C && codeUnit <= 0x5B) || |
| 938 (codeUnit >= 0x5D && codeUnit <= 0x7E))) { | 960 (codeUnit >= 0x5D && codeUnit <= 0x7E))) { |
| 939 throw new FormatException( | 961 throw new FormatException( |
| 940 "Invalid character in cookie value, code unit: '$codeUnit'"); | 962 "Invalid character in cookie value, code unit: '$codeUnit'"); |
| 941 } | 963 } |
| 942 } | 964 } |
| 943 } | 965 } |
| 944 } | 966 } |
| OLD | NEW |