From d17eea9b60f0571ba3dd07275a7ee31ab22a1a9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20Gaud=C3=AAncio?= Date: Mon, 24 Aug 2026 09:09:49 +0200 Subject: [PATCH] tests: cover non-ASCII filename encoding in Content-Disposition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * added a café résumé.pdf case to TestServeSetHeadersContentDisposition, exercising url.PathEscape for filename* (spaces + multi-byte UTF-8). * documents current behavior: legacy filename keeps raw UTF-8 bytes. --- modules/httplib/serve_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/httplib/serve_test.go b/modules/httplib/serve_test.go index 5e13abe24f..cd64028d86 100644 --- a/modules/httplib/serve_test.go +++ b/modules/httplib/serve_test.go @@ -121,6 +121,12 @@ func TestServeSetHeadersContentDisposition(t *testing.T) { ServeSetHeaders(w, &ServeHeaderOptions{Filename: "foo.zip", Disposition: "inline"}) assert.Equal(t, `inline; filename="foo.zip"; filename*=UTF-8''foo.zip`, w.Header().Get("Content-Disposition")) + // the "filename*" parameter is percent-encoded, while the legacy "filename" parameter + // keeps the raw UTF-8 bytes (only backslashes and quotes are escaped) + w = httptest.NewRecorder() + ServeSetHeaders(w, &ServeHeaderOptions{Filename: "café résumé.pdf"}) + assert.Equal(t, `attachment; filename="café résumé.pdf"; filename*=UTF-8''caf%C3%A9%20r%C3%A9sum%C3%A9.pdf`, w.Header().Get("Content-Disposition")) + w = httptest.NewRecorder() ServeSetHeaders(w, &ServeHeaderOptions{}) assert.Empty(t, w.Header().Get("Content-Disposition"))