Index: sdk/lib/io/http_headers.dart |
diff --git a/sdk/lib/io/http_headers.dart b/sdk/lib/io/http_headers.dart |
index 5dd5c55fd064e50f44e9c3e7d43047a2c3dc0518..33d51373a121331ab282ca78dcb6a0916ccfe185 100644 |
--- a/sdk/lib/io/http_headers.dart |
+++ b/sdk/lib/io/http_headers.dart |
@@ -248,103 +248,117 @@ class _HttpHeaders implements HttpHeaders { |
_set(HttpHeaders.CONTENT_TYPE, contentType.toString()); |
} |
- // [name] must be a lower-case version of the name. |
- void _add(String name, value) { |
- // TODO(sgjesse): Add immutable state throw HttpException is immutable. |
- switch (name) { |
- case HttpHeaders.CONTENT_LENGTH: |
- if (value is int) { |
- contentLength = value; |
- } else if (value is String) { |
- contentLength = int.parse(value); |
- } else { |
- throw new HttpException("Unexpected type for header named $name"); |
- } |
- break; |
+ static void _addContentLength(_HttpHeaders headers, String name, value) { |
+ if (value is int) { |
+ headers.contentLength = value; |
+ } else if (value is String) { |
+ headers.contentLength = int.parse(value); |
+ } else { |
+ throw new HttpException("Unexpected type for header named $name"); |
+ } |
+ } |
- case HttpHeaders.TRANSFER_ENCODING: |
- if (value == "chunked") { |
- chunkedTransferEncoding = true; |
- } else { |
- _addValue(name, value); |
- } |
- break; |
+ static void _addTransferEncoding(_HttpHeaders headers, String name, value) { |
+ if (value == "chunked") { |
+ headers.chunkedTransferEncoding = true; |
+ } else { |
+ headers._addValue(HttpHeaders.TRANSFER_ENCODING, value); |
+ } |
+ } |
- case HttpHeaders.DATE: |
- if (value is DateTime) { |
- date = value; |
- } else if (value is String) { |
- _set(HttpHeaders.DATE, value); |
- } else { |
- throw new HttpException("Unexpected type for header named $name"); |
- } |
- break; |
+ static void _addDate(_HttpHeaders headers, String name, value) { |
+ if (value is DateTime) { |
+ headers.date = value; |
+ } else if (value is String) { |
+ headers._set(HttpHeaders.DATE, value); |
+ } else { |
+ throw new HttpException("Unexpected type for header named $name"); |
+ } |
+ } |
- case HttpHeaders.EXPIRES: |
- if (value is DateTime) { |
- expires = value; |
- } else if (value is String) { |
- _set(HttpHeaders.EXPIRES, value); |
- } else { |
- throw new HttpException("Unexpected type for header named $name"); |
- } |
- break; |
+ static void _addExpires(_HttpHeaders headers, String name, value) { |
+ if (value is DateTime) { |
+ headers.expires = value; |
+ } else if (value is String) { |
+ headers._set(HttpHeaders.EXPIRES, value); |
+ } else { |
+ throw new HttpException("Unexpected type for header named $name"); |
+ } |
+ } |
- case HttpHeaders.IF_MODIFIED_SINCE: |
- if (value is DateTime) { |
- ifModifiedSince = value; |
- } else if (value is String) { |
- _set(HttpHeaders.IF_MODIFIED_SINCE, value); |
+ static void _addIfModifiedSince(_HttpHeaders headers, String name, value) { |
+ if (value is DateTime) { |
+ headers.ifModifiedSince = value; |
+ } else if (value is String) { |
+ headers._set(HttpHeaders.IF_MODIFIED_SINCE, value); |
+ } else { |
+ throw new HttpException("Unexpected type for header named $name"); |
+ } |
+ } |
+ |
+ static void _addHost(_HttpHeaders headers, String name, value) { |
+ if (value is String) { |
+ int pos = value.indexOf(":"); |
+ if (pos == -1) { |
+ headers._host = value; |
+ headers._port = HttpClient.DEFAULT_HTTP_PORT; |
+ } else { |
+ if (pos > 0) { |
+ headers._host = value.substring(0, pos); |
} else { |
- throw new HttpException("Unexpected type for header named $name"); |
+ headers._host = null; |
} |
- break; |
- |
- case HttpHeaders.HOST: |
- if (value is String) { |
- int pos = value.indexOf(":"); |
- if (pos == -1) { |
- _host = value; |
- _port = HttpClient.DEFAULT_HTTP_PORT; |
- } else { |
- if (pos > 0) { |
- _host = value.substring(0, pos); |
- } else { |
- _host = null; |
- } |
- if (pos + 1 == value.length) { |
- _port = HttpClient.DEFAULT_HTTP_PORT; |
- } else { |
- try { |
- _port = int.parse(value.substring(pos + 1)); |
- } on FormatException catch (e) { |
- _port = null; |
- } |
- } |
- } |
- _set(HttpHeaders.HOST, value); |
+ if (pos + 1 == value.length) { |
+ headers._port = HttpClient.DEFAULT_HTTP_PORT; |
} else { |
- throw new HttpException("Unexpected type for header named $name"); |
- } |
- break; |
- |
- case HttpHeaders.CONNECTION: |
- var lowerCaseValue = value.toLowerCase(); |
- if (lowerCaseValue == 'close') { |
- _persistentConnection = false; |
- } else if (lowerCaseValue == 'keep-alive') { |
- _persistentConnection = true; |
+ try { |
+ headers._port = int.parse(value.substring(pos + 1)); |
+ } on FormatException catch (e) { |
+ headers._port = null; |
+ } |
} |
- _addValue(name, value); |
- break; |
+ } |
+ headers._set(HttpHeaders.HOST, value); |
+ } else { |
+ throw new HttpException("Unexpected type for header named $name"); |
+ } |
+ } |
+ |
+ static void _addConnection(_HttpHeaders headers, String name, value) { |
+ var lowerCaseValue = value.toLowerCase(); |
+ if (lowerCaseValue == 'close') { |
+ headers._persistentConnection = false; |
+ } else if (lowerCaseValue == 'keep-alive') { |
+ headers._persistentConnection = true; |
+ } |
+ headers._addValue(name, value); |
+ } |
+ |
+ static void _addContentType(_HttpHeaders headers, String name, value) { |
+ headers._set(HttpHeaders.CONTENT_TYPE, value); |
+ } |
- case HttpHeaders.CONTENT_TYPE: |
- _set(HttpHeaders.CONTENT_TYPE, value); |
- break; |
+ // TODO(ajohnsen): Change to const map, once const maps are faster. |
+ static final _addMap = { |
+ HttpHeaders.CONTENT_LENGTH: _addContentLength, |
+ HttpHeaders.TRANSFER_ENCODING: _addTransferEncoding, |
+ HttpHeaders.DATE: _addDate, |
+ HttpHeaders.EXPIRES: _addExpires, |
+ HttpHeaders.IF_MODIFIED_SINCE: _addIfModifiedSince, |
+ HttpHeaders.HOST: _addHost, |
+ HttpHeaders.CONNECTION: _addConnection, |
+ HttpHeaders.CONTENT_TYPE: _addContentType |
+ }; |
- default: |
- _addValue(name, value); |
+ // [name] must be a lower-case version of the name. |
+ void _add(String name, value) { |
+ assert(name == name.toLowerCase()); |
+ var method = _addMap[name]; |
+ if (method != null) { |
+ method(this, name, value); |
+ return; |
} |
+ _addValue(name, value); |
} |
void _addValue(String name, Object value) { |