summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2015-03-03 22:26:52 +0100
committerLudovic Courtès <ludo@gnu.org>2015-03-03 22:58:45 +0100
commit776463ba9fa73e7d3e147b74614ca25d7c9d8785 (patch)
treeba219ad4d8db2688cacc87168cba341e16f9b082
parentc28606bd1daa08c8e3e0483894bf37963b34a4e2 (diff)
downloadgnu-guix-776463ba9fa73e7d3e147b74614ca25d7c9d8785.tar
gnu-guix-776463ba9fa73e7d3e147b74614ca25d7c9d8785.tar.gz
http-client: Monkey-patch 'make-chunked-input-port' on Guile <= 2.0.11.
Fixes <http://bugs.gnu.org/19976>. * guix/http-client.scm (when-guile<=2.0.5): Rename to... (when-guile<=2.0.5-or-otherwise-broken): ... this. (%web-http): New variable. Monkey-patch 'make-chunked-input-port' when %WEB-HTTP defines 'read-chunk-body'.
-rw-r--r--guix/http-client.scm12
1 files changed, 10 insertions, 2 deletions
diff --git a/guix/http-client.scm b/guix/http-client.scm
index 6d6af5603d..051fceecb5 100644
--- a/guix/http-client.scm
+++ b/guix/http-client.scm
@@ -55,7 +55,7 @@
(reason http-get-error-reason)) ; string
-(define-syntax when-guile<=2.0.5
+(define-syntax when-guile<=2.0.5-or-otherwise-broken
(lambda (s)
(syntax-case s ()
((_ body ...)
@@ -64,12 +64,15 @@
;; when using "guix pull".
#'(begin body ...)))))
-(when-guile<=2.0.5
+(when-guile<=2.0.5-or-otherwise-broken
;; Backport of Guile commits 312e79f8 ("Add HTTP Chunked Encoding support to
;; web modules.") and 00d3ecf2 ("http: Do not buffer HTTP chunks.")
(use-modules (ice-9 rdelim))
+ (define %web-http
+ (resolve-module '(web http)))
+
;; Chunked Responses
(define (read-chunk-header port)
(let* ((str (read-line port))
@@ -127,6 +130,11 @@ closed it will also close PORT, unless the KEEP-ALIVE? is true."
(make-custom-binary-input-port "chunked input port" read! #f #f close))
+ ;; Chunked encoding support in Guile <= 2.0.11 would load whole chunks in
+ ;; memory---see <http://bugs.gnu.org/19939>.
+ (when (module-variable %web-http 'read-chunk-body)
+ (module-set! %web-http 'make-chunked-input-port make-chunked-input-port))
+
(define (read-response-body* r)
"Reads the response body from @var{r}, as a bytevector. Returns
@code{#f} if there was no response body."