aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2021-03-15 18:35:24 +0000
committerChristopher Baines <mail@cbaines.net>2021-05-20 12:06:34 +0100
commit560823461970c539af6aebf48f4e8366893e7e7d (patch)
tree2949b0ef0e95717ec713820b5086997a6b5a7433
parent39b911a3da510533d75b70898cb0fd93f85bc292 (diff)
downloadguix-handle-closing-http-connections-in-process-substitution.tar
guix-handle-closing-http-connections-in-process-substitution.tar.gz
substitute: Handle closing connections to substitute servers.handle-closing-http-connections-in-process-substitution
When reusing a HTTP connection to fetch multiple nars, and the remote server signals that the connection should be closed. * guix/scripts/substitute.scm (process-substitution): Close connections to substitute servers when a Connection: close header is specified in the response.
-rwxr-xr-xguix/scripts/substitute.scm17
1 files changed, 14 insertions, 3 deletions
diff --git a/guix/scripts/substitute.scm b/guix/scripts/substitute.scm
index 96f425eaa0..208b8f1273 100755
--- a/guix/scripts/substitute.scm
+++ b/guix/scripts/substitute.scm
@@ -464,7 +464,9 @@ PORT."
(case (uri-scheme uri)
((file)
(let ((port (open-file (uri-path uri) "r0b")))
- (values port (stat:size (stat port)))))
+ (values port
+ (stat:size (stat port))
+ (const #t)))) ; no cleanup to do
((http https)
(guard (c ((http-get-error? c)
(leave (G_ "download from '~a' failed: ~a, ~s~%")
@@ -487,7 +489,12 @@ PORT."
#:keep-alive? #t
#:buffered? #f)))
(values raw
- (response-content-length response)))))))
+ (response-content-length response)
+ (match (assq 'connection (response-headers response))
+ (('connection 'close)
+ (lambda ()
+ (close-port port)))
+ (_ (const #t)))))))))
(else
(leave (G_ "unsupported substitute URI scheme: ~a~%")
(uri->string uri)))))
@@ -504,7 +511,7 @@ PORT."
(format (current-error-port)
(G_ "Downloading ~a...~%") (uri->string uri)))
- (let*-values (((raw download-size)
+ (let*-values (((raw download-size post-fetch-cleanup)
;; 'guix publish' without '--cache' doesn't specify a
;; Content-Length, so DOWNLOAD-SIZE is #f in this case.
(fetch uri))
@@ -565,6 +572,10 @@ PORT."
;; Wait for the reporter to finish.
(every (compose zero? cdr waitpid) pids)
+ ;; Do post-fetch cleanup, maybe closing the HTTP connection if HTTP is
+ ;; being used, and the connection should be closed
+ (post-fetch-cleanup)
+
;; Skip a line after what 'progress-reporter/file' printed, and another
;; one to visually separate substitutions. When PRINT-BUILD-TRACE? is
;; true, leave it up to (guix status) to prettify things.