Golang - 尝试GET请求时来自S3的SignatureDoesNotMatch错误

时间:2013-09-25 17:43:53

标签: http amazon-web-services go urlencode

我正在尝试从http://freemusicarchive.org下载曲目。一般来说,您可以通过附加/下载到轨道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”错误。

如果有人能够提供有关此处出现问题的见解,我将非常感激。

1 个答案:

答案 0 :(得分:5)

想出来。在处理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)来解决这个问题。