Возврат ответов перенаправления http в R с использованием httr, когда в соединении отказано / состояние выхода с ненулевым скручиванием - PullRequest
0 голосов
/ 01 мая 2020

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 объект / вложенный список, который можно было бы передать в другую функцию (т. Е. Я ищу автоматизированное решение, чтобы иметь возможность создать возможный интересующий файл).

...