package storage import ( "strings" ) // sanitizeFilename removes characters that could cause header injection in Content-Disposition. func sanitizeFilename(name string) string { var b strings.Builder b.Grow(len(name)) for _, r := range name { // Strip control chars, newlines, null bytes, quotes, semicolons, backslashes if r < 0x20 || r == 0x7f || r == '"' || r == ';' || r == '\\' || r == '\x00' { b.WriteRune('_') } else { b.WriteRune(r) } } return b.String() } func ContentDisposition(contentType, filename string) string { disposition := "attachment" if isInlineContentType(contentType) { disposition = "inline" } return disposition + `; filename="` + sanitizeFilename(filename) + `"` } func AttachmentContentDisposition(filename string) string { return `attachment; filename="` + sanitizeFilename(filename) + `"` } // isInlineContentType returns true for media types that browsers should // display inline (images, video, audio, PDF). Everything else triggers a // download via Content-Disposition: attachment. // // SVG is excluded even though its MIME type is image/svg+xml: SVG is XML // and can carry