@@ -56,6 +56,9 @@ class _TaskTracker {
5656 final responseCompleter = Completer <URLResponse >();
5757 final BaseRequest request;
5858 final StreamController <Uint8List > responseController;
59+
60+ /// Whether the response stream subscription has been cancelled.
61+ bool responseListenerCancelled = false ;
5962 final HttpClientRequestProfile ? profile;
6063 int numRedirects = 0 ;
6164 Uri ? lastUrl; // The last URL redirected to.
@@ -211,6 +214,7 @@ class CupertinoClient extends BaseClient {
211214 taskTracker.responseCompleter.completeError (exception);
212215 }
213216 } else {
217+ assert (error == null || taskTracker.responseListenerCancelled);
214218 assert (taskTracker.profile == null ||
215219 taskTracker.profile! .requestData.endTime != null );
216220
@@ -226,6 +230,7 @@ class CupertinoClient extends BaseClient {
226230
227231 static void _onData (URLSession session, URLSessionTask task, NSData data) {
228232 final taskTracker = _tracker (task);
233+ if (taskTracker.responseListenerCancelled) return ;
229234 taskTracker.responseController.add (data.toList ());
230235 taskTracker.profile? .responseData.bodySink.add (data.toList ());
231236 }
@@ -366,6 +371,9 @@ class CupertinoClient extends BaseClient {
366371 request.headers.forEach (urlRequest.setValueForHttpHeaderField);
367372 final task = urlSession.dataTaskWithRequest (urlRequest);
368373 final subscription = StreamController <Uint8List >(onCancel: () {
374+ final taskTracker = _tasks[task];
375+ if (taskTracker == null ) return ;
376+ taskTracker.responseListenerCancelled = true ;
369377 task.cancel ();
370378 });
371379 final taskTracker = _TaskTracker (request, subscription, profile);
0 commit comments