Hello. I know that it's usually possible to write cookies to a cookie file by removing the curl handle and doing a gc() call. I can do this with getURL(), but I just can't obtain the same results with postForm().
If I use: curlHandle <- getCurlHandle(cookiefile=FILE, cookiejar=FILE) and then do: getURL(http://example.com/script.cgi, curl=curlHandle) rm(curlHandle) gc() it's OK, the cookie is there. But, if I do (same handle; the parameter is a dummy): postForm(site, .params=list(par="cookie"), curl=curlHandle, style="POST") rm(curlHandle) gc() no cookie is written. Probably I'm doing something wrong, but don't know what. Is it possible to store cookies read from the output of a postForm() call? How? Thanks. Christian PS.: I'm attaching a script that can be sourced (and its .txt version). It contains an example. The expected result is a file (cookies.txt) with two cookies. The script currently uses getURL() and two cookies are stored. If postForm() is used (currently commented), only 1 cookie is written. -- SDF Public Access UNIX System - http://sdf.lonestar.org
# The script will call no_cookie() if no cookies file exists. # It will then read the cookie XXX (its value is "cookie1"). # When XXX has been read, it will be written to "c_file" with # "rm(curlHandle) ; gc()". Finally the script will test whether # cookie ZZZ (its value is "cookie2") exists. If it doesn't, # then the script will retrive the same URL as before, which # will reply with ZZZ if XXX was sent. # # If XXX and ZZZ are in "cookies.txt", this should be removed # to test again (otherwise the script will find both cookies # and won't do anything). library(RCurl) site <- "http://chr.tx0.org/arch/ml/r/cookie-20101114.cgi" c_file <- "cookies.txt" no_cookie <- function() { curlHandle <- getCurlHandle(cookiefile=c_file, cookiejar=c_file) getURL(site, curl=curlHandle) rm(curlHandle) gc() } if ( file.exists(c_file) == FALSE ) { file.create(c_file) no_cookie() } cookie_1 <- sub(".*(XXX)\t", "", grep("XXX",readLines(c_file),value=T)) if ( length(grep("ZZZ",readLines(c_file))) == 0 ) { curlHandle <- getCurlHandle(cookiefile=c_file, cookiejar=c_file) # Either getURL OR postForm: aaa <- getURL(site, curl=curlHandle) #aaa <- postForm(site, .params=list(par=cookie_1), curl=curlHandle, style="POST") # Debug POST: #d = debugGatherer() #postForm(site, .params=list(par=cookie_1), .opts=list(httpheader = c( # header = "foo: bar"), debugfunction = d$update, verbose=T), # curl=curlHandle, style="POST") #write.table(d$value()[["headerIn"]], file="debug_in.txt") #write.table(d$value()[["headerOut"]], file="debug_out.txt") rm(curlHandle) gc() }
# The script will call no_cookie() if no cookies file exists. # It will then read the cookie XXX (its value is "cookie1"). # When XXX has been read, it will be written to "c_file" with # "rm(curlHandle) ; gc()". Finally the script will test whether # cookie ZZZ (its value is "cookie2") exists. If it doesn't, # then the script will retrive the same URL as before, which # will reply with ZZZ if XXX was sent. # # If XXX and ZZZ are in "cookies.txt", this should be removed # to test again (otherwise the script will find both cookies # and won't do anything). library(RCurl) site <- "http://chr.tx0.org/arch/ml/r/cookie-20101114.cgi" c_file <- "cookies.txt" no_cookie <- function() { curlHandle <- getCurlHandle(cookiefile=c_file, cookiejar=c_file) getURL(site, curl=curlHandle) rm(curlHandle) gc() } if ( file.exists(c_file) == FALSE ) { file.create(c_file) no_cookie() } cookie_1 <- sub(".*(XXX)\t", "", grep("XXX",readLines(c_file),value=T)) if ( length(grep("ZZZ",readLines(c_file))) == 0 ) { curlHandle <- getCurlHandle(cookiefile=c_file, cookiejar=c_file) # Either getURL OR postForm: aaa <- getURL(site, curl=curlHandle) #aaa <- postForm(site, .params=list(par=cookie_1), curl=curlHandle, style="POST") # Debug POST: #d = debugGatherer() #postForm(site, .params=list(par=cookie_1), .opts=list(httpheader = c( # header = "foo: bar"), debugfunction = d$update, verbose=T), # curl=curlHandle, style="POST") #write.table(d$value()[["headerIn"]], file="debug_in.txt") #write.table(d$value()[["headerOut"]], file="debug_out.txt") rm(curlHandle) gc() }
______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.