mime.go 955 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package fileupload
  2. import (
  3. "mime"
  4. "strings"
  5. )
  6. func normalizeMediaType(s string) string {
  7. s = strings.TrimSpace(s)
  8. if s == "" {
  9. return ""
  10. }
  11. mt, _, err := mime.ParseMediaType(s)
  12. if err != nil {
  13. if idx := strings.Index(s, ";"); idx >= 0 {
  14. return strings.ToLower(strings.TrimSpace(s[:idx]))
  15. }
  16. return strings.ToLower(s)
  17. }
  18. return strings.ToLower(mt)
  19. }
  20. func mimeAllowed(detected string, allowed []string) bool {
  21. d := normalizeMediaType(detected)
  22. if d == "" {
  23. return false
  24. }
  25. for _, raw := range allowed {
  26. if mimeRuleMatches(d, raw) {
  27. return true
  28. }
  29. }
  30. return false
  31. }
  32. func mimeRuleMatches(detectedNormalized, raw string) bool {
  33. a := strings.TrimSpace(strings.ToLower(raw))
  34. if a == "" {
  35. return false
  36. }
  37. if !strings.HasSuffix(a, "/*") {
  38. rule := normalizeMediaType(raw)
  39. return rule != "" && rule == detectedNormalized
  40. }
  41. prefix := strings.TrimSuffix(a, "/*")
  42. return strings.HasPrefix(detectedNormalized, prefix+"/")
  43. }