diff --git a/guix/http-client.scm b/guix/http-client.scm index b0aae52658..31b511eb1c 100644 --- a/guix/http-client.scm +++ b/guix/http-client.scm @@ -188,13 +188,33 @@ closes PORT, unless KEEP-ALIVE? is true." (make-custom-binary-input-port "delimited input port" read! #f #f close)) + (define (read-header-line port) + "Read an HTTP header line and return it without its final CRLF or LF. +Raise a 'bad-header' exception if the line does not end in CRLF or LF, +or if EOF is reached." + (match (%read-line port) + (((? string? line) . #\newline) + ;; '%read-line' does not consider #\return a delimiter; so if it's + ;; there, remove it. We are more tolerant than the RFC in that we + ;; tolerate LF-only endings. + (if (string-suffix? "\r" line) + (string-drop-right line 1) + line)) + ((line . _) ;EOF or missing delimiter + ((@@ (web http) bad-header) 'read-header-line line)))) + (unless (guile-version>? "2.0.11") ;; Guile <= 2.0.9 had a bug whereby 'response-body-port' would read more ;; than what 'content-length' says. See Guile commit 802a25b. ;; Guile <= 2.0.11 had a bug whereby the 'close' method of the response ;; body port would fail with wrong-arg-num. See Guile commit 5a10e41. (module-set! (resolve-module '(web response)) - 'make-delimited-input-port make-delimited-input-port))) + 'make-delimited-input-port make-delimited-input-port) + + ;; Guile <= 2.0.11 was affected by . See Guile + ;; commit 4c7732c. + (when (module-variable %web-http 'read-line*) + (module-set! %web-http 'read-line* read-header-line)))) ;; XXX: Work around , present in Guile ;; up to 2.0.7.