Golang-SignatureDoesNotMatch ошибка из S3 при попытке получить запрос


Я пытаюсь загрузить трек из http://freemusicarchive.org вообще говоря, вы можете загрузить файл, добавив /download к 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")
Я проверил, что ссылка перенаправления работает, распечатав ее на консоль и скопировав / вставив ее в мой браузер, но когда я вызываю http.Попадая на тот же url, я получаю ошибку "SignatureDoesNotMatch" от AWS. Если кто-то может предложить понимание того, что здесь происходит неправильно, я был бы очень признателен.
1 3

1 ответ:

Понял это. Go анализирует unicode обратно в обычный текст при обработке url-адреса. Мне нужно было использовать запрос.URL-АДРЕС.Непрозрачный.

Подробнее здесь: https://stackoverflow.com/a/17322831/733860

Проблема была связана с юникодом. В моей команде был %2F (не отображаемый в моем исходном вопросе), который Go преобразовывал в/, который должен был быть оставлен как %2F (cURL правильно оставил его как %2F). Изменение %2F на %252F исправило проблему.

Он также появляется что при создании нового HTTP-запроса Go будет анализировать ваш unicode обратно в обычный текст, поэтому, если у вас есть %3D в URL, который вы отправляете инициализатору HTTP-запроса, он преобразует его в =. Я думал, что очевидным решением будет поместить %253D в URL, но, по-видимому, в Go есть ошибка, которая преобразует %3D В=, но не %25 в %. Мне пришлось использовать непрозрачный URL-запрос (request.Url-адрес.Непрозрачный), чтобы обойти это.