summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Earl <jearl@notengoamigos.org>2013-03-10 19:23:31 +0100
committerAndy Wingo <wingo@pobox.com>2013-03-10 19:23:31 +0100
commit84dfde82ae8f6ec247c1c147c1e2ae50b207bad9 (patch)
treea43f350e83f32a57a02dd75a8fb5c21c6feec619
parent94c53e0601c3fb4a4dcd6d3bd602347a8253c167 (diff)
downloadguile-84dfde82ae8f6ec247c1c147c1e2ae50b207bad9.tar.gz
fix response-body-port for responses without content-length
* module/web/response.scm (response-body-port): Correctly handle cases in which EOF terminates the body.
-rw-r--r--module/web/response.scm27
1 files changed, 20 insertions, 7 deletions
diff --git a/module/web/response.scm b/module/web/response.scm
index 7e14f4dc0..3f97dffa5 100644
--- a/module/web/response.scm
+++ b/module/web/response.scm
@@ -273,13 +273,26 @@ body is available.
When KEEP-ALIVE? is #f, closing the returned port also closes R's
response port."
(define port
- (if (member '(chunked) (response-transfer-encoding r))
- (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?)))))
+ (cond
+ ((member '(chunked) (response-transfer-encoding r))
+ (make-chunked-input-port (response-port r)
+ #:keep-alive? keep-alive?))
+ ((response-content-length r)
+ => (lambda (len)
+ (make-delimited-input-port (response-port r)
+ len keep-alive?)))
+ ((response-must-not-include-body? r)
+ #f)
+ ((or (memq 'close (response-connection r))
+ (and (equal? (response-version r) '(1 . 0))
+ (not (memq 'keep-alive (response-connection r)))))
+ (response-port r))
+ (else
+ ;; Here we have a message with no transfer encoding, no
+ ;; content-length, and a response that won't necessarily be closed
+ ;; by the server. Not much we can do; assume that the client
+ ;; knows how to handle it.
+ (response-port r))))
(when (and decode? port)
(match (response-content-type r)