Guard all completions with checks
diff --git a/lib/src/io_client.dart b/lib/src/io_client.dart
index 90809fe..590b831 100644
--- a/lib/src/io_client.dart
+++ b/lib/src/io_client.dart
@@ -39,8 +39,10 @@
void Function() onTimeout;
if (contentTimeout != null) {
onTimeout = () {
- completer
- .completeError(TimeoutException('Request aborted', contentTimeout));
+ if (!completer.isCompleted) {
+ completer.completeError(
+ TimeoutException('Request aborted', contentTimeout));
+ }
};
timer = Timer(contentTimeout, () {
onTimeout();
@@ -60,8 +62,10 @@
if (contentTimeout != null) {
onTimeout = () {
ioRequest.abort();
- completer.completeError(
- TimeoutException('Request aborted', contentTimeout));
+ if (!completer.isCompleted) {
+ completer.completeError(
+ TimeoutException('Request aborted', contentTimeout));
+ }
};
}
@@ -91,15 +95,18 @@
sink.close();
}));
- completer.complete(IOStreamedResponse(responseStream, response.statusCode,
- contentLength:
- response.contentLength == -1 ? null : response.contentLength,
- request: request,
- headers: headers,
- isRedirect: response.isRedirect,
- persistentConnection: response.persistentConnection,
- reasonPhrase: response.reasonPhrase,
- inner: response));
+ if (!completer.isCompleted) {
+ completer.complete(IOStreamedResponse(
+ responseStream, response.statusCode,
+ contentLength:
+ response.contentLength == -1 ? null : response.contentLength,
+ request: request,
+ headers: headers,
+ isRedirect: response.isRedirect,
+ persistentConnection: response.persistentConnection,
+ reasonPhrase: response.reasonPhrase,
+ inner: response));
+ }
} on HttpException catch (error) {
if (completer.isCompleted) return;
completer.completeError(ClientException(error.message, error.uri));