mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-02 13:00:26 +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:
parent
d975a8dec6
commit
0bcf5d78ec
2 changed files with 26 additions and 9 deletions
|
@ -34,6 +34,7 @@
|
||||||
#:use-module (srfi srfi-9)
|
#:use-module (srfi srfi-9)
|
||||||
#:use-module (srfi srfi-19)
|
#:use-module (srfi srfi-19)
|
||||||
#:use-module (ice-9 rdelim)
|
#:use-module (ice-9 rdelim)
|
||||||
|
#:use-module (ice-9 match)
|
||||||
#:use-module (ice-9 q)
|
#:use-module (ice-9 q)
|
||||||
#:use-module (ice-9 binary-ports)
|
#:use-module (ice-9 binary-ports)
|
||||||
#:use-module (rnrs bytevectors)
|
#:use-module (rnrs bytevectors)
|
||||||
|
@ -1914,15 +1915,21 @@ treated specially, and is just returned as a plain string."
|
||||||
|
|
||||||
;; Chunked Responses
|
;; Chunked Responses
|
||||||
(define (read-chunk-header port)
|
(define (read-chunk-header port)
|
||||||
"Read a chunk header and return the chunk size."
|
"Read a chunk header from PORT and return the size in bytes of the
|
||||||
(let* ((str (read-line port))
|
upcoming chunk."
|
||||||
(extension-start (string-index str (lambda (c) (or (char=? c #\;)
|
(match (read-line port)
|
||||||
(char=? c #\return)))))
|
((? eof-object?)
|
||||||
(size (string->number (if extension-start ; unnecessary?
|
;; Connection closed prematurely: there's nothing left to read.
|
||||||
(substring str 0 extension-start)
|
0)
|
||||||
str)
|
(str
|
||||||
16)))
|
(let ((extension-start (string-index str
|
||||||
size))
|
(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))
|
(define* (make-chunked-input-port port #:key (keep-alive? #f))
|
||||||
"Returns a new port which translates HTTP chunked transfer encoded
|
"Returns a new port which translates HTTP chunked transfer encoded
|
||||||
|
|
|
@ -423,6 +423,16 @@
|
||||||
(utf8->string (get-bytevector-n port 6))
|
(utf8->string (get-bytevector-n port 6))
|
||||||
(reverse requests)))))
|
(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
|
(pass-if-equal
|
||||||
(call-with-output-string
|
(call-with-output-string
|
||||||
(lambda (out-raw)
|
(lambda (out-raw)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue