Chris Vine <ch...@cvine.freeserve.co.uk> writes: > ((lambda() > (let ((uri (build-uri 'http > #:host "checkip.dyndns.com" > #:port 80 > #:path "/"))) > (display uri) > (newline) > (let ((r (http-get uri #:keep-alive? #t))) ^^ there's your problem > (if r > (begin > (display r)(newline) > ;; (display (read-response-body r))(newline) > ) > (begin > (display "Can't obtain response body") > (newline))))))) snip.
> > The error is in the procedure call to read-response-body. Is this a > bug in guile-2, or am I doing something wrong? It's actually debatable whether or not this is your fault :). http-get returns 2 values: the response and the body. When you call read-response-body on the port, you are trying to read information that has already been read, and so it is coming up with an (eof-object) rather than the body. However, I notice that the manual doesn't actually say that it returns two values, so that'll need to be fixed. The correct way to write this code snippet is to use call-with-values (or sugar such as receive or let-values), instead of let. (let ((uri (build-uri 'http #:host "checkip.dyndns.com" #:port 80 #:path "/"))) (call-with-values (lambda () (http-get uri #:keep-alive? #t)) (lambda (request body) ...))) the request should (I think) always be a request object, so you don't need to check it with if. Though, the body may be #f, so it's worth checking that. -- Ian Price "Programming is like pinball. The reward for doing it well is the opportunity to do it again" - from "The Wizardy Compiled"