Post request using cookies with cURL, RCurl and httr

curl, httr, libcurl, r, rcurl

Solution

Based on Juba suggestion, here is a working RCurl template.

The code emulates a browser behaviour, as it:

- retrieves cookies on a login screen and

- reuses them on the following page requests containing the actual data.

### RCurl login and browse private pages ###

library("RCurl")

loginurl ="http=//www.*****"
mainurl  ="http=//www.*****"
agent    ="Mozilla/5.0"

#User account data and other login pars
pars=list(
     RURL="http=//www.*****",
     Username="*****",
     Password="*****"
)

#RCurl pars     
curl = getCurlHandle()
curlSetOpt(cookiejar="cookiesk.txt",  useragent = agent, followlocation = TRUE, curl=curl)
#or simply
#curlSetOpt(cookiejar="", useragent = agent, followlocation = TRUE, curl=curl)

#post login form
web=postForm(loginurl, .params = pars, curl=curl)

#go to main url with real data
web=getURL(mainurl, curl=curl)

#parse/print content of web
#..... etc. etc.


#This has the side effect of saving cookie data to the cookiejar file 
rm(curl)
gc()

Problem

In Windows cURL I can post a web request similar to this: ``` curl --dump-header cook.txt ^ --data "RURL=http=//www.example.com/r&user=bob&password=hello" ^ --user-agent "Mozilla/5.0" ^ http://www.example.com/login ``` With `type cook.txt` I get a response similar to this: ``` HTTP/1.1 302 Found Date: Thu, ****** Server: Microsoft-IIS/6.0 SERVER: ****** X-Powered-By: ASP.NET X-AspNet-Version: 1.1.4322 Location: ****** Set-Cookie: Cookie1=; domain=******; expires=****** ****** ****** ****** Cache-Control: private Content-Type: text/html; charset=iso-8859-1 Content-Length: 189 ``` I can manually read cookie lines like: `Set-Cookie: AuthCode=ABC...` (I could script this of course). So I can use `AuthCode` for subsequent requests. I am trying do the same in R with RCurl and/or httr (still don't know which one is better for my task). When I try: ``` library(httr) POST("http://www.example.com/login", body= list(RURL="http=//www.example.com/r", user="bob", password="hello"), user_agent("Mozilla/5.0")) ``` I get a response similar to this: ``` Response [http://www.example.com/error] Status: 411 Content-type: text/html <h1>Length Required</h1> ``` By and large I know about 411-error and I could try to fix the request; but I do not get it in cURL, so I am doing something wrong with the POST command. Can you help me in translating my cURL command to RCurl and/or httr?

Original source