mime.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package restful
  2. import (
  3. "strconv"
  4. "strings"
  5. )
  6. type mime struct {
  7. media string
  8. quality float64
  9. }
  10. // insertMime adds a mime to a list and keeps it sorted by quality.
  11. func insertMime(l []mime, e mime) []mime {
  12. for i, each := range l {
  13. // if current mime has lower quality then insert before
  14. if e.quality > each.quality {
  15. left := append([]mime{}, l[0:i]...)
  16. return append(append(left, e), l[i:]...)
  17. }
  18. }
  19. return append(l, e)
  20. }
  21. // sortedMimes returns a list of mime sorted (desc) by its specified quality.
  22. func sortedMimes(accept string) (sorted []mime) {
  23. for _, each := range strings.Split(accept, ",") {
  24. typeAndQuality := strings.Split(strings.Trim(each, " "), ";")
  25. if len(typeAndQuality) == 1 {
  26. sorted = insertMime(sorted, mime{typeAndQuality[0], 1.0})
  27. } else {
  28. // take factor
  29. parts := strings.Split(typeAndQuality[1], "=")
  30. if len(parts) == 2 {
  31. f, err := strconv.ParseFloat(parts[1], 64)
  32. if err != nil {
  33. traceLogger.Printf("unable to parse quality in %s, %v", each, err)
  34. } else {
  35. sorted = insertMime(sorted, mime{typeAndQuality[0], f})
  36. }
  37. }
  38. }
  39. }
  40. return
  41. }