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

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

Issue 59703010: Don't create lower-case copies of already lower-case header names, in http parser. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 1 month 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 | « no previous file | sdk/lib/io/http_parser.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
11 List<String> operator[](String name) { 11 List<String> operator[](String name) {
12 name = name.toLowerCase(); 12 name = name.toLowerCase();
13 return _headers[name]; 13 return _headers[name];
14 } 14 }
15 15
16 String value(String name) { 16 String value(String name) {
17 name = name.toLowerCase(); 17 name = name.toLowerCase();
18 List<String> values = _headers[name]; 18 List<String> values = _headers[name];
19 if (values == null) return null; 19 if (values == null) return null;
20 if (values.length > 1) { 20 if (values.length > 1) {
21 throw new HttpException("More than one value for header $name"); 21 throw new HttpException("More than one value for header $name");
22 } 22 }
23 return values[0]; 23 return values[0];
24 } 24 }
25 25
26 void add(String name, value) { 26 void add(String name, value) {
27 _checkMutable(); 27 _checkMutable();
28 var lowerCaseName = name.toLowerCase();
28 if (value is List) { 29 if (value is List) {
29 for (int i = 0; i < value.length; i++) { 30 for (int i = 0; i < value.length; i++) {
30 _add(name, value[i]); 31 _add(lowerCaseName, value[i]);
31 } 32 }
32 } else { 33 } else {
33 _add(name, value); 34 _add(lowerCaseName, value);
34 } 35 }
35 } 36 }
36 37
37 void set(String name, Object value) { 38 void set(String name, Object value) {
38 name = name.toLowerCase(); 39 name = name.toLowerCase();
39 _checkMutable(); 40 _checkMutable();
40 removeAll(name); 41 removeAll(name);
41 add(name, value); 42 add(name, value);
42 } 43 }
43 44
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 } else { 201 } else {
201 return null; 202 return null;
202 } 203 }
203 } 204 }
204 205
205 void set contentType(ContentType contentType) { 206 void set contentType(ContentType contentType) {
206 _checkMutable(); 207 _checkMutable();
207 _set(HttpHeaders.CONTENT_TYPE, contentType.toString()); 208 _set(HttpHeaders.CONTENT_TYPE, contentType.toString());
208 } 209 }
209 210
211 // [name] must be a lower-case version of the name.
210 void _add(String name, value) { 212 void _add(String name, value) {
211 var lowerCaseName = name.toLowerCase();
212 // TODO(sgjesse): Add immutable state throw HttpException is immutable. 213 // TODO(sgjesse): Add immutable state throw HttpException is immutable.
213 if (lowerCaseName == HttpHeaders.CONTENT_LENGTH) { 214 if (name == HttpHeaders.CONTENT_LENGTH) {
214 if (value is int) { 215 if (value is int) {
215 contentLength = value; 216 contentLength = value;
216 } else if (value is String) { 217 } else if (value is String) {
217 contentLength = int.parse(value); 218 contentLength = int.parse(value);
218 } else { 219 } else {
219 throw new HttpException("Unexpected type for header named $name"); 220 throw new HttpException("Unexpected type for header named $name");
220 } 221 }
221 } else if (lowerCaseName == HttpHeaders.TRANSFER_ENCODING) { 222 } else if (name == HttpHeaders.TRANSFER_ENCODING) {
222 if (value == "chunked") { 223 if (value == "chunked") {
223 chunkedTransferEncoding = true; 224 chunkedTransferEncoding = true;
224 } else { 225 } else {
225 _addValue(lowerCaseName, value); 226 _addValue(name, value);
226 } 227 }
227 } else if (lowerCaseName == HttpHeaders.DATE) { 228 } else if (name == HttpHeaders.DATE) {
228 if (value is DateTime) { 229 if (value is DateTime) {
229 date = value; 230 date = value;
230 } else if (value is String) { 231 } else if (value is String) {
231 _set(HttpHeaders.DATE, value); 232 _set(HttpHeaders.DATE, value);
232 } else { 233 } else {
233 throw new HttpException("Unexpected type for header named $name"); 234 throw new HttpException("Unexpected type for header named $name");
234 } 235 }
235 } else if (lowerCaseName == HttpHeaders.EXPIRES) { 236 } else if (name == HttpHeaders.EXPIRES) {
236 if (value is DateTime) { 237 if (value is DateTime) {
237 expires = value; 238 expires = value;
238 } else if (value is String) { 239 } else if (value is String) {
239 _set(HttpHeaders.EXPIRES, value); 240 _set(HttpHeaders.EXPIRES, value);
240 } else { 241 } else {
241 throw new HttpException("Unexpected type for header named $name"); 242 throw new HttpException("Unexpected type for header named $name");
242 } 243 }
243 } else if (lowerCaseName == HttpHeaders.IF_MODIFIED_SINCE) { 244 } else if (name == HttpHeaders.IF_MODIFIED_SINCE) {
244 if (value is DateTime) { 245 if (value is DateTime) {
245 ifModifiedSince = value; 246 ifModifiedSince = value;
246 } else if (value is String) { 247 } else if (value is String) {
247 _set(HttpHeaders.IF_MODIFIED_SINCE, value); 248 _set(HttpHeaders.IF_MODIFIED_SINCE, value);
248 } else { 249 } else {
249 throw new HttpException("Unexpected type for header named $name"); 250 throw new HttpException("Unexpected type for header named $name");
250 } 251 }
251 } else if (lowerCaseName == HttpHeaders.HOST) { 252 } else if (name == HttpHeaders.HOST) {
252 if (value is String) { 253 if (value is String) {
253 int pos = value.indexOf(":"); 254 int pos = value.indexOf(":");
254 if (pos == -1) { 255 if (pos == -1) {
255 _host = value; 256 _host = value;
256 _port = HttpClient.DEFAULT_HTTP_PORT; 257 _port = HttpClient.DEFAULT_HTTP_PORT;
257 } else { 258 } else {
258 if (pos > 0) { 259 if (pos > 0) {
259 _host = value.substring(0, pos); 260 _host = value.substring(0, pos);
260 } else { 261 } else {
261 _host = null; 262 _host = null;
262 } 263 }
263 if (pos + 1 == value.length) { 264 if (pos + 1 == value.length) {
264 _port = HttpClient.DEFAULT_HTTP_PORT; 265 _port = HttpClient.DEFAULT_HTTP_PORT;
265 } else { 266 } else {
266 try { 267 try {
267 _port = int.parse(value.substring(pos + 1)); 268 _port = int.parse(value.substring(pos + 1));
268 } on FormatException catch (e) { 269 } on FormatException catch (e) {
269 _port = null; 270 _port = null;
270 } 271 }
271 } 272 }
272 } 273 }
273 _set(HttpHeaders.HOST, value); 274 _set(HttpHeaders.HOST, value);
274 } else { 275 } else {
275 throw new HttpException("Unexpected type for header named $name"); 276 throw new HttpException("Unexpected type for header named $name");
276 } 277 }
277 } else if (lowerCaseName == HttpHeaders.CONTENT_TYPE) { 278 } else if (name == HttpHeaders.CONTENT_TYPE) {
278 _set(HttpHeaders.CONTENT_TYPE, value); 279 _set(HttpHeaders.CONTENT_TYPE, value);
279 } else { 280 } else {
280 _addValue(lowerCaseName, value); 281 _addValue(name, value);
281 } 282 }
282 } 283 }
283 284
284 void _addValue(String name, Object value) { 285 void _addValue(String name, Object value) {
285 List<String> values = _headers[name]; 286 List<String> values = _headers[name];
286 if (values == null) { 287 if (values == null) {
287 values = new List<String>(); 288 values = new List<String>();
288 _headers[name] = values; 289 _headers[name] = values;
289 } 290 }
290 if (value is DateTime) { 291 if (value is DateTime) {
(...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after
827 void clear() { 828 void clear() {
828 throw new UnsupportedError("Cannot modify an unmodifiable map"); 829 throw new UnsupportedError("Cannot modify an unmodifiable map");
829 } 830 }
830 void forEach(void f(K key, V value)) => _map.forEach(f); 831 void forEach(void f(K key, V value)) => _map.forEach(f);
831 Iterable<K> get keys => _map.keys; 832 Iterable<K> get keys => _map.keys;
832 Iterable<V> get values => _map.values; 833 Iterable<V> get values => _map.values;
833 int get length => _map.length; 834 int get length => _map.length;
834 bool get isEmpty => _map.isEmpty; 835 bool get isEmpty => _map.isEmpty;
835 bool get isNotEmpty => _map.isNotEmpty; 836 bool get isNotEmpty => _map.isNotEmpty;
836 } 837 }
OLDNEW
« no previous file with comments | « no previous file | sdk/lib/io/http_parser.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698