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

Side by Side Diff: sdk/lib/io/http_impl.dart

Issue 13861005: Delay HttpClientResponse until HttpClientRequest is fully sent. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Remove test. Created 7 years, 8 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | tests/standalone/io/http_client_request_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 class _HttpIncoming extends Stream<List<int>> { 7 class _HttpIncoming extends Stream<List<int>> {
8 final int _transferLength; 8 final int _transferLength;
9 final Completer _dataCompleter = new Completer(); 9 final Completer _dataCompleter = new Completer();
10 Stream<List<int>> _stream; 10 Stream<List<int>> _stream;
(...skipping 684 matching lines...) Expand 10 before | Expand all | Expand 10 after
695 695
696 // The HttpClient this request belongs to. 696 // The HttpClient this request belongs to.
697 final _HttpClient _httpClient; 697 final _HttpClient _httpClient;
698 final _HttpClientConnection _httpClientConnection; 698 final _HttpClientConnection _httpClientConnection;
699 699
700 final Completer<HttpClientResponse> _responseCompleter 700 final Completer<HttpClientResponse> _responseCompleter
701 = new Completer<HttpClientResponse>(); 701 = new Completer<HttpClientResponse>();
702 702
703 final bool _usingProxy; 703 final bool _usingProxy;
704 704
705 Future<HttpClientResponse> _response;
706
705 // TODO(ajohnsen): Get default value from client? 707 // TODO(ajohnsen): Get default value from client?
706 bool _followRedirects = true; 708 bool _followRedirects = true;
707 709
708 int _maxRedirects = 5; 710 int _maxRedirects = 5;
709 711
710 List<RedirectInfo> _responseRedirects = []; 712 List<RedirectInfo> _responseRedirects = [];
711 713
712 _HttpClientRequest(_HttpOutgoing outgoing, 714 _HttpClientRequest(_HttpOutgoing outgoing,
713 Uri this.uri, 715 Uri this.uri,
714 String this.method, 716 String this.method,
715 bool this._usingProxy, 717 bool this._usingProxy,
716 _HttpClient this._httpClient, 718 _HttpClient this._httpClient,
717 _HttpClientConnection this._httpClientConnection) 719 _HttpClientConnection this._httpClientConnection)
718 : super("1.1", outgoing) { 720 : super("1.1", outgoing) {
719 // GET and HEAD have 'content-length: 0' by default. 721 // GET and HEAD have 'content-length: 0' by default.
720 if (method == "GET" || method == "HEAD") { 722 if (method == "GET" || method == "HEAD") {
721 contentLength = 0; 723 contentLength = 0;
722 } 724 }
723 } 725 }
724 726
725 Future<HttpClientResponse> get response => _responseCompleter.future; 727 Future<HttpClientResponse> get response {
728 if (_response == null) {
729 _response = Future.wait([_responseCompleter.future, super.done])
730 .then((list) => list[0]);
731 }
732 return _response;
733 }
734
735 Future<HttpClientResponse> get done => response;
736
737 Future<HttpClientResponse> pipe(Stream<List<int>> stream) {
738 super.pipe(stream);
739 return response;
740 }
726 741
727 Future<HttpClientResponse> close() { 742 Future<HttpClientResponse> close() {
728 super.close(); 743 super.close();
729 return response; 744 return response;
730 } 745 }
731 746
732 int get maxRedirects => _maxRedirects; 747 int get maxRedirects => _maxRedirects;
733 void set maxRedirects(int maxRedirects) { 748 void set maxRedirects(int maxRedirects) {
734 if (_headersWritten) throw new StateError("Request already sent"); 749 if (_headersWritten) throw new StateError("Request already sent");
735 _maxRedirects = maxRedirects; 750 _maxRedirects = maxRedirects;
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
986 // Look for credentials. 1001 // Look for credentials.
987 _Credentials cr = _httpClient._findCredentials(uri); 1002 _Credentials cr = _httpClient._findCredentials(uri);
988 if (cr != null) { 1003 if (cr != null) {
989 cr.authorize(request); 1004 cr.authorize(request);
990 } 1005 }
991 } 1006 }
992 // Start sending the request (lazy, delayed until the user provides 1007 // Start sending the request (lazy, delayed until the user provides
993 // data). 1008 // data).
994 _httpParser.responseToMethod = method; 1009 _httpParser.responseToMethod = method;
995 _streamFuture = outgoing.onStream((stream) { 1010 _streamFuture = outgoing.onStream((stream) {
996 // Sending request, set up response completer. 1011 return _socket.writeStream(stream)
997 _nextResponseCompleter = new Completer(); 1012 .then((s) {
1013 // Request sent, set up response completer.
1014 _nextResponseCompleter = new Completer();
998 1015
999 var requestFuture = _socket.writeStream(stream) 1016 // Listen for response.
1000 .catchError((e) { 1017 _nextResponseCompleter.future
1018 .then((incoming) {
1019 incoming.dataDone.then((_) {
1020 if (incoming.headers.persistentConnection &&
1021 request.persistentConnection) {
1022 // Return connection, now we are done.
1023 _httpClient._returnConnection(this);
1024 _subscription.resume();
1025 } else {
1026 destroy();
1027 }
1028 });
1029 request._onIncoming(incoming);
1030 })
1031 // If we see a state error, we failed to get the 'first'
1032 // element.
1033 // Transform the error to a HttpParserException, for
1034 // consistency.
1035 .catchError((error) {
1036 throw new HttpParserException(
1037 "Connection closed before data was received");
1038 }, test: (error) => error is StateError)
1039 .catchError((error) {
1040 // We are done with the socket.
1041 destroy();
1042 request._onError(error);
1043 });
1044
1045 // Resume the parser now we have a handler.
1046 _subscription.resume();
1047 return s;
1048 }, onError: (e) {
1001 destroy(); 1049 destroy();
1002 throw e; 1050 throw e;
1003 }); 1051 });
1004
1005 // Listen for response.
1006 _nextResponseCompleter.future
1007 .then((incoming) {
1008 incoming.dataDone.then((_) {
1009 if (incoming.headers.persistentConnection &&
1010 request.persistentConnection) {
1011 // Be sure we have written the full request.
1012 requestFuture
1013 .then((_) {
1014 // Return connection, now we are done.
1015 _httpClient._returnConnection(this);
1016 _subscription.resume();
1017 },
1018 onError: (_) {
1019 // Already handled.
1020 });
1021 } else {
1022 destroy();
1023 }
1024 });
1025 request._onIncoming(incoming);
1026 })
1027 // If we see a state error, we failed to get the 'first' element.
1028 // Transform the error to a HttpParserException, for consistency.
1029 .catchError((error) {
1030 throw new HttpParserException(
1031 "Connection closed before data was received");
1032 }, test: (error) => error is StateError)
1033 .catchError((error) {
1034 // We are done with the socket.
1035 destroy();
1036 request._onError(error);
1037 });
1038 // Resume the parser now we have a handler.
1039 _subscription.resume();
1040 return requestFuture;
1041 }); 1052 });
1042 return request; 1053 return request;
1043 } 1054 }
1044 1055
1045 Future<Socket> detachSocket() { 1056 Future<Socket> detachSocket() {
1046 return _streamFuture 1057 return _streamFuture
1047 .then((_) => new _DetachedSocket(_socket, _httpParser.detachIncoming()), 1058 .then((_) => new _DetachedSocket(_socket, _httpParser.detachIncoming()),
1048 onError: (_) {}); 1059 onError: (_) {});
1049 } 1060 }
1050 1061
(...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after
1809 1820
1810 1821
1811 class _RedirectInfo implements RedirectInfo { 1822 class _RedirectInfo implements RedirectInfo {
1812 const _RedirectInfo(int this.statusCode, 1823 const _RedirectInfo(int this.statusCode,
1813 String this.method, 1824 String this.method,
1814 Uri this.location); 1825 Uri this.location);
1815 final int statusCode; 1826 final int statusCode;
1816 final String method; 1827 final String method;
1817 final Uri location; 1828 final Uri location;
1818 } 1829 }
OLDNEW
« no previous file with comments | « no previous file | tests/standalone/io/http_client_request_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698