diff --git a/pkgs/cupertino_http/example/integration_test/client_profile_test.dart b/pkgs/cupertino_http/example/integration_test/client_profile_test.dart index eba570d800..ce59029078 100644 --- a/pkgs/cupertino_http/example/integration_test/client_profile_test.dart +++ b/pkgs/cupertino_http/example/integration_test/client_profile_test.dart @@ -308,11 +308,7 @@ void main() { expect(profile.requestData.contentLength, isNull); expect(profile.requestData.startTime, isNotNull); expect(profile.requestData.endTime, isNotNull); - // Extra data could be received before the cancel event is dispatched - // by the url loading framework so check that - // `profile.responseData.bodyBytes` starts with `receivedData`. - expect(profile.responseData.bodyBytes.sublist(0, receivedData.length), - receivedData); + expect(profile.responseData.bodyBytes, receivedData); }); }); diff --git a/pkgs/cupertino_http/lib/src/cupertino_client.dart b/pkgs/cupertino_http/lib/src/cupertino_client.dart index 7e592eb3e6..6273c48518 100644 --- a/pkgs/cupertino_http/lib/src/cupertino_client.dart +++ b/pkgs/cupertino_http/lib/src/cupertino_client.dart @@ -56,6 +56,9 @@ class _TaskTracker { final responseCompleter = Completer(); final BaseRequest request; final StreamController responseController; + + /// Whether the response stream subscription has been cancelled. + bool responseListenerCancelled = false; final HttpClientRequestProfile? profile; int numRedirects = 0; Uri? lastUrl; // The last URL redirected to. @@ -211,6 +214,7 @@ class CupertinoClient extends BaseClient { taskTracker.responseCompleter.completeError(exception); } } else { + assert(error == null || taskTracker.responseListenerCancelled); assert(taskTracker.profile == null || taskTracker.profile!.requestData.endTime != null); @@ -226,6 +230,7 @@ class CupertinoClient extends BaseClient { static void _onData(URLSession session, URLSessionTask task, NSData data) { final taskTracker = _tracker(task); + if (taskTracker.responseListenerCancelled) return; taskTracker.responseController.add(data.toList()); taskTracker.profile?.responseData.bodySink.add(data.toList()); } @@ -366,6 +371,9 @@ class CupertinoClient extends BaseClient { request.headers.forEach(urlRequest.setValueForHttpHeaderField); final task = urlSession.dataTaskWithRequest(urlRequest); final subscription = StreamController(onCancel: () { + final taskTracker = _tasks[task]; + if (taskTracker == null) return; + taskTracker.responseListenerCancelled = true; task.cancel(); }); final taskTracker = _TaskTracker(request, subscription, profile);