summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2021-04-24 18:07:09 +0200
committerLudovic Courtès <ludo@gnu.org>2021-04-25 14:36:45 +0200
commit15b6c2a965e66084f3be2e88439dba408f7613ab (patch)
treea298e3790b2d9c756260a8364e4180bd63d84efc
parent69ffe875c38bde29eb420a819d74ddba916015bc (diff)
downloadguix-15b6c2a965e66084f3be2e88439dba408f7613ab.tar.gz
http-client: Remove exception mishandling in 'http-multiple-get'.
Partly fixes <https://bugs.gnu.org/47867>.
Reported by Florian Pelz <pelzflorian@pelzflorian.de>.

The non-tail recursive call to 'connect' could cause requests to be
processed twice, with 'p' possibly closed the second time.

Regression introduced in 205833b72c5517915a47a50dbe28e7024dc74e57 and
carried over in 45fce38fb0b6c6796906149ade145b8d3594c1c6.

* guix/http-client.scm (http-multiple-get): Remove call to 'close-port'
and recursive call to 'connect' when the 'write-request' block returns #f.
-rw-r--r--guix/http-client.scm17
1 files changed, 8 insertions, 9 deletions
diff --git a/guix/http-client.scm b/guix/http-client.scm
index bb1b0eeb56..10bc278023 100644
--- a/guix/http-client.scm
+++ b/guix/http-client.scm
@@ -214,15 +214,14 @@ returning."
         ;; Inherit the HTTP proxying property from P.
         (set-http-proxy-port?! buffer (http-proxy-port? p))
 
-        (unless (false-if-networking-error
-                 (begin
-                   (for-each (cut write-request <> buffer) batch)
-                   (put-bytevector p (get))
-                   (force-output p)
-                   #t))
-          ;; If PORT becomes unusable, open a fresh connection and retry.
-          (close-port p)                          ; close the broken port
-          (connect #f requests result)))
+        ;; Swallow networking errors that could occur due to connection reuse
+        ;; and the like; they will be handled down the road when trying to
+        ;; read responses.
+        (false-if-networking-error
+         (begin
+           (for-each (cut write-request <> buffer) batch)
+           (put-bytevector p (get))
+           (force-output p))))
 
       ;; Now start processing responses.
       (let loop ((sent      batch)