Guard all completions with checks
diff --git a/lib/src/browser_client.dart b/lib/src/browser_client.dart
index 46ad363..123b51e 100644
--- a/lib/src/browser_client.dart
+++ b/lib/src/browser_client.dart
@@ -55,7 +55,9 @@
if (timeout != null) {
timer = Timer(timeout, () {
toAbort?.abort();
- completer.completeError(TimeoutException('Request aborted', timeout));
+ if (!completer.isCompleted) {
+ completer.completeError(TimeoutException('Request aborted', timeout));
+ }
});
}
var bytes = await request.finalize().toBytes();
@@ -76,21 +78,25 @@
unawaited(xhr.onLoad.first.then((_) {
var body = (xhr.response as ByteBuffer).asUint8List();
timer?.cancel();
- completer.complete(StreamedResponse(
- ByteStream.fromBytes(body), xhr.status!,
- contentLength: body.length,
- request: request,
- headers: xhr.responseHeaders,
- reasonPhrase: xhr.statusText));
+ if (!completer.isCompleted) {
+ completer.complete(StreamedResponse(
+ ByteStream.fromBytes(body), xhr.status!,
+ contentLength: body.length,
+ request: request,
+ headers: xhr.responseHeaders,
+ reasonPhrase: xhr.statusText));
+ }
}));
unawaited(xhr.onError.first.then((_) {
// Unfortunately, the underlying XMLHttpRequest API doesn't expose any
// specific information about the error itself.
timer?.cancel();
- completer.completeError(
- ClientException('XMLHttpRequest error.', request.url),
- StackTrace.current);
+ if (!completer.isCompleted) {
+ completer.completeError(
+ ClientException('XMLHttpRequest error.', request.url),
+ StackTrace.current);
+ }
}));
xhr.send(bytes);