这些 Curl 文档:http://curl.haxx.se/docs/manpage.html#-d 列出了许多 bool 选项。

如何在 RCurl 的 postForm 调用中指定这些选项?例如,如何指定 --sslv3 标志?

我试过了

postForm(url, .opts = list(sslv3=TRUE))

但收到错误:
Warning message:
In mapCurlOptNames(names(.els), asNames = TRUE) :
  Unrecognized CURL options: sslv3

提前致谢。

解决方案

通过一些试验和错误,我发现这有效:
options(RCurlOptions = list(sslversion=3))
postForm(url)

如果有人能澄清如何将 Curl 选项转换为 RCurl 选项,将不胜感激!

最佳答案

Curl 代表一些东西 http://daniel.haxx.se/docs/curl-vs-libcurl.html 。这里的问题是您正在查看 curl 命令行工具的功能,而是想询问 libcurl 库如何实现某些功能。

RCurl 使用 libcurl 库。这可以通过 api 访问。此处列出了 api 中使用的“符号” http://curl.haxx.se/libcurl/c/symbols-in-versions.html 。我们可以将它们与 RCurl 列出的选项进行比较:

library(RCurl)

cInfo <- getURL("http://curl.haxx.se/libcurl/c/symbols-in-versions.html")
cInfo <- unlist(strsplit(cInfo, "\n"))
cInfo <- cInfo[grep("CURLOPT_", cInfo)]
cInfo <- gsub("([^[\\s]]*)\\s.*", "\\1", cInfo)
cInfo <- gsub("CURLOPT_", "", cInfo)
cInfo <- tolower(gsub("_", ".", cInfo))

listCurlOptions()[!listCurlOptions()%in%cInfo]

从上面我们可以看到,所有的 RCurl 选项都是从 libcurl api 符号派生出来的。这CURLOPT_ 被移除 _. 取代,字母被降级为小写。

然后出现了关于符号代表什么类型的问题。我通常只看
php 库文档来发现这一点。 http://php.net/manual/en/function.curl-setopt.php 列表
CURLOPT_SSLVERSION The SSL version (2 or 3) to use. By default PHP will try to determine this itself, although in some cases this must be set manually.
作为整数类型。期望值 2 或 3。

或者,您可以查看 curl_easy_setopt 手册页 http://curl.haxx.se/libcurl/c/curl_easy_setopt.html

CURLOPT_SSLVERSION

传递一个 long as 参数来控制尝试使用的 SSL/TLS 版本。可用的选项是:

CURL_SSLVERSION_DEFAULT

默认操作。这将尝试找出远程 SSL 协议(protocol)版本,即 SSLv3 或 TLSv1(但不是 SSLv2,它在 7.18.1 中默认禁用)。

CURL_SSLVERSION_TLSv1

强制 TLSv1

CURL_SSLVERSION_SSLv2

强制 SSLv2

CURL_SSLVERSION_SSLv3

强制 SSLv3

它说我们需要传递一个值为 CURL_SSLVERSION_SSLv3 的 long 来规定 sslv3。CURL_SSLVERSION_SSLv3 的值是多少?我们可以检查 RCurl:::SSLVERSION_SSLv3
> c(RCurl:::SSLVERSION_DEFAULT, RCurl:::SSLVERSION_TLSv1, RCurl:::SSLVERSION_SSLv2, RCurl:::SSLVERSION_SSLv3)
[1] 0 1 2 3
>

所以实际上 sslversion 的允许值是 0、1、2 或 3。

因此,这种情况下的混淆来自 curl 程序,该程序大概使用 libcurl api 以二进制方式实现它。

因此,在这种情况下使用此选项的正确方法是:
postForm(url, .opts = list(sslversion = 3))

or

postForm(url, .opts = list(sslv = 3))

您可以使用较短的 sslv,因为 .opts 被传递给将使用 mapCurlOptNamespmatch找到 sslversion

为了公平起见 RCurl 的作者,这一切都在 http://www.omegahat.org/RCurl/philosophy.html 中进行了解释,也位于 /RCurl/inst/doc/philosophy.html 中。摘录如下:

关于RCurl - bool 选项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17119449/

10-12 17:24