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));