From 075d99f19599b2903490942d8c3717cdd5b5d31e Mon Sep 17 00:00:00 2001 From: Andy Patterson Date: Tue, 7 Jul 2015 00:52:16 +0200 Subject: [PATCH] substitute: Avoid infinite loop when updating the substitute list. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reported at . * guix/scripts/substitute.scm (http-multiple-get): When RESP has "Connection: close", consume HEAD anyway; always call PROC to read from BODY. Co-authored-by: Ludovic Courtès --- guix/scripts/substitute.scm | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/guix/scripts/substitute.scm b/guix/scripts/substitute.scm index 8b4fa36d2a..0baba91981 100755 --- a/guix/scripts/substitute.scm +++ b/guix/scripts/substitute.scm @@ -462,17 +462,18 @@ to read the response body. Return the list of results." (() (reverse result)) ((head tail ...) - (let* ((resp (read-response p)) - (body (response-body-port resp))) + (let* ((resp (read-response p)) + (body (response-body-port resp)) + (result (cons (proc head resp body) result))) ;; The server can choose to stop responding at any time, in which ;; case we have to try again. Check whether that is the case. + ;; Note that even upon "Connection: close", we can read from BODY. (match (assq 'connection (response-headers resp)) (('connection 'close) (close-port p) - (connect requests result)) ;try again + (connect tail result)) ;try again (_ - (loop tail ;keep going - (cons (proc head resp body) result))))))))))) + (loop tail result)))))))))) ;keep going (define (read-to-eof port) "Read from PORT until EOF is reached. The data are discarded."