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.
master
Ludovic Courtès 2015-09-26 11:11:41 +02:00
parent dd8d6d6547
commit 15d5ca1356
1 changed files with 18 additions and 9 deletions

View File

@ -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