2013-09-25 93 views
3

我正在尝试从http://freemusicarchive.org下载一条轨道。一般而言,您可以通过将追加/下载文件下载到跟踪网址来下载文件,该网址会在S3上重定向到资产。Golang - 从S3尝试GET请求时出现SignatureDoesNotMatch错误

例如,尝试此链接: 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") 

我已通过将控制台打印到控制台并将其复制/粘贴到浏览器中来验证重定向链接的效果,但是当我在同一网址上调用http.Get时,我得到一个“Signatu reDoesNotMatch“来自AWS的错误。

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

回答

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

相关问题