| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 part of dart.io; | 5 part of dart.io; |
| 6 | 6 |
| 7 // Global constants. | 7 // Global constants. |
| 8 class _Const { | 8 class _Const { |
| 9 // Bytes for "HTTP". | 9 // Bytes for "HTTP". |
| 10 static const HTTP = const [72, 84, 84, 80]; | 10 static const HTTP = const [72, 84, 84, 80]; |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 | 98 |
| 99 class _HttpDetachedIncoming extends Stream<List<int>> { | 99 class _HttpDetachedIncoming extends Stream<List<int>> { |
| 100 StreamController<List<int>> controller; | 100 StreamController<List<int>> controller; |
| 101 final StreamSubscription subscription; | 101 final StreamSubscription subscription; |
| 102 | 102 |
| 103 List<int> bufferedData; | 103 List<int> bufferedData; |
| 104 bool paused; | 104 bool paused; |
| 105 | 105 |
| 106 Completer resumeCompleter; | 106 Completer resumeCompleter; |
| 107 | 107 |
| 108 _HttpDetachedIncoming(StreamSubscription this.subscription, | 108 _HttpDetachedIncoming(this.subscription, this.bufferedData) { |
| 109 List<int> this.bufferedData) { | |
| 110 controller = new StreamController<List<int>>( | 109 controller = new StreamController<List<int>>( |
| 111 sync: true, | 110 sync: true, |
| 112 onListen: resume, | 111 onListen: resume, |
| 113 onPause: pause, | 112 onPause: pause, |
| 114 onResume: resume, | 113 onResume: resume, |
| 115 onCancel: () => subscription.cancel()); | 114 onCancel: () => subscription.cancel()); |
| 116 if (subscription == null) { | 115 if (subscription == null) { |
| 117 // Socket was already closed. | 116 // Socket was already closed. |
| 118 if (bufferedData != null) controller.add(bufferedData); | 117 if (bufferedData != null) controller.add(bufferedData); |
| 119 controller.close(); | 118 controller.close(); |
| 120 } else { | 119 } else { |
| 121 pause(); | 120 pause(); |
| 122 subscription.resume(); | 121 subscription |
| 123 subscription.onData(controller.add); | 122 ..resume() |
| 124 subscription.onDone(controller.close); | 123 ..onData(controller.add) |
| 125 subscription.onError(controller.addError); | 124 ..onDone(controller.close) |
| 125 ..onError(controller.addError); |
| 126 } | 126 } |
| 127 } | 127 } |
| 128 | 128 |
| 129 StreamSubscription<List<int>> listen(void onData(List<int> event), | 129 StreamSubscription<List<int>> listen(void onData(List<int> event), |
| 130 {Function onError, | 130 {Function onError, |
| 131 void onDone(), | 131 void onDone(), |
| 132 bool cancelOnError}) { | 132 bool cancelOnError}) { |
| 133 return controller.stream.listen( | 133 return controller.stream.listen( |
| 134 onData, | 134 onData, |
| 135 onError: onError, | 135 onError: onError, |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 * there is no more HTTP data. After the upgrade the method | 179 * there is no more HTTP data. After the upgrade the method |
| 180 * [:readUnparsedData:] can be used to read any remaining bytes in the | 180 * [:readUnparsedData:] can be used to read any remaining bytes in the |
| 181 * HTTP parser which are part of the protocol the connection is | 181 * HTTP parser which are part of the protocol the connection is |
| 182 * upgrading to. These bytes cannot be processed by the HTTP parser | 182 * upgrading to. These bytes cannot be processed by the HTTP parser |
| 183 * and should be handled according to whatever protocol is being | 183 * and should be handled according to whatever protocol is being |
| 184 * upgraded to. | 184 * upgraded to. |
| 185 */ | 185 */ |
| 186 class _HttpParser | 186 class _HttpParser |
| 187 extends Stream<_HttpIncoming> | 187 extends Stream<_HttpIncoming> |
| 188 implements StreamConsumer<List<int>> { | 188 implements StreamConsumer<List<int>> { |
| 189 // State. |
| 190 bool _parserCalled = false; |
| 191 |
| 192 // The data that is currently being parsed. |
| 193 Uint8List _buffer; |
| 194 int _index; |
| 195 |
| 196 final bool _requestParser; |
| 197 int _state; |
| 198 int _httpVersionIndex; |
| 199 int _messageType; |
| 200 int _statusCode = 0; |
| 201 List _method_or_status_code; |
| 202 List _uri_or_reason_phrase; |
| 203 List _headerField; |
| 204 List _headerValue; |
| 205 |
| 206 int _httpVersion; |
| 207 int _transferLength = -1; |
| 208 bool _persistentConnection; |
| 209 bool _connectionUpgrade; |
| 210 bool _chunked; |
| 211 |
| 212 bool _noMessageBody; |
| 213 String _responseToMethod; // Indicates the method used for the request. |
| 214 int _remainingContent = -1; |
| 215 |
| 216 _HttpHeaders _headers; |
| 217 |
| 218 // The current incoming connection. |
| 219 _HttpIncoming _incoming; |
| 220 StreamSubscription _socketSubscription; |
| 221 bool _paused = true; |
| 222 bool _bodyPaused = false; |
| 223 StreamController<_HttpIncoming> _controller; |
| 224 StreamController<List<int>> _bodyController; |
| 189 | 225 |
| 190 factory _HttpParser.requestParser() { | 226 factory _HttpParser.requestParser() { |
| 191 return new _HttpParser._(true); | 227 return new _HttpParser._(true); |
| 192 } | 228 } |
| 193 | 229 |
| 194 factory _HttpParser.responseParser() { | 230 factory _HttpParser.responseParser() { |
| 195 return new _HttpParser._(false); | 231 return new _HttpParser._(false); |
| 196 } | 232 } |
| 197 | 233 |
| 198 _HttpParser._(this._requestParser) { | 234 _HttpParser._(this._requestParser) { |
| (...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 948 } | 984 } |
| 949 } | 985 } |
| 950 } | 986 } |
| 951 | 987 |
| 952 void _reportError(error, [stackTrace]) { | 988 void _reportError(error, [stackTrace]) { |
| 953 if (_socketSubscription != null) _socketSubscription.cancel(); | 989 if (_socketSubscription != null) _socketSubscription.cancel(); |
| 954 _state = _State.FAILURE; | 990 _state = _State.FAILURE; |
| 955 _controller.addError(error, stackTrace); | 991 _controller.addError(error, stackTrace); |
| 956 _controller.close(); | 992 _controller.close(); |
| 957 } | 993 } |
| 958 | |
| 959 // State. | |
| 960 bool _parserCalled = false; | |
| 961 | |
| 962 // The data that is currently being parsed. | |
| 963 Uint8List _buffer; | |
| 964 int _index; | |
| 965 | |
| 966 final bool _requestParser; | |
| 967 int _state; | |
| 968 int _httpVersionIndex; | |
| 969 int _messageType; | |
| 970 int _statusCode = 0; | |
| 971 List _method_or_status_code; | |
| 972 List _uri_or_reason_phrase; | |
| 973 List _headerField; | |
| 974 List _headerValue; | |
| 975 | |
| 976 int _httpVersion; | |
| 977 int _transferLength = -1; | |
| 978 bool _persistentConnection; | |
| 979 bool _connectionUpgrade; | |
| 980 bool _chunked; | |
| 981 | |
| 982 bool _noMessageBody; | |
| 983 String _responseToMethod; // Indicates the method used for the request. | |
| 984 int _remainingContent = -1; | |
| 985 | |
| 986 _HttpHeaders _headers; | |
| 987 | |
| 988 // The current incoming connection. | |
| 989 _HttpIncoming _incoming; | |
| 990 StreamSubscription _socketSubscription; | |
| 991 bool _paused = true; | |
| 992 bool _bodyPaused = false; | |
| 993 StreamController<_HttpIncoming> _controller; | |
| 994 StreamController<List<int>> _bodyController; | |
| 995 } | 994 } |
| OLD | NEW |