1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 03:40:34 +02:00

web: Gracefully handle premature EOF when reading chunk header.

* module/web/http.scm (read-chunk-header): Return 0 when 'read-line'
  returns EOF.
This commit is contained in:
Ludovic Courtès 2015-09-26 11:04:23 +02:00 committed by Andy Wingo
parent d975a8dec6
commit 0bcf5d78ec
2 changed files with 26 additions and 9 deletions

View file

@ -34,6 +34,7 @@
#:use-module (srfi srfi-9)
#:use-module (srfi srfi-19)
#:use-module (ice-9 rdelim)
#:use-module (ice-9 match)
#:use-module (ice-9 q)
#:use-module (ice-9 binary-ports)
#:use-module (rnrs bytevectors)
@ -1914,15 +1915,21 @@ treated specially, and is just returned as a plain string."
;; Chunked Responses
(define (read-chunk-header port)
"Read a chunk header and return the chunk size."
(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

View file

@ -423,6 +423,16 @@
(utf8->string (get-bytevector-n port 6))
(reverse requests)))))
(pass-if-equal "EOF instead of chunk header"
"Only chunk."
;; Omit the second chunk header, leading to a premature EOF. This
;; used to cause 'read-chunk-header' to throw to wrong-type-arg.
;; See the backtrace at
;; <http://debbugs.gnu.org/cgi/bugreport.cgi?bug=19976#5>.
(let* ((str "B\r\nOnly chunk.")
(port (make-chunked-input-port (open-input-string str))))
(get-string-all port)))
(pass-if-equal
(call-with-output-string
(lambda (out-raw)