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 |