我遇到了一个看似微不足道的问题,但我花了几个小时来解决它,但没有任何帮助。 首先,除了在我的机器上之外,我无法在任何地方重现它。
出于某种原因,当 go mod 尝试接收有关模块的元数据时,它会得到 404 而不是 200。
$ go mod download -x gitlab.com/secret/secret-repo/v2@latest
# get https://gitlab.com/secret/secret-repo/v2?go-get=1
# get https://gitlab.com/secret/secret-repo/v2?go-get=1: 404 Not Found (0.256s)
如果我在同一个 bash 会话中运行curl,我会得到简单的 200 OK
$ curl -o /dev/null -s -w "%{http_code}\n" https://gitlab.com/secret/secret-repo/v2?go-get=1
200
你对如何调试这样的东西有什么想法吗?
-x
没有多大帮助
我尝试在另一台机器上重现此问题,但无法重现。即使使用同一台机器,当我运行 docker 映像时,
go mod
也会得到 200 OK
$ go mod download -x gitlab.com/secret/secret-repo/v2@latest
# get https://proxy.golang.org/gitlab.com/secret/secret-repo/v2/@v/list
# get https://proxy.golang.org/gitlab.com/secret/secret-repo/v2/@v/list: 404 Not Found (2.142s)
# get https://gitlab.com/secret/secret-repo/v2?go-get=1
# get https://gitlab.com/secret/secret-repo/v2?go-get=1: 200 OK (0.215s)
我只是不知道如何进一步调试
go mod
。另外,它忽略 http_proxy 或 HTTP_PROXY 变量,因此我不知道如何正确地使其与 mitmproxy 一起使用。
我尝试过的其他事情:为另一个用户尝试相同的命令,它可以返回 200 OK。
当我登录到我的用户 shell 时,即使非侵入式
su myuser -s /bin/sh
具有几乎相同的环境,它仍然返回 404。我只是不知道如何进一步调试它。
看起来您的
$HOME/.netrc
中有一些无效的 HTTP 凭据,因此当您 go mod download
您的私有模块时,go 命令使用这些凭据进行身份验证,给您一个 404。另一方面,curl 不使用您的默认情况下,.netrc 凭据(并且您测试的其他环境和 Docker 构建无法访问您的 .netrc),因此您会在那里得到 200 响应。