Chromium Code Reviews| 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) { |