aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan C. Mills <bcmills@google.com>2023-08-09 17:14:30 -0400
committerMichael Knyszek <mknyszek@google.com>2023-08-11 14:53:49 +0000
commit75d8be5fb4cbc1a539a99557cef93dcdef997bf5 (patch)
treef0d6fe5acece90e66bcf9fcbc2762455eb44e479
parent1755d1455977cb9dc6cdfa032dfd1c370e2a4097 (diff)
downloadgo-75d8be5fb4cbc1a539a99557cef93dcdef997bf5.tar.gz
go-75d8be5fb4cbc1a539a99557cef93dcdef997bf5.zip
[release-branch.go1.21] cmd/go/internal/web: release the net token when an HTTP request fails due to CheckRedirect
Updates #61877. Fixes #61905. Change-Id: I38c63565aaf9dc9b0c8085974521daccfbcbc790 Reviewed-on: https://go-review.googlesource.com/c/go/+/518015 Reviewed-by: Michael Matloob <matloob@golang.org> Run-TryBot: Bryan Mills <bcmills@google.com> Auto-Submit: Bryan Mills <bcmills@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> (cherry picked from commit 8cb5c55118a8273e1cc605b8ba167297808c4eda) Reviewed-on: https://go-review.googlesource.com/c/go/+/518395
-rw-r--r--src/cmd/go/internal/web/http.go20
-rw-r--r--src/cmd/go/testdata/script/mod_get_insecure_redirect.txt19
2 files changed, 32 insertions, 7 deletions
diff --git a/src/cmd/go/internal/web/http.go b/src/cmd/go/internal/web/http.go
index 76b767c751..4fc939a30d 100644
--- a/src/cmd/go/internal/web/http.go
+++ b/src/cmd/go/internal/web/http.go
@@ -212,16 +212,22 @@ func get(security SecurityMode, url *urlpkg.URL) (*Response, error) {
}
}
- if res == nil || res.Body == nil {
+ if err != nil {
+ // Per the docs for [net/http.Client.Do], “On error, any Response can be
+ // ignored. A non-nil Response with a non-nil error only occurs when
+ // CheckRedirect fails, and even then the returned Response.Body is
+ // already closed.”
release()
- } else {
- body := res.Body
- res.Body = hookCloser{
- ReadCloser: body,
- afterClose: release,
- }
+ return nil, nil, err
}
+ // “If the returned error is nil, the Response will contain a non-nil Body
+ // which the user is expected to close.”
+ body := res.Body
+ res.Body = hookCloser{
+ ReadCloser: body,
+ afterClose: release,
+ }
return url, res, err
}
diff --git a/src/cmd/go/testdata/script/mod_get_insecure_redirect.txt b/src/cmd/go/testdata/script/mod_get_insecure_redirect.txt
new file mode 100644
index 0000000000..a503c914e3
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_get_insecure_redirect.txt
@@ -0,0 +1,19 @@
+# golang.org/issue/29591: 'go get' was following plain-HTTP redirects even without -insecure (now replaced by GOINSECURE).
+# golang.org/issue/61877: 'go get' would panic in case of an insecure redirect in module mode
+
+[!git] skip
+
+env GOPRIVATE=vcs-test.golang.org
+
+! go get -d vcs-test.golang.org/insecure/go/insecure
+stderr 'redirected .* to insecure URL'
+
+[short] stop 'builds a git repo'
+
+env GOINSECURE=vcs-test.golang.org/insecure/go/insecure
+go get -d vcs-test.golang.org/insecure/go/insecure
+
+-- go.mod --
+module example
+go 1.21
+