From 74af03051fec22e01376f3f4597eb8de2dab87b5 Mon Sep 17 00:00:00 2001 From: Jason Douglas Earl Date: Fri, 1 Mar 2013 23:58:41 -0700 Subject: [PATCH] Handle case where server does not specify a Content-Length. * module/web/response.scm (response-body-port, make-undelimited-input-port): The server does not have to return a content length. Handle that case. --- module/web/response.scm | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/module/web/response.scm b/module/web/response.scm index 7e14f4d..33dcf1e 100644 --- a/module/web/response.scm +++ b/module/web/response.scm @@ -264,6 +264,26 @@ closes PORT, unless KEEP-ALIVE? is true." (make-custom-binary-input-port "delimited input port" read! #f #f close)) +(define (make-undelimited-input-port port keep-alive?) + "Return an input port that reads from PORT, until EOF. Closing the +returned port closes PORT, unless KEEP-ALIVE? is true." + (define bytes-read 0) + + (define (read! bv start count) + (let ((ret (get-bytevector-n! port bv start count))) + (if (eof-object? ret) + 0 + (begin + (set! bytes-read (+ bytes-read ret)) + ret)))) + + (define close + (and (not keep-alive?) + (lambda () + (close port)))) + + (make-custom-binary-input-port "undelimited input port" read! #f #f close)) + (define* (response-body-port r #:key (decode? #t) (keep-alive? #t)) "Return an input port from which the body of R can be read. The encoding of the returned port is set according to R's ‘content-type’ @@ -277,9 +297,11 @@ response port." (make-chunked-input-port (response-port r) #:keep-alive? keep-alive?) (let ((len (response-content-length r))) - (and len - (make-delimited-input-port (response-port r) - len keep-alive?))))) + (if len + (make-delimited-input-port (response-port r) + len keep-alive?) + (make-undelimited-input-port (response-port r) + keep-alive?))))) (when (and decode? port) (match (response-content-type r) -- 1.7.10.4