diff --git a/core/corehttp/gateway_handler.go b/core/corehttp/gateway_handler.go index bcd1afd933c..6c917031d5e 100644 --- a/core/corehttp/gateway_handler.go +++ b/core/corehttp/gateway_handler.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "net/http" + "net/url" "os" gopath "path" "runtime/debug" @@ -259,7 +260,14 @@ func (i *gatewayHandler) getOrHeadHandler(ctx context.Context, w http.ResponseWr } if !dir { - name := gopath.Base(urlPath) + urlFilename := r.URL.Query().Get("filename") + var name string + if urlFilename != "" { + w.Header().Set("Content-Disposition", fmt.Sprintf("inline; filename*=UTF-8''%s", url.PathEscape(urlFilename))) + name = urlFilename + } else { + name = gopath.Base(urlPath) + } i.serveFile(w, r, name, modtime, dr) return } diff --git a/test/sharness/t0110-gateway.sh b/test/sharness/t0110-gateway.sh index 92fa85e0977..7d519911bc6 100755 --- a/test/sharness/t0110-gateway.sh +++ b/test/sharness/t0110-gateway.sh @@ -31,6 +31,11 @@ test_expect_success "GET IPFS path succeeds" ' curl -sfo actual "http://127.0.0.1:$port/ipfs/$HASH" ' +test_expect_success "GET IPFS path with explicit filename succeeds with proper header" " + curl -fo actual -D actual_headers 'http://127.0.0.1:$port/ipfs/$HASH?filename=testтест' && + grep -F \"Content-Disposition: inline; filename*=UTF-8''test%D1%82%D0%B5%D1%81%D1%82\" actual_headers +" + test_expect_success "GET IPFS path output looks good" ' test_cmp expected actual && rm actual