| Index: sdk/lib/io/http_parser.dart
|
| diff --git a/sdk/lib/io/http_parser.dart b/sdk/lib/io/http_parser.dart
|
| index 2b7eb2ff6415bad813b1e4f6bd55dc2787bc2de2..c4e966e31bcc7ddbcf7a139e600ff1ea86a19949 100644
|
| --- a/sdk/lib/io/http_parser.dart
|
| +++ b/sdk/lib/io/http_parser.dart
|
| @@ -99,8 +99,6 @@ class _MessageType {
|
| *
|
| * [:requestStart:]
|
| * [:responseStart:]
|
| - * [:headerReceived:]
|
| - * [:headersComplete:]
|
| * [:dataReceived:]
|
| * [:dataEnd:]
|
| * [:closed:]
|
| @@ -113,7 +111,7 @@ class _MessageType {
|
| * The connection upgrades (e.g. switching from HTTP/1.1 to the
|
| * WebSocket protocol) is handled in a special way. If connection
|
| * upgrade is specified in the headers, then on the callback to
|
| - * [:headersComplete:] the [:upgrade:] property on the [:HttpParser:]
|
| + * [:responseStart:] the [:upgrade:] property on the [:HttpParser:]
|
| * object will be [:true:] indicating that from now on the protocol is
|
| * not HTTP anymore and no more callbacks will happen, that is
|
| * [:dataReceived:] and [:dataEnd:] are not called in this case as
|
| @@ -289,11 +287,6 @@ class _HttpParser {
|
| case _State.REQUEST_LINE_ENDING:
|
| _expect(byte, _CharCode.LF);
|
| _messageType = _MessageType.REQUEST;
|
| - requestStart(new String.fromCharCodes(_method_or_status_code),
|
| - new String.fromCharCodes(_uri_or_reason_phrase),
|
| - version);
|
| - _method_or_status_code.clear();
|
| - _uri_or_reason_phrase.clear();
|
| _state = _State.HEADER_START;
|
| break;
|
|
|
| @@ -329,19 +322,14 @@ class _HttpParser {
|
| case _State.RESPONSE_LINE_ENDING:
|
| _expect(byte, _CharCode.LF);
|
| _messageType == _MessageType.RESPONSE;
|
| - int statusCode = parseInt(new String.fromCharCodes(_method_or_status_code));
|
| - if (statusCode < 100 || statusCode > 599) {
|
| + _statusCode = parseInt(new String.fromCharCodes(_method_or_status_code));
|
| + if (_statusCode < 100 || _statusCode > 599) {
|
| throw new HttpParserException("Invalid response status code");
|
| } else {
|
| // Check whether this response will never have a body.
|
| _noMessageBody =
|
| - statusCode <= 199 || statusCode == 204 || statusCode == 304;
|
| + _statusCode <= 199 || _statusCode == 204 || _statusCode == 304;
|
| }
|
| - responseStart(statusCode,
|
| - new String.fromCharCodes(_uri_or_reason_phrase),
|
| - version);
|
| - _method_or_status_code.clear();
|
| - _uri_or_reason_phrase.clear();
|
| _state = _State.HEADER_START;
|
| break;
|
|
|
| @@ -411,7 +399,8 @@ class _HttpParser {
|
| } else if (token == "upgrade") {
|
| _connectionUpgrade = true;
|
| }
|
| - headerReceived(headerField, token);
|
| + _headers.add(headerField, token);
|
| +
|
| }
|
| reportHeader = false;
|
| } else if (headerField == "transfer-encoding" &&
|
| @@ -422,7 +411,7 @@ class _HttpParser {
|
| _contentLength = -1;
|
| }
|
| if (reportHeader) {
|
| - headerReceived(headerField, headerValue);
|
| + _headers.add(headerField, headerValue);
|
| }
|
| _headerField.clear();
|
| _headerValue.clear();
|
| @@ -449,9 +438,23 @@ class _HttpParser {
|
| }
|
| if (_connectionUpgrade) {
|
| _state = _State.UPGRADED;
|
| - headersComplete();
|
| + }
|
| + if (_requestParser) {
|
| + requestStart(new String.fromCharCodes(_method_or_status_code),
|
| + new String.fromCharCodes(_uri_or_reason_phrase),
|
| + version,
|
| + _headers);
|
| } else {
|
| - headersComplete();
|
| + responseStart(_statusCode,
|
| + new String.fromCharCodes(_uri_or_reason_phrase),
|
| + version,
|
| + _headers);
|
| + }
|
| + _method_or_status_code.clear();
|
| + _uri_or_reason_phrase.clear();
|
| + if (!_connectionUpgrade) {
|
| + _method_or_status_code.clear();
|
| + _uri_or_reason_phrase.clear();
|
| if (_chunked) {
|
| _state = _State.CHUNK_SIZE;
|
| _remainingContent = 0;
|
| @@ -672,6 +675,8 @@ class _HttpParser {
|
| _noMessageBody = false;
|
| _responseToMethod = null;
|
| _remainingContent = null;
|
| +
|
| + _headers = new _HttpHeaders();
|
| }
|
|
|
| _releaseBuffer() {
|
| @@ -735,6 +740,7 @@ class _HttpParser {
|
| int _state;
|
| int _httpVersionIndex;
|
| int _messageType;
|
| + int _statusCode;
|
| List _method_or_status_code;
|
| List _uri_or_reason_phrase;
|
| List _headerField;
|
| @@ -750,11 +756,11 @@ class _HttpParser {
|
| String _responseToMethod; // Indicates the method used for the request.
|
| int _remainingContent;
|
|
|
| + _HttpHeaders _headers = new _HttpHeaders();
|
| +
|
| // Callbacks.
|
| Function requestStart;
|
| Function responseStart;
|
| - Function headerReceived;
|
| - Function headersComplete;
|
| Function dataReceived;
|
| Function dataEnd;
|
| Function error;
|
|
|