]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: fix RoundTrip context cancellation for js/wasm
authorAndy Nitschke <anitschk@mathworks.com>
Tue, 10 Jun 2025 15:09:35 +0000 (11:09 -0400)
committerDamien Neil <dneil@google.com>
Fri, 27 Jun 2025 15:23:27 +0000 (08:23 -0700)
The existing js/wasm implementation of RoundTrip calls abort() on the
fetch() call when the context is canceled but does not wait for for the
resulting promise to be rejected. The result is the failure callback for the
promise will be called at some later point in time when the promise
rejection is handled. In some case this callback may be called after the Go
program has exited resulting in "Go program has already exited" errors.

Fixes #57098

Change-Id: Ia37fd22cb9f667dbb0805ff5db0ceb8fdba7246b
Reviewed-on: https://go-review.googlesource.com/c/go/+/680937
Reviewed-by: Damien Neil <dneil@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
src/net/http/roundtrip_js.go

index 04c241eb4c006abe580cc23d7589489809152b00..7ae94617bcfb583cd24cd7d750cba48b777624d7 100644 (file)
@@ -236,6 +236,14 @@ func (t *Transport) RoundTrip(req *Request) (*Response, error) {
                if !ac.IsUndefined() {
                        // Abort the Fetch request.
                        ac.Call("abort")
+
+                       // Wait for fetch promise to be rejected prior to exiting. See
+                       // https://github.com/golang/go/issues/57098 for more details.
+                       select {
+                       case resp := <-respCh:
+                               resp.Body.Close()
+                       case <-errCh:
+                       }
                }
                return nil, req.Context().Err()
        case resp := <-respCh: