RCurl - 布尔选项

时间:2013-06-15 01:42:23

标签: r rcurl

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

如何在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选项,那么会很感激!

2 个答案:

答案 0 :(得分: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]

从上面我们可以看到所有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
> 

因此实际上sslversion的允许值为0,1,2或3。

因此,本案中的混淆源于curl程序,该程序可能使用libcurl api以二进制方式实现它。

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

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

or

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

您可以使用较短的sslv .optsmapCurlOptNames会传递给使用pmatch的{​​{1}} 找到sslversion

为了公平对待RCurl的作者,http://www.omegahat.org/RCurl/philosophy.html中的/RCurl/inst/doc/philosophy.html也解释了这一点。摘录内容为:

  

libcurl中描述了它们中的每一个及其控制的内容   curl_easy_setopt的man(ual)页面,这是权威的   文档。我们在这里提供的任何东西都只是重复或   补充说明。

     

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

答案 1 :(得分:1)

试试这个(在通过?postForm引用后查看?curlOptions上的示例之后:)

myOpts = curlOptions(sslv3 = TRUE)
postForm(url, .opts = myOpts)

虽然我承认我认为你的代码应该有效。您可能还需要发布版本号。还有一个curlSetOpt可能更“自信”。