curl 使用R,如何用'download.file'得到响应头?

4ioopgfo  于 2023-03-03  发布在  其他
关注(0)|答案(1)|浏览(147)

我有R 4.20+,所以我相信utils::download.file正在使用libcurl功能。
我可以用base::curlGetHeaders(url)得到url的头。
是否有一个参数可以传入download.file来返回头文件,这样我就不能在同一个调用中得到它们了。在引擎盖下,download.file在接收头文件时以某种方式处理它。
如何返回使用curlGetHeaders(url)download.file函数获得的响应头?
我知道外部包(例如,Rcurl),但要进行下载,必须在R:::base内接收标头。

更新

下面是来自R的源代码

"libcurl" = {
           headers <- if(length(headers)) paste0(nh, ": ", headers)
           status <- .Internal(curlDownload(url, destfile, quiet, mode, cacheOK,
                        headers))
       },

函数curlDownload在这里有传统的curl选项(libcurl.c):

curl_easy_setopt(hnd[i], CURLOPT_HTTPHEADER, headers);

设置头文件,而不是返回头文件。为什么原始curl函数不公开。CPHP一样公开它们...请参见
Can PHP cURL retrieve response headers AND body in a single request?

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
// ...

$response = curl_exec($ch);

所以我猜curlDownload需要:

curl_easy_setopt(hnd[i], CURLOPT_HEADER, 1);

库( curl )

在这个库中,在幕后使用了相同的语法。如何直接向我公开语法?来自download.c

curl_easy_setopt(handle, CURLOPT_URL, NULL);
  curl_easy_setopt(handle, CURLOPT_NOPROGRESS, 1);
  curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, NULL);
  curl_easy_setopt(handle, CURLOPT_WRITEDATA, NULL);
wz8daaqr

wz8daaqr1#

本文档提到了curl包中的handle_data函数。
https://cran.r-project.org/web/packages/curl/curl.pdf
例如,假设您需要在阅读所有行之前查看状态代码、内容类型或其他标头,一旦您有了一个工作连接,R中的许多其他函数将接受......您可以使用各种read.csv(x)read.delim(x)scan(x)等等。

library('curl');
h <- new_handle();
x <- curl('https://cran.r-project.org', handle=h);
open(x);
handle_data(h)$status_code;
handle_data(h)$type;
parse_headers(handle_data(h)$headers);
y <- readLines(x);
close(x);

相关问题