| 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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 class _MessageType { | 92 class _MessageType { |
| 93 static const int UNDETERMINED = 0; | 93 static const int UNDETERMINED = 0; |
| 94 static const int REQUEST = 1; | 94 static const int REQUEST = 1; |
| 95 static const int RESPONSE = 0; | 95 static const int RESPONSE = 0; |
| 96 } | 96 } |
| 97 | 97 |
| 98 class _HttpDetachedIncoming extends Stream<List<int>> { | 98 class _HttpDetachedIncoming extends Stream<List<int>> { |
| 99 StreamController<List<int>> controller; | 99 StreamController<List<int>> controller; |
| 100 final StreamSubscription subscription; | 100 final StreamSubscription subscription; |
| 101 | 101 |
| 102 List<int> carryOverData; | 102 List<int> bufferedData; |
| 103 bool paused; | 103 bool paused; |
| 104 | 104 |
| 105 Completer resumeCompleter; | 105 Completer resumeCompleter; |
| 106 | 106 |
| 107 _HttpDetachedIncoming(StreamSubscription this.subscription, | 107 _HttpDetachedIncoming(StreamSubscription this.subscription, |
| 108 List<int> this.carryOverData) { | 108 List<int> this.bufferedData) { |
| 109 controller = new StreamController<List<int>>( | 109 controller = new StreamController<List<int>>( |
| 110 sync: true, | 110 sync: true, |
| 111 onListen: resume, | 111 onListen: resume, |
| 112 onPause: pause, | 112 onPause: pause, |
| 113 onResume: resume, | 113 onResume: resume, |
| 114 onCancel: () => subscription.cancel()); | 114 onCancel: () => subscription.cancel()); |
| 115 if (subscription == null) { | 115 if (subscription == null) { |
| 116 // Socket was already closed. | 116 // Socket was already closed. |
| 117 if (carryOverData != null) controller.add(carryOverData); | 117 if (bufferedData != null) controller.add(bufferedData); |
| 118 controller.close(); | 118 controller.close(); |
| 119 } else { | 119 } else { |
| 120 pause(); | 120 pause(); |
| 121 subscription.resume(); | 121 subscription.resume(); |
| 122 subscription.onData(controller.add); | 122 subscription.onData(controller.add); |
| 123 subscription.onDone(controller.close); | 123 subscription.onDone(controller.close); |
| 124 subscription.onError(controller.addError); | 124 subscription.onError(controller.addError); |
| 125 } | 125 } |
| 126 } | 126 } |
| 127 | 127 |
| 128 StreamSubscription<List<int>> listen(void onData(List<int> event), | 128 StreamSubscription<List<int>> listen(void onData(List<int> event), |
| 129 {void onError(error), | 129 {void onError(error), |
| 130 void onDone(), | 130 void onDone(), |
| 131 bool cancelOnError}) { | 131 bool cancelOnError}) { |
| 132 return controller.stream.listen( | 132 return controller.stream.listen( |
| 133 onData, | 133 onData, |
| 134 onError: onError, | 134 onError: onError, |
| 135 onDone: onDone, | 135 onDone: onDone, |
| 136 cancelOnError: cancelOnError); | 136 cancelOnError: cancelOnError); |
| 137 } | 137 } |
| 138 | 138 |
| 139 void resume() { | 139 void resume() { |
| 140 paused = false; | 140 paused = false; |
| 141 if (carryOverData != null) { | 141 if (bufferedData != null) { |
| 142 var data = carryOverData; | 142 var data = bufferedData; |
| 143 carryOverData = null; | 143 bufferedData = null; |
| 144 controller.add(data); | 144 controller.add(data); |
| 145 // If the consumer pauses again after the carry-over data, we'll not | 145 // If the consumer pauses again after the carry-over data, we'll not |
| 146 // continue our subscriber until the next resume. | 146 // continue our subscriber until the next resume. |
| 147 if (paused) return; | 147 if (paused) return; |
| 148 } | 148 } |
| 149 if (resumeCompleter != null) { | 149 if (resumeCompleter != null) { |
| 150 resumeCompleter.complete(); | 150 resumeCompleter.complete(); |
| 151 resumeCompleter = null; | 151 resumeCompleter = null; |
| 152 } | 152 } |
| 153 } | 153 } |
| (...skipping 826 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 980 _HttpHeaders _headers; | 980 _HttpHeaders _headers; |
| 981 | 981 |
| 982 // The current incoming connection. | 982 // The current incoming connection. |
| 983 _HttpIncoming _incoming; | 983 _HttpIncoming _incoming; |
| 984 StreamSubscription _socketSubscription; | 984 StreamSubscription _socketSubscription; |
| 985 bool _paused = true; | 985 bool _paused = true; |
| 986 bool _bodyPaused = false; | 986 bool _bodyPaused = false; |
| 987 StreamController<_HttpIncoming> _controller; | 987 StreamController<_HttpIncoming> _controller; |
| 988 StreamController<List<int>> _bodyController; | 988 StreamController<List<int>> _bodyController; |
| 989 } | 989 } |
| OLD | NEW |