publish: Do not path the empty string to 'query-path-info'.

Fixes <https://bugs.gnu.org/44442>.
Regression introduced in 2b2ab7796a.

* 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.
This commit is contained in:
Ludovic Courtès 2020-11-04 15:57:00 +01:00
parent 95024494f3
commit 5e7cf66fb3
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
2 changed files with 37 additions and 1 deletions

View file

@ -681,7 +681,8 @@ (define* (render-nar/cached store cache request store-item
(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.

View file

@ -622,6 +622,41 @@ (define %gzip-magic-bytes
(stat:size (stat item)))
(response-code response))))))))))
(test-equal "with cache, cache bypass, unmapped hash part"
200
;; This test reproduces the bug described in <https://bugs.gnu.org/44442>:
;; 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