3

这些 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 选项,将不胜感激!

4

2 回答 2

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 as 参数以控制尝试使用的 SSL/TLS 版本。可用的选项有:

CURL_SSLVERSION_DEFAULT

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

CURL_SSLVERSION_TLSv1

强制 TLSv1

CURL_SSLVERSION_SSLv2

强制 SSLv2

CURL_SSLVERSION_SSLv3

强制 SSLv3

它说我们需要通过一个 long with valueCURL_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的 as.opts传递给mapCurlOptNames它将用于pmatch find sslversion

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

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

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

于 2013-06-15T10:18:39.423 回答
1

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

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

尽管我承认我认为您的代码应该可以工作。您可能还需要发布版本号。还有一个curlSetOpt可能更“自信”。

于 2013-06-15T02:23:17.660 回答