From 58a66cae3c399b2d875a23f468f5973445e787d1 Mon Sep 17 00:00:00 2001 From: Giteabot Date: Tue, 5 May 2026 11:21:07 -0700 Subject: [PATCH] Make ServeSetHeaders default to download attachment if filename exists (#37552) (#37555) Backport #37552 Fix #37550 Co-authored-by: wxiaoguang --- modules/httplib/serve.go | 5 +++-- modules/httplib/serve_test.go | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/modules/httplib/serve.go b/modules/httplib/serve.go index 6c2fe9b0d6..d51c938bf0 100644 --- a/modules/httplib/serve.go +++ b/modules/httplib/serve.go @@ -87,8 +87,9 @@ func ServeSetHeaders(w http.ResponseWriter, opts ServeHeaderOptions) { if opts.ContentLength != nil { header.Set("Content-Length", strconv.FormatInt(*opts.ContentLength, 10)) } - if opts.Filename != "" && opts.ContentDisposition != "" { - header.Set("Content-Disposition", encodeContentDisposition(opts.ContentDisposition, path.Base(opts.Filename))) + if opts.Filename != "" { + contentDisposition := util.IfZero(opts.ContentDisposition, ContentDispositionAttachment) + header.Set("Content-Disposition", encodeContentDisposition(contentDisposition, path.Base(opts.Filename))) header.Set("Access-Control-Expose-Headers", "Content-Disposition") } diff --git a/modules/httplib/serve_test.go b/modules/httplib/serve_test.go index 2a245300b0..419085237c 100644 --- a/modules/httplib/serve_test.go +++ b/modules/httplib/serve_test.go @@ -133,3 +133,11 @@ func TestServeSetHeaderContentRelated(t *testing.T) { // make sure sandboxed require.Contains(t, serveHeaderCspDefault, "; sandbox") } + +func TestServeSetHeaders(t *testing.T) { + w := httptest.NewRecorder() + ServeSetHeaders(w, ServeHeaderOptions{Filename: "foo.zip"}) + assert.Equal(t, "attachment; filename=foo.zip", w.Header().Get("Content-Disposition")) + ServeSetHeaders(w, ServeHeaderOptions{Filename: "foo.zip", ContentDisposition: ContentDispositionInline}) + assert.Equal(t, "inline; filename=foo.zip", w.Header().Get("Content-Disposition")) +}