Specifi c Вопрос
Если я использую httr::HEAD
(или GET
) и следую перенаправления, но выдает ошибку при доступе к окончательному URL (например, отказано в соединении), есть ли способ вернуть информацию заголовка для ответа, вызвавшего ошибку?
Более общая задача, которую я пытаюсь решить
У меня сокращенный URL-адрес, и мне нужно получить имя хоста, которое в конечном итоге перенаправляет на. Более конкретно, у меня есть сегмент S3 (например, https://mys3.s3.amazonaws.com/root
), обслуживающий содержимое stati c, на которое указывает сокращенная ссылка (например, go/mys3
). Я хочу получить контент в одном из подкаталогов (например, в конечном итоге сделать запрос GET
на https://mys3.s3.amazonaws.com/root/special/file.txt
). Мне нужно имя хоста, чтобы добавить указанный c путь.
Контекст и фон
Если я попытаюсь httr::HEAD
непосредственно по сокращенному URL, я получу ошибку:
httr::HEAD("go/myS3")
#>Error in curl::curl_fetch_memory(url, handle = handle) :
#> Failed to connect to mys3.s3.amazonaws.com port 443: Connection refused
Если я использую curl
в shell, я получаю ту же ошибку, но возвращаю все заголовки перенаправления (можно увидеть, что на самом деле существует несколько перенаправлений)
curl -LI go/mys3
> HTTP/1.1 302 Moved Temporarily
> Server: nginx
> Date: Fri, 01 May 2020 19:35:20 GMT
> Content-Type: text/html
> Content-Length: 154
> Connection: keep-alive
> Location: https://go.links.com/mys3
>
> HTTP/1.1 302 Found
> Server: nginx
> Date: Fri, 01 May 2020 19:35:20 GMT
> Content-Type: text/plain; charset=utf-8
> Content-Length: 76
> Connection: keep-alive
> Cache-Control: private, no-cache, no-store, must-revalidate
> Expires: -1
> Pragma: no-cache
> Location: https://mys3.s3.amazonaws.com/root/
> Vary: Accept, Accept-Encoding
>
> curl: (7) Failed to connect to mys3.s3.amazonaws.com port 443: Connection refused
Ошибка curl имеет смысл, поскольку корзина S3 принимает запрос, исходящий только с определенного IP спектр. Я могу использовать прокси-сервер для получения файла позже, но если я использую его для разрешения укороченного URL-адреса, я получаю ошибку 502 неверного шлюза
httr::HEAD("go/mys3", httr::use_proxy("64.251.21.73", 8080))
#> Response [http://go/mys3]
#> Date: 2020-05-01 15:49
#> Status: 502
#> Content-Type: text/html
#> <EMPTY BODY>
Есть ли способ получить httr
return вся информация о перенаправлении, похожая на curl
, а не только последнее сообщение об ошибке?
Я знаю, что мог бы использовать system2
для прямого вызова curl
(или использовать httr::verbose
config), но это возвращает ответ в виде строки. Я хотел бы воспользоваться преимуществом httr
разбора его в response
объект / вложенный список, который можно было бы передать в другую функцию (т. Е. Я ищу автоматизированное решение, чтобы иметь возможность создать возможный интересующий файл).