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