Jonny Borges
Committed by GitHub

Merge pull request #1730 from jasonlaw/master

Fixed timeout issue
@@ -205,6 +205,7 @@ class GetHttpClient { @@ -205,6 +205,7 @@ class GetHttpClient {
205 if (authenticate) await _modifier.authenticator!(request); 205 if (authenticate) await _modifier.authenticator!(request);
206 final newRequest = await _modifier.modifyRequest<T>(request); 206 final newRequest = await _modifier.modifyRequest<T>(request);
207 207
  208 + _httpClient.timeout = timeout;
208 var response = await _httpClient.send<T>(newRequest); 209 var response = await _httpClient.send<T>(newRequest);
209 210
210 final newResponse = 211 final newResponse =
@@ -23,6 +23,9 @@ class HttpRequestImpl implements HttpRequestBase { @@ -23,6 +23,9 @@ class HttpRequestImpl implements HttpRequestBase {
23 ///on different sites. The default is false 23 ///on different sites. The default is false
24 final bool withCredentials; 24 final bool withCredentials;
25 25
  26 + @override
  27 + Duration? timeout;
  28 +
26 /// Sends an HTTP request and asynchronously returns the response. 29 /// Sends an HTTP request and asynchronously returns the response.
27 @override 30 @override
28 Future<Response<T>> send<T>(Request<T> request) async { 31 Future<Response<T>> send<T>(Request<T> request) async {
@@ -30,6 +33,7 @@ class HttpRequestImpl implements HttpRequestBase { @@ -30,6 +33,7 @@ class HttpRequestImpl implements HttpRequestBase {
30 html.HttpRequest xhr; 33 html.HttpRequest xhr;
31 34
32 xhr = html.HttpRequest() 35 xhr = html.HttpRequest()
  36 + ..timeout = timeout?.inMilliseconds
33 ..open(request.method, '${request.url}', async: true); // check this 37 ..open(request.method, '${request.url}', async: true); // check this
34 38
35 _xhrs.add(xhr); 39 _xhrs.add(xhr);
@@ -8,4 +8,12 @@ abstract class HttpRequestBase { @@ -8,4 +8,12 @@ abstract class HttpRequestBase {
8 8
9 /// Closes the [Request] and cleans up any resources associated with it. 9 /// Closes the [Request] and cleans up any resources associated with it.
10 void close(); 10 void close();
  11 +
  12 + /// Gets and sets the timeout.
  13 + ///
  14 + /// For mobile, this value will be applied for both connection and request
  15 + /// timeout.
  16 + ///
  17 + /// For web, this value will be the request timeout.
  18 + Duration? timeout;
11 } 19 }
@@ -34,16 +34,20 @@ class HttpRequestImpl extends HttpRequestBase { @@ -34,16 +34,20 @@ class HttpRequestImpl extends HttpRequestBase {
34 @override 34 @override
35 Future<Response<T>> send<T>(Request<T> request) async { 35 Future<Response<T>> send<T>(Request<T> request) async {
36 var stream = request.bodyBytes.asBroadcastStream(); 36 var stream = request.bodyBytes.asBroadcastStream();
37 - 37 + io.HttpClientRequest? ioRequest;
38 try { 38 try {
39 - var ioRequest = (await _httpClient!.openUrl(request.method, request.url)) 39 + _httpClient!.connectionTimeout = timeout;
  40 + ioRequest = (await _httpClient!.openUrl(request.method, request.url))
40 ..followRedirects = request.followRedirects 41 ..followRedirects = request.followRedirects
41 ..persistentConnection = request.persistentConnection 42 ..persistentConnection = request.persistentConnection
42 ..maxRedirects = request.maxRedirects 43 ..maxRedirects = request.maxRedirects
43 ..contentLength = request.contentLength ?? -1; 44 ..contentLength = request.contentLength ?? -1;
44 request.headers.forEach(ioRequest.headers.set); 45 request.headers.forEach(ioRequest.headers.set);
45 46
46 - var response = await stream.pipe(ioRequest) as io.HttpClientResponse; 47 + var response = timeout == null
  48 + ? await stream.pipe(ioRequest) as io.HttpClientResponse
  49 + : await stream.pipe(ioRequest).timeout(timeout!)
  50 + as io.HttpClientResponse;
47 51
48 var headers = <String, String>{}; 52 var headers = <String, String>{};
49 response.headers.forEach((key, values) { 53 response.headers.forEach((key, values) {
@@ -68,6 +72,9 @@ class HttpRequestImpl extends HttpRequestBase { @@ -68,6 +72,9 @@ class HttpRequestImpl extends HttpRequestBase {
68 body: body, 72 body: body,
69 bodyString: stringBody, 73 bodyString: stringBody,
70 ); 74 );
  75 + } on TimeoutException catch (_) {
  76 + ioRequest?.abort();
  77 + rethrow;
71 } on io.HttpException catch (error) { 78 } on io.HttpException catch (error) {
72 throw GetHttpException(error.message, error.uri); 79 throw GetHttpException(error.message, error.uri);
73 } 80 }