Repository navigation
[http] Don't throw in RetryClient when when has read the response stream - #2040
Conversation
|
I think that this only fixes the issue if /// If [when] reads the response body (via `(response as StreamedResponse).stream`),
/// it is responsible for draining or cancelling the stream. A body can only be
/// read once, so if [when] returns `false`, reading the returned response's body
/// (including through [get], [post], etc.) will throw a [StateError].@blaugold - I think that fixing the issue the wrap you wrote it would require buffering the entire stream. Is this PR with the warning about |
|
Thanks @brianquinlan, you're right: this only helps when I added your wording to the |
| /// `(response as StreamedResponse).stream`), it is responsible for draining | ||
| /// or cancelling the stream. A body can only be read once, so if [when] | ||
| /// returns `false`, reading the returned response's body (including through | ||
| /// [get], [post], etc.) will throw a [StateError]. |
There was a problem hiding this comment.
| /// [get], [post], etc.) will throw a [StateError]. | |
| /// [RetryClient.get], [RetryClient.post], etc.) will throw a [StateError]. |
|
Thanks, applied your suggestion in b992dc9 ( |
|
@ChandraChaan thank you! |
Revisions updated by `dart tools/rev_sdk_deps.dart`. dartdoc (https://github.com/dart-lang/dartdoc/compare/2f6847b..03ec6df): 03ec6df6 Thu Nov 5 11:12:45 2026 +0200 Sergey G. Grekhov Add tests for type parameters (dart-lang/dartdoc#4308) 14a91302 Tue Nov 3 04:24:32 2026 +0100 Moritz Migrate to ecosystem health publish check and setup-dart publish workflow (dart-lang/dartdoc#4310) cd8bf52c Mon Nov 2 14:19:25 2026 +0100 Sigurd Meldgaard Support standalone AOT compilation and embed resources in html_resources.g.dart (dart-lang/dartdoc#4298) cb1b1b2f Mon Nov 2 14:39:28 2026 +0200 Sergey G. Grekhov Add tests for parameters (dart-lang/dartdoc#4304) 07506415 Mon Nov 2 12:14:22 2026 +0100 dependabot[bot] Bump the github-actions group across 1 directory with 3 updates (dart-lang/dartdoc#4311) 494aec7f Mon Nov 2 12:14:05 2026 +0100 Sarah Zakarias Add a "Documentation inherited from" note to inherited doc comments (dart-lang/dartdoc#4309) 527502a9 Mon Nov 2 11:21:46 2026 +0100 Sarah Zakarias Give the mock SDK the version of the SDK running the tests (dart-lang/dartdoc#4312) http (https://github.com/dart-lang/http/compare/1f869d0..4646fe6): 4646fe6 Thu Nov 5 02:41:04 2026 +0530 Chandra ObulaReddy [http] Don't throw in RetryClient when `when` has read the response stream (dart-lang/http#2040) native (https://github.com/dart-lang/native/compare/1838637..6287745): 6287745ca Thu Nov 5 20:37:11 2026 +0800 Dz [hooks_runner] Fix UTF-8 decoding of hook output on Windows (dart-lang/native#3772) 0eada93f9 Thu Nov 5 19:18:09 2026 +0800 Dz [native_toolchain_c] Decode vswhere UTF-8 output correctly on Windows (dart-lang/native#3773) Change-Id: If15b14dac054320ded19f0633a71b77463b9b718 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/574640 Auto-Submit: Nate Bosch <[email protected]> Commit-Queue: Nicholas Shahan <[email protected]> Reviewed-by: Nicholas Shahan <[email protected]>
Before retrying,
RetryClient.senddrains the discarded response withresponse.stream.listen(...)so the connection isn't left open. The response stream is single-subscription, so if thewhencallback already read the body (for example to retry on a specific error payload),listenthrowsBad state: Stream has already been listened toand the whole request fails instead of being retried.The drain is now wrapped in
try/on StateError. Ifwhenalready listened, it has consumed or cancelled the stream itself, so there is nothing left to drain. I catch onlyStateErrorrather than everything, so unrelated errors still surface. A single-subscriptionStreamcan't be asked whether it already has a listener, so this needs an// ignore: avoid_catching_errors, aspackage:http2's hpack.dart already does.Added a test where
whenreads the body of a 503 to decide to retry; it threw before this change and now gets the 200 from the second attempt. Changelog entry added under 1.7.0-wip.Fixes #1226