Skip to content

Commit

Permalink
cmd/go/internal/modfetch: halt proxy fallback if the proxy returns a …
Browse files Browse the repository at this point in the history
…non-404/410 response for @latest

The @latest proxy endpoint is optional. If a proxy returns a 404 for
it, and returns an @v/list with no matching versions, then we should
allow module lookup to try other module paths. However, if the proxy
returns some other error (say, a 403 or 505), then the result of the
lookup is ambiguous, and we should report the actual error rather than
"no matching versions for query".

(This fix was prompted by discussion with Dmitri on CL 183619.)

Updates #32715
Updates #26334

Change-Id: I6d510a5ac24d48d9bc5037c3c747ac50695c663f
Reviewed-on: https://go-review.googlesource.com/c/go/+/183845
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
  • Loading branch information
Bryan C. Mills committed Jun 26, 2019
1 parent 070e2dd commit 4b41f7f
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 1 deletion.
4 changes: 3 additions & 1 deletion src/cmd/go/internal/modfetch/proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,9 @@ func (p *proxyRepo) Stat(rev string) (*RevInfo, error) {
func (p *proxyRepo) Latest() (*RevInfo, error) {
data, err := p.getBytes("@latest")
if err != nil {
// TODO return err if not 404
if !errors.Is(err, os.ErrNotExist) {
return nil, p.versionError("", err)
}
return p.latest()
}
info := new(RevInfo)
Expand Down
21 changes: 21 additions & 0 deletions src/cmd/go/testdata/script/mod_query_empty.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,20 @@ go list -m example.com/join/...
! stdout 'example.com/join/subpkg'
stdout 'example.com/join v1.1.0'

# If the proxy provides an empty @v/list but rejects @latest with
# some other explicit error (for example, a "permission denied" error),
# that error should be reported to the user (and override a successful
# result for other possible module paths).
#
# Depending on how the specific platform enforces permissions, the 'go get' may
# fail either due to the intended permission error or due to a parse error.
# We accept either failure message.
env GOPROXY=file:///$WORK/gatekeeper
chmod 0000 $WORK/gatekeeper/example.com/join/subpkg/@latest
cp go.mod.orig go.mod
! go get -d example.com/join/subpkg
stderr 'go get example.com/join/subpkg: module example.com/join/subpkg: (invalid character .+|reading file://.*/gatekeeper/example.com/join/subpkg/@latest: .+)'

-- go.mod.orig --
module example.com/othermodule
go 1.13
Expand All @@ -50,3 +64,10 @@ v1.0.0-does-not-exist
v1.1.0
-- $WORK/notfound/example.com/join/@v/v1.1.0.info --
{"Version": "v1.1.0"}
-- $WORK/gatekeeper/example.com/join/subpkg/@v/list --
-- $WORK/gatekeeper/example.com/join/subpkg/@latest --
ERROR: Latest version is forbidden.
-- $WORK/gatekeeper/example.com/join/@v/list --
v1.1.0
-- $WORK/gatekeeper/example.com/join/@v/v1.1.0.info --
{"Version": "v1.1.0"}

0 comments on commit 4b41f7f

Please sign in to comment.