diff --git a/core/corehttp/gateway_handler.go b/core/corehttp/gateway_handler.go index bf164f9cb8d..caef0822d85 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" @@ -131,7 +132,6 @@ func (i *gatewayHandler) optionsHandler(w http.ResponseWriter, r *http.Request) } func (i *gatewayHandler) getOrHeadHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) { - urlPath := r.URL.Path escapedURLPath := r.URL.EscapedPath() @@ -266,7 +266,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 c5a4aa39c75..44f9b9160e6 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