fix: prevent crash when aborting a request with a non-stream body - #1911
Closed
marceli1404 wants to merge 1 commit into
Closed
marceli1404 wants to merge 1 commit into
marceli1404 wants to merge 1 commit into
Conversation
Author
|
Note on overlap: this addresses the same root cause as the earlier open PR #1852 (\ix crash on abort when body is not a stream) and issue #1801.
This bug otherwise needs no further coordination on my side — both approaches fix the same crash. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bug
Calling
fetch()with a non-stream body (string, Buffer, Blob, URLSearchParams, etc.) and an already-abortedAbortControllercrashes the process:The fetch promise rejects cleanly with
AbortError, but the process still dies because the internally-createdStream.Readable.from(body)has no'error'listener.Root cause
In the
Bodyconstructor, the'error'handler is attached only when the originalbodyis aStream:For non-stream bodies, the actual stream used at runtime is
Stream.Readable.from(...), which never gets a listener. Whenabort()callsrequest.body.destroy(error)on that un-listened stream, the error event is unhandled.Fix
Attach the handler to
stream(the value actually used) instead ofbody:For stream bodies
stream === body, so existing behavior is unchanged; for non-stream bodies the internally-created stream now gets the same handler.Verification
AbortControllerdescribe block: 32 passing.