RCurl - 布尔选项

Tom*_*ght 3 r rcurl

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

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

我试过了

postForm(url, .opts = list(sslv3=TRUE))
Run Code Online (Sandbox Code Playgroud)

但收到错误:

Warning message:
In mapCurlOptNames(names(.els), asNames = TRUE) :
  Unrecognized CURL options: sslv3
Run Code Online (Sandbox Code Playgroud)

提前致谢.

通过一些反复试验,我发现这有效:

options(RCurlOptions = list(sslversion=3))
postForm(url)
Run Code Online (Sandbox Code Playgroud)

如果有人可以澄清如何将Curl选项转换为RCurl选项,那将是值得赞赏的!

use*_*452 6

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]
Run Code Online (Sandbox Code Playgroud)

从上面我们可以看到所有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参数来控制尝试使用的SSL/TLS版本.可用选项包括:

CURL_SSLVERSION_DEFAULT

默认操作.这将尝试找出远程SSL协议版本,即SSLv3或TLSv1(但不是SSLv2,默认情况下使用7.18.1禁用).

CURL_SSLVERSION_TLSv1

强制TLSv1

CURL_SSLVERSION_SSLv2

强制SSLv2

CURL_SSLVERSION_SSLv3

强制SSLv3

它说我们需要通过一个长期的值CURL_SSLVERSION_SSLv3来规定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
> 
Run Code Online (Sandbox Code Playgroud)

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

因此,在这种情况下的混淆源于curl程序,该程序可能使用libcurl api以二进制方式实现它.

因此,在这种情况下使用此选项的正确方法是:

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

or

postForm(url, .opts = list(sslv = 3))
Run Code Online (Sandbox Code Playgroud)

你可以使用传递给它的较短的sslv, 用于查找..optsmapCurlOptNamespmatchsslversion

为了对此作者公平,RCurl所有这些都在位于的http://www.omegahat.org/RCurl/philosophy.html中进行了解释/RCurl/inst/doc/philosophy.html.摘录内容如下:

在curl_easy_setopt的libcurl man(ual)页面中描述了这些及其控制的内容,这是权威文档.我们在这里提供的任何内容仅仅是重复或其他解释.

选项的名称需要稍作解释.这些对应于libcurl的C代码中的符号名称.例如,R中的选项url对应于C中的CURLOPT_URL.首先,大写字母对于输入和读取很烦人,所以我们将它们映射到R中的小写字母.我们还删除了前缀"CURLOPT_",因为我们知道正在使用它们的选项名称的上下文.最后,任何带有_(在我们删除了CURLOPT_前缀之后)的选项名称都会更改为将'_'替换为'.' 所以我们可以在R中键入它们而不必引用它们.例如,结合这三个规则,"CURLOPT_URL"变为url,CURLOPT_NETRC_FILE变为netrc.file.这是映射方案.