123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- 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
- }
|