3

http://freemusicarchive.orgからトラックをダウンロードしようとしています。一般的に言えば、トラック URL に /download を追加することでファイルをダウンロードできます。これは、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

問題はユニコード関連でした。私のコマンドには %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 に答える