RCurl — логические параметры

Эти документы Curl: http://curl.haxx.se/docs/manpage.html#-d список многих логических опций.

Как указать эти параметры в вызове postForm в RCurl? Например, как указать флаг --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, это было бы признательно!


person Tom Wainwright    schedule 15.06.2013    source источник


Ответы (2)


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 получены из символов API 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 справочную страницу 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 со значением 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, которая предположительно использует API-интерфейс libcurl, реализующий это в двоичном виде.

Таким образом, правильным способом использования этой опции в этом случае будет:

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, и это авторитетная документация. Все, что мы приводим здесь, является просто повторением или дополнительным объяснением.

Названия опций требуют небольшого пояснения. Они соответствуют символическим именам в C-коде libcurl. Например, опция url в R соответствует CURLOPT_URL в C. Во-первых, прописные буквы раздражают при вводе и чтении, поэтому мы сопоставили их с строчными буквами в R. Мы также удалили префикс «CURLOPT_», поскольку мы знаем контекст, в котором используются имена опций. И, наконец, любые имена опций, которые имеют _ (после того, как мы удалили префикс CURLOPT_), изменены, чтобы заменить '_' на '.' поэтому мы можем напечатать их в R, не заключая их в кавычки. Например, при объединении этих трех правил «CURLOPT_URL» становится URL-адресом, а CURLOPT_NETRC_FILE становится netrc.file. Это схема отображения.

person user1609452    schedule 15.06.2013
comment
Предельно обстоятельный ответ. Спасибо! - person Tom Wainwright; 16.06.2013

Попробуйте это (после просмотра примеров на ?curlOptions после того, как вас порекомендовал ?postForm:)

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

Хотя я признаю, что думал, что ваш код должен работать. Возможно, вам также потребуется опубликовать номера версий. Существует также curlSetOpt, который может быть более «напористым».

person IRTFM    schedule 15.06.2013
comment
Предупреждающий вариант! Предупреждающее сообщение: в mapCurlOptNames(names(.els), asNames = TRUE): нераспознанные параметры CURL: sslv3 - person Tom Wainwright; 15.06.2013