diff options
author | Ludovic Courtès <ludo@gnu.org> | 2015-09-26 11:11:41 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2015-09-26 11:13:50 +0200 |
commit | 15d5ca135673a06d94ba6e5d0f591eb87940714f (patch) | |
tree | a7fd793ea2ec244fbca8938e95634221ae5ae11f | |
parent | dd8d6d65475211c34ffd723bd1ae0a06705f1a2e (diff) | |
download | guix-15d5ca135673a06d94ba6e5d0f591eb87940714f.tar.gz |
http-client: Backport Guile fix for 'read-chunk-header'.
Fixes the wrong-type-arg exception initially reported at <http://debbugs.gnu.org/cgi/bugreport.cgi?bug=19976#5> by Ricardo Wurmus <rekado@elephly.net>. * guix/http-client.scm (read-chunk-header): Backport Guile commit 53b8d5f.
-rw-r--r-- | guix/http-client.scm | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/guix/http-client.scm b/guix/http-client.scm index 5cfe05f2e0..9861ec80cb 100644 --- a/guix/http-client.scm +++ b/guix/http-client.scm @@ -25,6 +25,7 @@ #:use-module (srfi srfi-11) #:use-module (srfi srfi-34) #:use-module (srfi srfi-35) + #:use-module (ice-9 match) #:use-module (rnrs io ports) #:use-module (rnrs bytevectors) #:use-module (guix ui) @@ -66,7 +67,8 @@ (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.") + ;; web modules."), 00d3ecf2 ("http: Do not buffer HTTP chunks."), and 53b8d5f + ;; ("web: Gracefully handle premature EOF when reading chunk header.") (use-modules (ice-9 rdelim)) @@ -75,14 +77,21 @@ ;; Chunked Responses (define (read-chunk-header port) - (let* ((str (read-line port)) - (extension-start (string-index str (lambda (c) (or (char=? c #\;) - (char=? c #\return))))) - (size (string->number (if extension-start ; unnecessary? - (substring str 0 extension-start) - str) - 16))) - size)) + "Read a chunk header from PORT and return the size in bytes of the + upcoming chunk." + (match (read-line port) + ((? eof-object?) + ;; Connection closed prematurely: there's nothing left to read. + 0) + (str + (let ((extension-start (string-index str + (lambda (c) + (or (char=? c #\;) + (char=? c #\return)))))) + (string->number (if extension-start ; unnecessary? + (substring str 0 extension-start) + str) + 16))))) (define* (make-chunked-input-port port #:key (keep-alive? #f)) "Returns a new port which translates HTTP chunked transfer encoded |