这些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选项,那么会很感激!
答案 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
.opts
,mapCurlOptNames
会传递给使用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
可能更“自信”。