guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

01/01: http-client: Backport Guile fix for 'read-chunk-header'.


From: Ludovic Courtès
Subject: 01/01: http-client: Backport Guile fix for 'read-chunk-header'.
Date: Sat, 26 Sep 2015 09:14:07 +0000

civodul pushed a commit to branch master
in repository guix.

commit 15d5ca135673a06d94ba6e5d0f591eb87940714f
Author: Ludovic Courtès <address@hidden>
Date:   Sat Sep 26 11:11:41 2015 +0200

    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 <address@hidden>.
    
    * guix/http-client.scm (read-chunk-header): Backport Guile commit 53b8d5f.
---
 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 5cfe05f..9861ec8 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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]