Committed by
GitHub
Merge pull request #1730 from jasonlaw/master
Fixed timeout issue
Showing
4 changed files
with
23 additions
and
3 deletions
@@ -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 | } |
-
Please register or login to post a comment