Index: sdk/lib/io/http_headers.dart |
diff --git a/sdk/lib/io/http_headers.dart b/sdk/lib/io/http_headers.dart |
index 33d51373a121331ab282ca78dcb6a0916ccfe185..6b2c9d82bfa22ab951cf3c51e77d23d64ceab1ef 100644 |
--- a/sdk/lib/io/http_headers.dart |
+++ b/sdk/lib/io/http_headers.dart |
@@ -248,117 +248,147 @@ class _HttpHeaders implements HttpHeaders { |
_set(HttpHeaders.CONTENT_TYPE, contentType.toString()); |
} |
- static void _addContentLength(_HttpHeaders headers, String name, value) { |
+ // [name] must be a lower-case version of the name. |
+ void _add(String name, value) { |
+ assert(name == name.toLowerCase()); |
+ // Use the length as index on what method to call. This is notable |
+ // faster than computing hash and looking up in a hash-map. |
+ switch (name.length) { |
+ case 4: |
+ if (HttpHeaders.DATE == name) { |
+ _addDate(name, value); |
+ return; |
+ } |
+ if (HttpHeaders.HOST == name) { |
+ _addHost(name, value); |
+ return; |
+ } |
+ break; |
+ case 7: |
+ if (HttpHeaders.EXPIRES == name) { |
+ _addExpires(name, value); |
+ return; |
+ } |
+ break; |
+ case 10: |
+ if (HttpHeaders.CONNECTION == name) { |
+ _addConnection(name, value); |
+ return; |
+ } |
+ break; |
+ case 12: |
+ if (HttpHeaders.CONTENT_TYPE == name) { |
+ _addContentType(name, value); |
+ return; |
+ } |
+ break; |
+ case 14: |
+ if (HttpHeaders.CONTENT_LENGTH == name) { |
+ _addContentLength(name, value); |
+ return; |
+ } |
+ break; |
+ case 17: |
+ if (HttpHeaders.TRANSFER_ENCODING == name) { |
+ _addTransferEncoding(name, value); |
+ return; |
+ } |
+ if (HttpHeaders.IF_MODIFIED_SINCE == name) { |
+ _addIfModifiedSince(name, value); |
+ return; |
+ } |
+ } |
+ _addValue(name, value); |
+ } |
+ |
+ void _addContentLength(String name, value) { |
Lasse Reichstein Nielsen
2014/04/23 12:31:06
Do you need to pass the name?
It should always be
Anders Johnsen
2014/04/23 12:33:00
Yes, but as we use it a lot (see exception), it's
|
if (value is int) { |
- headers.contentLength = value; |
+ contentLength = value; |
} else if (value is String) { |
- headers.contentLength = int.parse(value); |
+ contentLength = int.parse(value); |
} else { |
throw new HttpException("Unexpected type for header named $name"); |
} |
} |
- static void _addTransferEncoding(_HttpHeaders headers, String name, value) { |
+ void _addTransferEncoding(String name, value) { |
Lasse Reichstein Nielsen
2014/04/23 12:31:06
Consider sorting functions by name?
|
if (value == "chunked") { |
- headers.chunkedTransferEncoding = true; |
+ chunkedTransferEncoding = true; |
} else { |
- headers._addValue(HttpHeaders.TRANSFER_ENCODING, value); |
+ _addValue(HttpHeaders.TRANSFER_ENCODING, value); |
} |
} |
- static void _addDate(_HttpHeaders headers, String name, value) { |
+ void _addDate(String name, value) { |
if (value is DateTime) { |
- headers.date = value; |
+ date = value; |
} else if (value is String) { |
- headers._set(HttpHeaders.DATE, value); |
+ _set(HttpHeaders.DATE, value); |
} else { |
throw new HttpException("Unexpected type for header named $name"); |
} |
} |
- static void _addExpires(_HttpHeaders headers, String name, value) { |
+ void _addExpires(String name, value) { |
if (value is DateTime) { |
- headers.expires = value; |
+ expires = value; |
} else if (value is String) { |
- headers._set(HttpHeaders.EXPIRES, value); |
+ _set(HttpHeaders.EXPIRES, value); |
} else { |
throw new HttpException("Unexpected type for header named $name"); |
} |
} |
- static void _addIfModifiedSince(_HttpHeaders headers, String name, value) { |
+ void _addIfModifiedSince(String name, value) { |
if (value is DateTime) { |
- headers.ifModifiedSince = value; |
+ ifModifiedSince = value; |
} else if (value is String) { |
- headers._set(HttpHeaders.IF_MODIFIED_SINCE, value); |
+ _set(HttpHeaders.IF_MODIFIED_SINCE, value); |
} else { |
throw new HttpException("Unexpected type for header named $name"); |
} |
} |
- static void _addHost(_HttpHeaders headers, String name, value) { |
+ void _addHost(String name, value) { |
if (value is String) { |
int pos = value.indexOf(":"); |
if (pos == -1) { |
- headers._host = value; |
- headers._port = HttpClient.DEFAULT_HTTP_PORT; |
+ _host = value; |
+ _port = HttpClient.DEFAULT_HTTP_PORT; |
} else { |
if (pos > 0) { |
- headers._host = value.substring(0, pos); |
+ _host = value.substring(0, pos); |
} else { |
- headers._host = null; |
+ _host = null; |
} |
if (pos + 1 == value.length) { |
- headers._port = HttpClient.DEFAULT_HTTP_PORT; |
+ _port = HttpClient.DEFAULT_HTTP_PORT; |
} else { |
try { |
- headers._port = int.parse(value.substring(pos + 1)); |
+ _port = int.parse(value.substring(pos + 1)); |
} on FormatException catch (e) { |
- headers._port = null; |
+ _port = null; |
} |
} |
} |
- headers._set(HttpHeaders.HOST, value); |
+ _set(HttpHeaders.HOST, value); |
} else { |
throw new HttpException("Unexpected type for header named $name"); |
} |
} |
- static void _addConnection(_HttpHeaders headers, String name, value) { |
+ void _addConnection(String name, value) { |
var lowerCaseValue = value.toLowerCase(); |
if (lowerCaseValue == 'close') { |
- headers._persistentConnection = false; |
+ _persistentConnection = false; |
} else if (lowerCaseValue == 'keep-alive') { |
- headers._persistentConnection = true; |
+ _persistentConnection = true; |
} |
- headers._addValue(name, value); |
- } |
- |
- static void _addContentType(_HttpHeaders headers, String name, value) { |
- headers._set(HttpHeaders.CONTENT_TYPE, value); |
+ _addValue(name, value); |
} |
- // 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 |
- }; |
- |
- // [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 _addContentType(String name, value) { |
+ _set(HttpHeaders.CONTENT_TYPE, value); |
} |
void _addValue(String name, Object value) { |