【问题标题】:Golang - SignatureDoesNotMatch error from S3 when attempting GET requestGolang - 尝试 GET 请求时来自 S3 的 SignatureDoesNotMatch 错误
【发布时间】:2013-10-01 10:42:45
【问题描述】:

我正在尝试从http://freemusicarchive.org 下载曲目。一般来说,您可以通过将 /download 附加到轨道 URL 来下载文件,该 URL 会响应重定向到 S3 上的资产。

例如,试试这个链接: http://freemusicarchive.org//music//Zola_Jesus//Live_at_WFMU_on_Scott_McDowells_Show_1709//Odessa/download

要查看重定向,请将链接放在这里: http://www.wheregoes.com/retracer.php

我可以使用如下代码获取重定向位置:

req, err := http.NewRequest("GET", url, nil)
errHndlr(err)

transport := http.Transport{}
resp, err := transport.RoundTrip(req)
defer resp.Body.Close()
errHndlr(err)

redirect := resp.Header.Get("Location")

我已通过将重定向链接打印到控制台并将其复制/粘贴到我的浏览器来验证重定向链接是否有效,但是当我在同一个 url 上调用 http.Get 时,我从 AWS 收到“SignatureDoesNotMatch”错误。

如果有人能提供关于这里出了什么问题的见解,我将不胜感激。

【问题讨论】:

    标签: http amazon-web-services go urlencode


    【解决方案1】:

    想通了。 Go 在处理 url 时将 unicode 解析回纯文本。我需要使用 request.URL.Opaque。

    更多信息在这里:https://stackoverflow.com/a/17322831/733860

    问题与 Unicode 相关。我的命令中有一个 %2F(未显示在我的原始问题中),Go 正在转换为 / 应该保留为 %2F(cURL 正确地将其保留为 %2F)。将 %2F 更改为 %252F 解决了该问题。

    似乎在创建新的 HTTP 请求时,Go 会将您的 unicode 解析回纯文本,因此如果您提交给 HTTP 请求初始化程序的 URL 中有 %3D,它会将其转换为 =。我认为一个明显的解决方案是将 %253D 放入 URL 但显然 Go 中有一个错误会将 %3D 转换为 = 而不是 %25 转换为 %。我不得不使用不透明 URL 请求 (request.Url.Opaque) 来解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-29
      • 2016-11-02
      • 2021-12-26
      • 1970-01-01
      • 2014-02-03
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多