首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RCurl -布尔选项

RCurl -布尔选项
EN

Stack Overflow用户
提问于 2013-06-15 01:42:22
回答 2查看 1K关注 0票数 3

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

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

我试过了

代码语言:javascript
复制
postForm(url, .opts = list(sslv3=TRUE))

但收到了错误:

代码语言:javascript
复制
Warning message:
In mapCurlOptNames(names(.els), asNames = TRUE) :
  Unrecognized CURL options: sslv3

提前谢谢。

溶液

通过一些尝试和错误,我发现这是可行的:

代码语言:javascript
复制
options(RCurlOptions = list(sslversion=3))
postForm(url)

如果有人能够澄清如何将Curl选项转换为RCurl选项,它将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-15 10:18:39

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列出的选项进行比较。

代码语言:javascript
复制
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符号派生出来的。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手册页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

它说,我们需要传递一个长和值CURL_SSLVERSION_SSLv3来规定sslv3。CURL_SSLVERSION_SSLv3的价值是什么?我们可以检查RCurl:::SSLVERSION_SSLv3

代码语言:javascript
复制
> c(RCurl:::SSLVERSION_DEFAULT, RCurl:::SSLVERSION_TLSv1, RCurl:::SSLVERSION_SSLv2, RCurl:::SSLVERSION_SSLv3)
[1] 0 1 2 3
> 

因此,实际上So版本的允许值是0、1、2或3。

因此,在这种情况下,混乱产生于curl程序,它可能使用libcurl以二进制方式实现这一点。

因此,在本例中使用此选项的正确方法是:

代码语言:javascript
复制
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 .An节选中)中对此进行了解释:

在curl_easy_setopt的libcurl (Ual)页面中描述了其中的每一个以及它控制的内容,这是权威的文档。我们在这里提供的一切只是重复或额外的解释。 这些选项的名称需要稍作解释。它们对应于libcurl的C代码中的符号名。例如,R中的选项url对应于C中的CURLOPT_URL。首先,大写字母很难键入和读取,因此我们在R中将它们映射到小写字母。我们还删除了前缀"CURLOPT_“,因为我们知道使用它们选项名称的上下文。最后,任何具有_(在我们删除CURLOPT_前缀之后)的选项名都会被更改为用'.‘替换'_’。所以我们可以在R中输入它们,而不必引用它们。例如,结合这三条规则,"CURLOPT_URL“变成url,CURLOPT_NETRC_FILE变成netrc.file。这就是映射方案。

票数 6
EN

Stack Overflow用户

发布于 2013-06-15 02:23:17

在被postForm引用后(在查看了?curlOptions上的示例之后)尝试此选项:)

代码语言:javascript
复制
myOpts = curlOptions(sslv3 = TRUE)
postForm(url, .opts = myOpts)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17119449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档