fix: filename truncation for HTML-encoded ampersands in Content-Disposition (#1215)

This commit is contained in:
Copilot authored and GitHub committed 2026-01-05 22:56:04 +08:00
1 parent 6756d82ffa
commit abd16d5326
4 files changed
+303 -5

No files matched your search

+29
View File
@@ -192,6 +192,35 @@ func StartTestCustomServer() net.Listener {
defer file.Close()
io.Copy(writer, file)
})
// Test endpoint for filename with HTML-encoded ampersand (&)
// This tests the case from the bug report where filenames containing & are
// HTML-encoded as & by the server, causing truncation at the semicolon.
// Example: "查询处理&优化.pptx" -> "查询处理&优化.pptx"
mux.HandleFunc("/ampersand-encoded", func(writer http.ResponseWriter, request *http.Request) {
// Simulate server sending filename with HTML-encoded ampersand
writer.Header().Set("Content-Disposition", `attachment; filename="查询处理&优化.pptx"`)
writer.Header().Set("Content-Type", "application/octet-stream")
writer.Header().Set("Content-Length", fmt.Sprintf("%d", BuildSize))
file, err := os.Open(BuildFile)
if err != nil {
panic(err)
}
defer file.Close()
io.Copy(writer, file)
})
// Test endpoint for unquoted filename with HTML-encoded ampersand
// Some servers might send unquoted filenames with HTML entities
mux.HandleFunc("/ampersand-unquoted", func(writer http.ResponseWriter, request *http.Request) {
writer.Header().Set("Content-Disposition", `attachment; filename=test&file.txt`)
writer.Header().Set("Content-Type", "application/octet-stream")
writer.Header().Set("Content-Length", fmt.Sprintf("%d", BuildSize))
file, err := os.Open(BuildFile)
if err != nil {
panic(err)
}
defer file.Close()
io.Copy(writer, file)
})
return mux
})
}