Question

These Curl docs: http://curl.haxx.se/docs/manpage.html#-d list many boolean options.

How do I specify these options in a postForm call in RCurl? For example, how do I specify the --sslv3 flag?

I tried

postForm(url, .opts = list(sslv3=TRUE))

but received the error:

Warning message:
In mapCurlOptNames(names(.els), asNames = TRUE) :
  Unrecognized CURL options: sslv3

Thanks in advance.

SOLUTION

Through some trial and error, I found that this works:

options(RCurlOptions = list(sslversion=3))
postForm(url)

If anyone could clarify how to translate the Curl options to the RCurl options, it would appreciated!

Was it helpful?

Solution

Curl stands for a few things http://daniel.haxx.se/docs/curl-vs-libcurl.html. The problem here is you are looking at what the curl command line tool does and instead want to ask how the libcurl library implements something.

RCurl use the libcurl library. This can be accessed via an api. The "symbols" used in the api are listed here http://curl.haxx.se/libcurl/c/symbols-in-versions.html. We can compare them to the options listed by 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]

From the above we can see that all RCurl options are derived from libcurl api symbols. The CURLOPT_ is removed _ is replaced by . and the letters are demoted to lower case.

The question then arises as to what types the symbols represent. I usually just look at the php library documentation to discover this. http://php.net/manual/en/function.curl-setopt.php lists

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.

as an integer type. expecting the value 2 or 3.

Alternatively you can look at the curl_easy_setopt manual page http://curl.haxx.se/libcurl/c/curl_easy_setopt.html.

CURLOPT_SSLVERSION

Pass a long as parameter to control what version of SSL/TLS to attempt to use. The available options are:

CURL_SSLVERSION_DEFAULT

The default action. This will attempt to figure out the remote SSL protocol version, i.e. either SSLv3 or TLSv1 (but not SSLv2, which became disabled by default with 7.18.1).

CURL_SSLVERSION_TLSv1

Force TLSv1

CURL_SSLVERSION_SSLv2

Force SSLv2

CURL_SSLVERSION_SSLv3

Force SSLv3

It says we would need to pass a long with value CURL_SSLVERSION_SSLv3 to stipulate sslv3. What is the value of CURL_SSLVERSION_SSLv3? We can examine RCurl:::SSLVERSION_SSLv3

> c(RCurl:::SSLVERSION_DEFAULT, RCurl:::SSLVERSION_TLSv1, RCurl:::SSLVERSION_SSLv2, RCurl:::SSLVERSION_SSLv3)
[1] 0 1 2 3
> 

So in fact the permissible values for sslversion are 0,1,2 or 3.

So the confusion in this case arose from the curl program which presumably uses the libcurl api implementing this in a binary fashion.

So the correct way in this case to use this option would be:

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

or

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

you can use the shorter sslv as .opts is passed to mapCurlOptNames which will use pmatch to find sslversion.

To be fair to the author of RCurl this is all explained in http://www.omegahat.org/RCurl/philosophy.html also located in /RCurl/inst/doc/philosophy.html .An excerpt reads:

Each of these and what it controls is described in the libcurl man(ual) page for curl_easy_setopt and that is the authoritative documentation. Anything we provide here is merely repetition or additional explanation.

The names of the options require a slight explanation. These correspond to symbolic names in the C code of libcurl. For example, the option url in R corresponds to CURLOPT_URL in C. Firstly, uppercase letters are annoying to type and read, so we have mapped them to lower case letters in R. We have also removed the prefix "CURLOPT_" since we know the context in which they option names are being used. And lastly, any option names that have a _ (after we have removed the CURLOPT_ prefix) are changed to replace the '_' with a '.' so we can type them in R without having to quote them. For example, combining these three rules, "CURLOPT_URL" becomes url and CURLOPT_NETRC_FILE becomes netrc.file. That is the mapping scheme.

OTHER TIPS

Try this (after reviewing examples on ?curlOptions after being referred by ?postForm:)

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

Although I admit I thought your code should work. You may need to also post you version numbers. There is also a curlSetOpt that might be more "assertive".

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top