Implement strict RFC 5987 header encoding to fix Next.js proxy crash
Some checks failed
Automated Container Build / build-and-push (push) Failing after 40s
Some checks failed
Automated Container Build / build-and-push (push) Failing after 40s
This commit is contained in:
parent
855c42edd9
commit
d139501dd4
1 changed files with 23 additions and 2 deletions
|
|
@ -1028,8 +1028,29 @@ func (h *FSHandler) Download(c *fiber.Ctx) error {
|
||||||
c.Set("Accept-Ranges", "bytes")
|
c.Set("Accept-Ranges", "bytes")
|
||||||
c.Set("Content-Type", mime.TypeByExtension(filepath.Ext(resolvedPath)))
|
c.Set("Content-Type", mime.TypeByExtension(filepath.Ext(resolvedPath)))
|
||||||
|
|
||||||
safeNameQuote := strings.ReplaceAll(info.Name(), "\"", "\\\"")
|
// Ultra-safe fallback name: replace quotes and non-ASCII with underscore
|
||||||
encodedName := url.PathEscape(info.Name())
|
safeNameBytes := make([]byte, 0, len(info.Name()))
|
||||||
|
for i := 0; i < len(info.Name()); i++ {
|
||||||
|
b := info.Name()[i]
|
||||||
|
if b >= 32 && b <= 126 && b != '"' && b != '\\' {
|
||||||
|
safeNameBytes = append(safeNameBytes, b)
|
||||||
|
} else {
|
||||||
|
safeNameBytes = append(safeNameBytes, '_')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
safeNameQuote := string(safeNameBytes)
|
||||||
|
|
||||||
|
// Strict RFC 5987 encoding for filename*=
|
||||||
|
var sb strings.Builder
|
||||||
|
for i := 0; i < len(info.Name()); i++ {
|
||||||
|
b := info.Name()[i]
|
||||||
|
if (b >= 'A' && b <= 'Z') || (b >= 'a' && b <= 'z') || (b >= '0' && b <= '9') || b == '.' || b == '-' || b == '_' || b == '~' {
|
||||||
|
sb.WriteByte(b)
|
||||||
|
} else {
|
||||||
|
sb.WriteString(fmt.Sprintf("%%%02X", b))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
encodedName := sb.String()
|
||||||
|
|
||||||
if c.Query("download") == "true" {
|
if c.Query("download") == "true" {
|
||||||
c.Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"; filename*=UTF-8''%s", safeNameQuote, encodedName))
|
c.Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"; filename*=UTF-8''%s", safeNameQuote, encodedName))
|
||||||
|
|
|
||||||
Reference in a new issue