这些 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
被传递给将使用 mapCurlOptNames
的 pmatch
找到 sslversion
。为了公平起见
RCurl
的作者,这一切都在 http://www.omegahat.org/RCurl/philosophy.html 中进行了解释,也位于 /RCurl/inst/doc/philosophy.html
中。摘录如下:关于RCurl - bool 选项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17119449/