Skip to content

Commit dfbe73d

Browse files
authored
Ignore received data after the response stream has been closed (#1766)
1 parent 78d6114 commit dfbe73d

File tree

2 files changed

+9
-5
lines changed

2 files changed

+9
-5
lines changed

pkgs/cupertino_http/example/integration_test/client_profile_test.dart

+1-5
Original file line numberDiff line numberDiff line change
@@ -308,11 +308,7 @@ void main() {
308308
expect(profile.requestData.contentLength, isNull);
309309
expect(profile.requestData.startTime, isNotNull);
310310
expect(profile.requestData.endTime, isNotNull);
311-
// Extra data could be received before the cancel event is dispatched
312-
// by the url loading framework so check that
313-
// `profile.responseData.bodyBytes` starts with `receivedData`.
314-
expect(profile.responseData.bodyBytes.sublist(0, receivedData.length),
315-
receivedData);
311+
expect(profile.responseData.bodyBytes, receivedData);
316312
});
317313
});
318314

pkgs/cupertino_http/lib/src/cupertino_client.dart

+8
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)