Unverified Commit a772d4d3 authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

retry on HttpException (#34526)

parent ac2f85bb
...@@ -48,6 +48,7 @@ export 'dart:io' ...@@ -48,6 +48,7 @@ export 'dart:io'
HttpClientRequest, HttpClientRequest,
HttpClientResponse, HttpClientResponse,
HttpClientResponseCompressionState, HttpClientResponseCompressionState,
HttpException,
HttpHeaders, HttpHeaders,
HttpRequest, HttpRequest,
HttpServer, HttpServer,
......
...@@ -64,6 +64,9 @@ Future<List<int>> _attempt(Uri url, { bool onlyHeaders = false }) async { ...@@ -64,6 +64,9 @@ Future<List<int>> _attempt(Uri url, { bool onlyHeaders = false }) async {
} on SocketException catch (error) { } on SocketException catch (error) {
printTrace('Download error: $error'); printTrace('Download error: $error');
return null; return null;
} on HttpException catch (error) {
printTrace('Download error: $error');
return null;
} }
final HttpClientResponse response = await request.close(); final HttpClientResponse response = await request.close();
// If we're making a HEAD request, we're only checking to see if the URL is // If we're making a HEAD request, we're only checking to see if the URL is
......
...@@ -105,6 +105,32 @@ void main() { ...@@ -105,6 +105,32 @@ void main() {
), ),
}); });
testUsingContext('retry from HttpException', () async {
String error;
FakeAsync().run((FakeAsync time) {
fetchUrl(Uri.parse('http://example.invalid/')).then((List<int> value) {
error = 'test completed unexpectedly';
}, onError: (dynamic exception) {
error = 'test failed unexpectedly: $exception';
});
expect(testLogger.statusText, '');
time.elapse(const Duration(milliseconds: 10000));
expect(testLogger.statusText,
'Download failed -- attempting retry 1 in 1 second...\n'
'Download failed -- attempting retry 2 in 2 seconds...\n'
'Download failed -- attempting retry 3 in 4 seconds...\n'
'Download failed -- attempting retry 4 in 8 seconds...\n',
);
});
expect(testLogger.errorText, isEmpty);
expect(error, isNull);
expect(testLogger.traceText, contains('Download error: HttpException'));
}, overrides: <Type, Generator>{
HttpClientFactory: () => () => MockHttpClientThrowing(
const io.HttpException('test exception handling'),
),
});
testUsingContext('max attempts', () async { testUsingContext('max attempts', () async {
String error; String error;
List<int> actualResult; List<int> actualResult;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment