3

我正在尝试从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”错误。

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

4

1 回答 1

5

弄清楚了。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) 来解决这个问题。

于 2013-09-25T18:37:47.553 回答