@@ -56,6 +56,9 @@ class _TaskTracker {
56
56
final responseCompleter = Completer <URLResponse >();
57
57
final BaseRequest request;
58
58
final StreamController <Uint8List > responseController;
59
+
60
+ /// Whether the response stream subscription has been cancelled.
61
+ bool responseListenerCancelled = false ;
59
62
final HttpClientRequestProfile ? profile;
60
63
int numRedirects = 0 ;
61
64
Uri ? lastUrl; // The last URL redirected to.
@@ -211,6 +214,7 @@ class CupertinoClient extends BaseClient {
211
214
taskTracker.responseCompleter.completeError (exception);
212
215
}
213
216
} else {
217
+ assert (error == null || taskTracker.responseListenerCancelled);
214
218
assert (taskTracker.profile == null ||
215
219
taskTracker.profile! .requestData.endTime != null );
216
220
@@ -226,6 +230,7 @@ class CupertinoClient extends BaseClient {
226
230
227
231
static void _onData (URLSession session, URLSessionTask task, NSData data) {
228
232
final taskTracker = _tracker (task);
233
+ if (taskTracker.responseListenerCancelled) return ;
229
234
taskTracker.responseController.add (data.toList ());
230
235
taskTracker.profile? .responseData.bodySink.add (data.toList ());
231
236
}
@@ -366,6 +371,9 @@ class CupertinoClient extends BaseClient {
366
371
request.headers.forEach (urlRequest.setValueForHttpHeaderField);
367
372
final task = urlSession.dataTaskWithRequest (urlRequest);
368
373
final subscription = StreamController <Uint8List >(onCancel: () {
374
+ final taskTracker = _tasks[task];
375
+ if (taskTracker == null ) return ;
376
+ taskTracker.responseListenerCancelled = true ;
369
377
task.cancel ();
370
378
});
371
379
final taskTracker = _TaskTracker (request, subscription, profile);
0 commit comments