From 5e7cf66fb35780f930ad0bc5fe21ac330df4411d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 4 Nov 2020 15:57:00 +0100 Subject: [PATCH] publish: Do not path the empty string to 'query-path-info'. Fixes . Regression introduced in 2b2ab7796ac186d88060793b8873fc0e21462758. * guix/scripts/publish.scm (render-nar/cached): Do not call 'bypass-cache?' when ITEM is the empty string. * tests/publish.scm ("with cache, cache bypass, unmapped hash part"): New test. --- guix/scripts/publish.scm | 3 ++- tests/publish.scm | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/guix/scripts/publish.scm b/guix/scripts/publish.scm index 9706b52844..e8faf379e2 100644 --- a/guix/scripts/publish.scm +++ b/guix/scripts/publish.scm @@ -681,7 +681,8 @@ return it; otherwise, return 404. When TTL is true, use it as the (item (and hash (guard (c ((store-error? c) #f)) (hash-part->path store hash))))) - (and item (bypass-cache? store item))) + (and item (not (string-null? item)) + (bypass-cache? store item))) ;; Render STORE-ITEM live. We reach this because STORE-ITEM is ;; being baked but clients are already asking for it. Thus, we're ;; duplicating work, but doing so allows us to reduce delays. diff --git a/tests/publish.scm b/tests/publish.scm index 84aa6e5d73..e46e6256b7 100644 --- a/tests/publish.scm +++ b/tests/publish.scm @@ -622,6 +622,41 @@ References: ~%" (stat:size (stat item))) (response-code response)))))))))) +(test-equal "with cache, cache bypass, unmapped hash part" + 200 + + ;; This test reproduces the bug described in : + ;; the daemon connection would be closed as a side effect of a nar request + ;; for a non-existing file name. + (call-with-temporary-directory + (lambda (cache) + (let ((thread (with-separate-output-ports + (call-with-new-thread + (lambda () + (guix-publish "--port=6787" "-C" "gzip" + (string-append "--cache=" cache))))))) + (wait-until-ready 6787) + + (let* ((base "http://localhost:6787/") + (item (add-text-to-store %store "random" (random-text))) + (part (store-path-hash-part item)) + (narinfo (string-append base part ".narinfo")) + (nar (string-append base "nar/gzip/" (basename item))) + (cached (string-append cache "/gzip/" (basename item) + ".narinfo"))) + ;; The first response used to be 500 and to terminate the daemon + ;; connection as a side effect. + (and (= (response-code + (http-get (string-append base "nar/gzip/" + (make-string 32 #\e) + "-does-not-exist"))) + 404) + (= 200 (response-code (http-get nar))) + (= 200 (response-code (http-get narinfo))) + (begin + (wait-for-file cached) + (response-code (http-get nar))))))))) + (test-equal "/log/NAME" `(200 #t application/x-bzip2) (let ((drv (run-with-store %store