Index: sdk/lib/io/http_headers.dart |
diff --git a/sdk/lib/io/http_headers.dart b/sdk/lib/io/http_headers.dart |
index e6566e5cbe7e2bd9ad93ea8520e4246599bd828e..46651c62ab16c5ffe639803eda44a61890c86fac 100644 |
--- a/sdk/lib/io/http_headers.dart |
+++ b/sdk/lib/io/http_headers.dart |
@@ -77,6 +77,21 @@ class _HttpHeaders implements HttpHeaders { |
} |
} |
+ bool get chunkedTransferEncoding => _chunkedTransferEncoding; |
+ |
+ void set chunkedTransferEncoding(bool chunkedTransferEncoding) { |
+ _checkMutable(); |
+ _chunkedTransferEncoding = chunkedTransferEncoding; |
+ List<String> values = _headers["transfer-encoding"]; |
+ if (values == null || values[values.length - 1] != "chunked") { |
+ // Headers does not specify chunked encoding - add it if set. |
+ if (chunkedTransferEncoding) _addValue("transfer-encoding", "chunked"); |
+ } else { |
+ // Headers does specify chunked encoding - remove it if not set. |
+ if (!chunkedTransferEncoding) remove("transfer-encoding", "chunked"); |
+ } |
+ } |
+ |
String get host => _host; |
void set host(String host) { |
@@ -175,6 +190,12 @@ class _HttpHeaders implements HttpHeaders { |
} else { |
throw new HttpException("Unexpected type for header named $name"); |
} |
+ } else if (lowerCaseName == "transfer-encoding") { |
+ if (value == "chunked") { |
+ chunkedTransferEncoding = true; |
+ } else { |
+ _addValue(lowerCaseName, value); |
+ } |
} else if (lowerCaseName == "date") { |
if (value is Date) { |
date = value; |
@@ -224,17 +245,20 @@ class _HttpHeaders implements HttpHeaders { |
} else if (lowerCaseName == "content-type") { |
_set("content-type", value); |
} else { |
- name = lowerCaseName; |
- List<String> values = _headers[name]; |
- if (values == null) { |
- values = new List<String>(); |
- _headers[name] = values; |
- } |
- if (value is Date) { |
- values.add(_HttpUtils.formatDate(value)); |
- } else { |
- values.add(value.toString()); |
- } |
+ _addValue(lowerCaseName, value); |
+ } |
+ } |
+ |
+ void _addValue(String name, Object value) { |
+ List<String> values = _headers[name]; |
+ if (values == null) { |
+ values = new List<String>(); |
+ _headers[name] = values; |
+ } |
+ if (value is Date) { |
+ values.add(_HttpUtils.formatDate(value)); |
+ } else { |
+ values.add(value.toString()); |
} |
} |
@@ -264,6 +288,22 @@ class _HttpHeaders implements HttpHeaders { |
return true; |
} |
+ void _finalize(String protocolVersion) { |
+ // If the content length is not known make sure chunked transfer |
+ // encoding is used for HTTP 1.1. |
+ if (contentLength < 0 && protocolVersion == "1.1") { |
+ chunkedTransferEncoding = true; |
+ } |
+ // If a Transfer-Encoding header field is present the |
+ // Content-Length header MUST NOT be sent (RFC 2616 section 4.4). |
+ if (chunkedTransferEncoding && |
+ contentLength >= 0 && |
+ protocolVersion == "1.1") { |
+ contentLength = -1; |
+ } |
+ _mutable = false; |
+ } |
+ |
_write(_HttpConnectionBase connection) { |
final COLONSP = const [_CharCode.COLON, _CharCode.SP]; |
final COMMASP = const [_CharCode.COMMA, _CharCode.SP]; |
@@ -344,6 +384,7 @@ class _HttpHeaders implements HttpHeaders { |
List<String> _noFoldingHeaders; |
int _contentLength = -1; |
+ bool _chunkedTransferEncoding = false; |
String _host; |
int _port; |
} |