aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2015-09-26 11:11:41 +0200
committerLudovic Courtès <ludo@gnu.org>2015-09-26 11:13:50 +0200
commit15d5ca135673a06d94ba6e5d0f591eb87940714f (patch)
treea7fd793ea2ec244fbca8938e95634221ae5ae11f
parentdd8d6d65475211c34ffd723bd1ae0a06705f1a2e (diff)
downloadguix-15d5ca135673a06d94ba6e5d0f591eb87940714f.tar
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.scm27
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