readLines() is for a text-mode connection; readChar() is for a
binary-mode connection. Given that you asked for possible re-encoding
by the 'encoding' argument, you cannot safely mix them (text-mode
access is re-encoded, binary-mode is not). However, we don't know if
re-encoding was active in your case since we don't know your locale.
Either don't specify an encoding and re-encode the response in R or
use readLines() to read the complete response and split it up later.
For a different approach with read/write.socket() see tests/internet.R
in the R sources.
Please do note that the posting guide asked you for 'at a minimum'
information (which includes the locale) and a reproducible example.
On Tue, 21 Sep 2010, Christopher Bare wrote:
Hi R gurus,
I'm trying to use a ReSTful web service from within R. Specifically, I
need to make HTTP PUT requests.
I'm able to make the request and that goes well enough, but I'm having
trouble properly consuming the HTTP response. The problem comes in
when I'm trying to parse out the response body. I get the length of
the response body from the Content-Length header. I then try to use
readChar(con, nchars=content.length).
The result I'm seeing is that the first few characters of the response
body are cut off.
My code looks like this:
http.request <- function(host, path, request, port=80) {
con <- socketConnection(host=host, port=port, open="w+",
blocking=TRUE, encoding="UTF-8")
writeLines(request, con)
write("wrote request", stderr())
flush(stderr())
# build response object
response <- list()
response$status <- readLines(con, n=1)
response$headers <- character(0)
repeat{
ss <- readLines(con, n=1)
write(ss, stderr())
flush(stderr())
if (ss == "") break
key.value <- strsplit(ss, ":\\s*")
response$headers[key.value[[1]][1]] <- key.value[[1]][2]
}
if (any(names(response$headers)=='Content-Length')) {
content.length <- as.integer(response$headers['Content-Length'])
response$body <- readChar(con, nchars=content.length)
}
close(con)
}
response$body ends up with
"e,\"id\":\"some_doc\",\"rev\":\"7-906e06a7744780ef93126adc6f8f10ef\"}\n"
when it should be:
"{\"ok\":true,\"id\":\"some_doc\",\"rev\":\"7-906e06a7744780ef93126adc6f8f10ef\"}"
Is mixing readLines and readChars on the same connection causing bad
juju? If it is, what's the recommended what to do such a thing?
Thanks for any help!!
-Chris
______________________________________________
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.
--
Brian D. Ripley, rip...@stats.ox.ac.uk
Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel: +44 1865 272861 (self)
1 South Parks Road, +44 1865 272866 (PA)
Oxford OX1 3TG, UK Fax: +44 1865 272595
______________________________________________
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.