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.
master
parent
95024494f3
commit
5e7cf66fb3
|
@ -681,7 +681,8 @@ return it; otherwise, return 404. When TTL is true, use it as the
|
||||||
(item (and hash
|
(item (and hash
|
||||||
(guard (c ((store-error? c) #f))
|
(guard (c ((store-error? c) #f))
|
||||||
(hash-part->path store hash)))))
|
(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
|
;; Render STORE-ITEM live. We reach this because STORE-ITEM is
|
||||||
;; being baked but clients are already asking for it. Thus, we're
|
;; being baked but clients are already asking for it. Thus, we're
|
||||||
;; duplicating work, but doing so allows us to reduce delays.
|
;; duplicating work, but doing so allows us to reduce delays.
|
||||||
|
|
|
@ -622,6 +622,41 @@ References: ~%"
|
||||||
(stat:size (stat item)))
|
(stat:size (stat item)))
|
||||||
(response-code response))))))))))
|
(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"
|
(test-equal "/log/NAME"
|
||||||
`(200 #t application/x-bzip2)
|
`(200 #t application/x-bzip2)
|
||||||
(let ((drv (run-with-store %store
|
(let ((drv (run-with-store %store
|
||||||
|
|
Reference in New Issue