【问题标题】:RCurl - Boolean OptionsRCurl - 布尔选项
【发布时间】:2013-06-15 01:42:22
【问题描述】:

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

【问题讨论】:

    标签: r rcurl


    【解决方案1】:

    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

    它说我们需要传递一个值为CURL_SSLVERSION_SSLv3 的long 来规定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 找到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。这就是映射方案。

    【讨论】:

    • 非常彻底的回应。谢谢!
    【解决方案2】:

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

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

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

    【讨论】:

    • 警告选项!警告消息:在 mapCurlOptNames(names(.els), asNames = TRUE) 中:无法识别的 CURL 选项:sslv3
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2016-01-11
    • 2017-10-28
    • 1970-01-01
    • 2012-05-09
    • 2018-03-11
    相关资源
    最近更新 更多