Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(203)

Unified Diff: sdk/lib/io/http_impl.dart

Issue 19668013: Add 'deadline' to HttpResponse, making it possible to give a max duration for the liveness of the r… (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Clean up timers. Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sdk/lib/io/http.dart ('k') | tests/standalone/io/http_response_deadline_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/io/http_impl.dart
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index 98a3cf9f5b093f1d2603299d3735274f6d2ef61b..3af4000b2f300237c9b4346b3c006f582f1d6408 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -686,12 +686,14 @@ class _HttpResponse extends _HttpOutboundMessage<HttpResponse>
String _reasonPhrase;
List<Cookie> _cookies;
_HttpRequest _httpRequest;
+ Duration _deadline;
+ Timer _deadlineTimer;
_HttpResponse(Uri uri,
String protocolVersion,
- _HttpOutgoing _outgoing,
+ _HttpOutgoing outgoing,
String serverHeader)
- : super(uri, protocolVersion, _outgoing) {
+ : super(uri, protocolVersion, outgoing) {
if (serverHeader != null) headers.set('Server', serverHeader);
}
@@ -708,6 +710,7 @@ class _HttpResponse extends _HttpOutboundMessage<HttpResponse>
Future<Socket> detachSocket() {
if (_headersWritten) throw new StateError("Headers already sent");
+ deadline = null; // Be sure to stop any deadline.
var future = _httpRequest._httpConnection.detachSocket();
_writeHeaders(drainRequest: false).then((_) => close());
// Close connection so the socket is 'free'.
@@ -721,6 +724,18 @@ class _HttpResponse extends _HttpOutboundMessage<HttpResponse>
HttpConnectionInfo get connectionInfo => _httpRequest.connectionInfo;
+ Duration get deadline => _deadline;
+
+ void set deadline(Duration d) {
+ if (_deadlineTimer != null) _deadlineTimer.cancel();
+ _deadline = d;
+
+ if (_deadline == null) return;
+ _deadlineTimer = new Timer(_deadline, () {
+ _outgoing.socket.destroy();
+ });
+ }
+
void _writeHeader() {
var builder = new BytesBuilder();
writeSP() => builder.add(const [_CharCode.SP]);
@@ -1098,12 +1113,12 @@ class _ContentLengthValidator
// Extends StreamConsumer as this is an internal type, only used to pipe to.
class _HttpOutgoing implements StreamConsumer<List<int>> {
final Completer _doneCompleter = new Completer();
- final StreamConsumer _consumer;
+ final Socket socket;
- _HttpOutgoing(StreamConsumer this._consumer);
+ _HttpOutgoing(Socket this.socket);
Future addStream(Stream<List<int>> stream) {
- return _consumer.addStream(stream)
+ return socket.addStream(stream)
.catchError((error) {
_doneCompleter.completeError(error);
throw error;
@@ -1111,7 +1126,7 @@ class _HttpOutgoing implements StreamConsumer<List<int>> {
}
Future close() {
- _doneCompleter.complete(_consumer);
+ _doneCompleter.complete(socket);
return new Future.value();
}
@@ -1812,6 +1827,7 @@ class _HttpConnection extends LinkedListEntry<_HttpConnection> {
var request = new _HttpRequest(response, incoming, _httpServer, this);
_streamFuture = outgoing.done
.then((_) {
+ response.deadline = null;
if (_state == _DETACHED) return;
if (response.persistentConnection &&
request.persistentConnection &&
« no previous file with comments | « sdk/lib/io/http.dart ('k') | tests/standalone/io/http_response_deadline_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698