| package restful |
| |
| import ( |
| "strconv" |
| "strings" |
| ) |
| |
| type mime struct { |
| media string |
| quality float64 |
| } |
| |
| // insertMime adds a mime to a list and keeps it sorted by quality. |
| func insertMime(l []mime, e mime) []mime { |
| for i, each := range l { |
| // if current mime has lower quality then insert before |
| if e.quality > each.quality { |
| left := append([]mime{}, l[0:i]...) |
| return append(append(left, e), l[i:]...) |
| } |
| } |
| return append(l, e) |
| } |
| |
| // sortedMimes returns a list of mime sorted (desc) by its specified quality. |
| func sortedMimes(accept string) (sorted []mime) { |
| for _, each := range strings.Split(accept, ",") { |
| typeAndQuality := strings.Split(strings.Trim(each, " "), ";") |
| if len(typeAndQuality) == 1 { |
| sorted = insertMime(sorted, mime{typeAndQuality[0], 1.0}) |
| } else { |
| // take factor |
| parts := strings.Split(typeAndQuality[1], "=") |
| if len(parts) == 2 { |
| f, err := strconv.ParseFloat(parts[1], 64) |
| if err != nil { |
| traceLogger.Printf("unable to parse quality in %s, %v", each, err) |
| } else { |
| sorted = insertMime(sorted, mime{typeAndQuality[0], f}) |
| } |
| } |
| } |
| } |
| return |
| } |