| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 class _HttpHeaders implements HttpHeaders { | 5 class _HttpHeaders implements HttpHeaders { |
| 6 _HttpHeaders() : _headers = new Map<String, List<String>>(); | 6 _HttpHeaders() : _headers = new Map<String, List<String>>(); |
| 7 | 7 |
| 8 List<String> operator[](String name) { | 8 List<String> operator[](String name) { |
| 9 name = name.toLowerCase(); | 9 name = name.toLowerCase(); |
| 10 return _headers[name]; | 10 return _headers[name]; |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 bool allWritten = true; | 310 bool allWritten = true; |
| 311 if (_contentLength < 0) { | 311 if (_contentLength < 0) { |
| 312 // Terminate the content if transfer encoding is chunked. | 312 // Terminate the content if transfer encoding is chunked. |
| 313 allWritten = _httpConnection._write(_Const.END_CHUNKED); | 313 allWritten = _httpConnection._write(_Const.END_CHUNKED); |
| 314 } else { | 314 } else { |
| 315 if (_bodyBytesWritten < _contentLength) { | 315 if (_bodyBytesWritten < _contentLength) { |
| 316 throw new HttpException("Sending less than specified content length"); | 316 throw new HttpException("Sending less than specified content length"); |
| 317 } | 317 } |
| 318 assert(_bodyBytesWritten == _contentLength); | 318 assert(_bodyBytesWritten == _contentLength); |
| 319 } | 319 } |
| 320 if (!persistentConnection) _httpConnection._close(); |
| 320 return allWritten; | 321 return allWritten; |
| 321 } | 322 } |
| 322 | 323 |
| 323 bool _writeHeaders() { | 324 bool _writeHeaders() { |
| 324 _headers._mutable = false; | 325 _headers._mutable = false; |
| 325 _headers._write(_httpConnection); | 326 _headers._write(_httpConnection); |
| 326 // Terminate header. | 327 // Terminate header. |
| 327 return _writeCRLF(); | 328 return _writeCRLF(); |
| 328 } | 329 } |
| 329 | 330 |
| (...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 747 } | 748 } |
| 748 | 749 |
| 749 bool _writeFrom(List<int> buffer, [int offset, int len]) { | 750 bool _writeFrom(List<int> buffer, [int offset, int len]) { |
| 750 if (!_error && !_closing) { | 751 if (!_error && !_closing) { |
| 751 return _socket.outputStream.writeFrom(buffer, offset, len); | 752 return _socket.outputStream.writeFrom(buffer, offset, len); |
| 752 } | 753 } |
| 753 } | 754 } |
| 754 | 755 |
| 755 bool _close() { | 756 bool _close() { |
| 756 _closing = true; | 757 _closing = true; |
| 758 _socket.outputStream.close(); |
| 759 } |
| 760 |
| 761 bool _destroy() { |
| 762 _closing = true; |
| 757 _socket.close(); | 763 _socket.close(); |
| 758 } | 764 } |
| 759 | 765 |
| 760 void _onData() { | 766 void _onData() { |
| 761 int available = _socket.available(); | 767 int available = _socket.available(); |
| 762 if (available == 0) { | 768 if (available == 0) { |
| 763 return; | 769 return; |
| 764 } | 770 } |
| 765 | 771 |
| 766 List<int> buffer = new Uint8List(available); | 772 List<int> buffer = new Uint8List(available); |
| 767 int bytesRead = _socket.readList(buffer, 0, available); | 773 int bytesRead = _socket.readList(buffer, 0, available); |
| 768 if (bytesRead > 0) { | 774 if (bytesRead > 0) { |
| 769 int parsed = _httpParser.writeList(buffer, 0, bytesRead); | 775 int parsed = _httpParser.writeList(buffer, 0, bytesRead); |
| 770 if (!_httpParser.upgrade) { | 776 if (!_httpParser.upgrade) { |
| 771 if (parsed != bytesRead) { | 777 if (parsed != bytesRead) { |
| 772 if (_socket != null) { | 778 if (_socket != null) { |
| 773 // TODO(sgjesse): Error handling. | 779 // TODO(sgjesse): Error handling. |
| 774 _close(); | 780 _destroy(); |
| 775 } | 781 } |
| 776 } | 782 } |
| 777 } | 783 } |
| 778 } | 784 } |
| 779 } | 785 } |
| 780 | 786 |
| 781 void _onClosed() { | 787 void _onClosed() { |
| 782 _closing = true; | 788 _closing = true; |
| 783 _onConnectionClosed(null); | 789 _onConnectionClosed(null); |
| 784 } | 790 } |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 856 if (_request != null && _request._streamErrorHandler != null) { | 862 if (_request != null && _request._streamErrorHandler != null) { |
| 857 _request._streamErrorHandler(e); | 863 _request._streamErrorHandler(e); |
| 858 } | 864 } |
| 859 if (_response != null && _response._streamErrorHandler != null) { | 865 if (_response != null && _response._streamErrorHandler != null) { |
| 860 _response._streamErrorHandler(e); | 866 _response._streamErrorHandler(e); |
| 861 } | 867 } |
| 862 } | 868 } |
| 863 | 869 |
| 864 // If currently not processing any request just close the socket. | 870 // If currently not processing any request just close the socket. |
| 865 if (_httpParser.isIdle) { | 871 if (_httpParser.isIdle) { |
| 866 _close(); | 872 _destroy(); |
| 867 if (onClosed != null && e == null) { | 873 if (onClosed != null && e == null) { |
| 868 // Don't call onClosed if onError has been called. | 874 // Don't call onClosed if onError has been called. |
| 869 onClosed(); | 875 onClosed(); |
| 870 } | 876 } |
| 871 return; | 877 return; |
| 872 } | 878 } |
| 873 | 879 |
| 874 // Processing a request. | 880 // Processing a request. |
| 875 if (e == null) { | 881 if (e == null) { |
| 876 // Indicate connection close to the HTTP parser. | 882 // Indicate connection close to the HTTP parser. |
| (...skipping 666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1543 } | 1549 } |
| 1544 | 1550 |
| 1545 | 1551 |
| 1546 class _DetachedSocket implements DetachedSocket { | 1552 class _DetachedSocket implements DetachedSocket { |
| 1547 _DetachedSocket(this._socket, this._unparsedData); | 1553 _DetachedSocket(this._socket, this._unparsedData); |
| 1548 Socket get socket() => _socket; | 1554 Socket get socket() => _socket; |
| 1549 List<int> get unparsedData() => _unparsedData; | 1555 List<int> get unparsedData() => _unparsedData; |
| 1550 Socket _socket; | 1556 Socket _socket; |
| 1551 List<int> _unparsedData; | 1557 List<int> _unparsedData; |
| 1552 } | 1558 } |
| OLD | NEW |