summary refs log tree commit diff
path: root/guix/http-client.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2020-01-03 15:47:12 +0100
committerLudovic Courtès <ludo@gnu.org>2020-01-03 16:06:26 +0100
commitf4cde9ac4aedb516c050a30fd999673da434bfa0 (patch)
tree1927e98b7b8882fc72290de59ad6b00cfade5f32 /guix/http-client.scm
parent52207b3938d3ccbeb661ba8d0af563cf1e0e3333 (diff)
downloadguix-f4cde9ac4aedb516c050a30fd999673da434bfa0.tar.gz
download: Do not leak file descriptors on TLS ports.
Fixes <https://bugs.gnu.org/20145>.

* guix/build/download.scm (%tls-ports, register-tls-record-port): Remove.
(tls-wrap): Remove call to 'register-tls-record-port'.  Return a custom
binary input/output port instead.  This is a backport of what Guile
2.2's (web client) module has been doing.
(close-connection): Define as an alias for 'close-port'.
* guix/http-client.scm (http-fetch): Remove #:keep-alive? parameter,
which was ignored and unused.
Pass #:keep-alive? #f to 'http-get'.
* guix/lint.scm (probe-uri): Use 'close-port' instead of 'close-connection'.
* guix/scripts/substitute.scm (http-multiple-get): Likewise.
Diffstat (limited to 'guix/http-client.scm')
-rw-r--r--guix/http-client.scm13
1 files changed, 8 insertions, 5 deletions
diff --git a/guix/http-client.scm b/guix/http-client.scm
index 067002a79a..5a5a33b4c0 100644
--- a/guix/http-client.scm
+++ b/guix/http-client.scm
@@ -70,14 +70,13 @@
 
 
 (define* (http-fetch uri #:key port (text? #f) (buffered? #t)
-                     keep-alive? (verify-certificate? #t)
+                     (verify-certificate? #t)
                      (headers '((user-agent . "GNU Guile"))))
   "Return an input port containing the data at URI, and the expected number of
 bytes available or #f.  If TEXT? is true, the data at URI is considered to be
 textual.  Follow any HTTP redirection.  When BUFFERED? is #f, return an
-unbuffered port, suitable for use in `filtered-port'.  When KEEP-ALIVE? is
-true, send a 'Connection: keep-alive' HTTP header, in which case PORT may be
-reused for future HTTP requests.  HEADERS is an alist of extra HTTP headers.
+unbuffered port, suitable for use in `filtered-port'.  HEADERS is an alist of
+extra HTTP headers.
 
 When VERIFY-CERTIFICATE? is true, verify HTTPS server certificates.
 
@@ -100,7 +99,11 @@ Raise an '&http-get-error' condition if downloading fails."
         (setvbuf port 'none))
       (let*-values (((resp data)
                      (http-get uri #:streaming? #t #:port port
-                               #:keep-alive? #t
+                               ;; XXX: When #:keep-alive? is true, if DATA is
+                               ;; a chunked-encoding port, closing DATA won't
+                               ;; close PORT, leading to a file descriptor
+                               ;; leak.
+                               #:keep-alive? #f
                                #:headers headers))
                     ((code)
                      (response-code resp)))