I'm currently working on a project to gather RSS data using Guile.  I've
been working with both the stable 2.0.3 version and the latest git
repository.  I'm fairly new to Guile, though, so I might be approaching
this the wrong way.

As a test, I wanted to make an HTTP request.  This is a series of commands
I executed in the REPL to accomplish this (using Geiser in Emacs 24):

(use-modules (web request) (web response) (web uri) (rnrs bytevectors))

(define port (socket PF_INET SOCK_STREAM 0))
(define address (addrinfo:addr (car (getaddrinfo "www.google.com" "http"))))
(connect port address)
(define request (build-request (build-uri 'http #:host "www.google.com")))
(write-request request port)
(define response (read-response port))

(read-response ...) consistently fails with Google:

web/http.scm:754:6: In procedure parse-asctime-date:
web/http.scm:754:6: Throw to key `bad-header' with args `(date "-1")'.

The expiration is set to -1 in the headers, and this seems to cause a
problem for the web libraries in Guile.
This same request seems to work well for my own domain (killring.org).

I attempted a very similar series of commands to get RSS data for Google
News:

(define port (socket PF_INET SOCK_STREAM 0))
(define address (addrinfo:addr (car (getaddrinfo "news.google.com"
"http"))))
(connect port address)
(define request (build-request (build-uri 'http #:host "news.google.com"
#:path "/news?pz=1&cf=all&ned=us&hl=en&output=rss")))
(write-request request port)
(define response (read-response port))
(define body-vec (read-response-body response))

In this case, the (read-response-body ...) returns #f, although when I
pulled the data manually, there was XML data present in the body of the
response.

Similarly, when getting RSS information from Slashdot:

(define port (socket PF_INET SOCK_STREAM 0))
(define address (addrinfo:addr (car (getaddrinfo "rss.slashdot.org"
"http"))))
(connect port address)
(define request (build-request (build-uri 'http #:host "rss.slashdot.org"
#:path "/Slashdot/slashdot")))
(write-request request port)
(define response (read-response port))

I get the following error when reading the response:

web/http.scm:814:12: In procedure parse-entity-tag:
web/http.scm:814:12: Throw to key `bad-header' with args `(qstring
"F+oOJMkOlp2n1IUbAJmq+7qCGuk")'.

which I haven't fully tracked down yet.

I have a feeling I'm using the API incorrectly, though I've pored over the
documentation the best I can to figure out how to make these requests and
parse the responses.  Short of writing my own implementation, is there
anything I should be doing to make this work?

Thanks,
Rick

Reply via email to