...
1
2
3
4
5
6
7
8
9 package middleware
10
11 import (
12 "net/http"
13 "strings"
14
15 "github.com/go-openapi/runtime/middleware/header"
16 )
17
18
19
20
21
22 func NegotiateContentEncoding(r *http.Request, offers []string) string {
23 bestOffer := "identity"
24 bestQ := -1.0
25 specs := header.ParseAccept(r.Header, "Accept-Encoding")
26 for _, offer := range offers {
27 for _, spec := range specs {
28 if spec.Q > bestQ &&
29 (spec.Value == "*" || spec.Value == offer) {
30 bestQ = spec.Q
31 bestOffer = offer
32 }
33 }
34 }
35 if bestQ == 0 {
36 bestOffer = ""
37 }
38 return bestOffer
39 }
40
41
42
43
44
45
46 func NegotiateContentType(r *http.Request, offers []string, defaultOffer string) string {
47 bestOffer := defaultOffer
48 bestQ := -1.0
49 bestWild := 3
50 specs := header.ParseAccept(r.Header, "Accept")
51 for _, rawOffer := range offers {
52 offer := normalizeOffer(rawOffer)
53
54 if len(specs) == 0 {
55 return rawOffer
56 }
57 for _, spec := range specs {
58 switch {
59 case spec.Q == 0.0:
60
61 case spec.Q < bestQ:
62
63 case spec.Value == "*/*":
64 if spec.Q > bestQ || bestWild > 2 {
65 bestQ = spec.Q
66 bestWild = 2
67 bestOffer = rawOffer
68 }
69 case strings.HasSuffix(spec.Value, "/*"):
70 if strings.HasPrefix(offer, spec.Value[:len(spec.Value)-1]) &&
71 (spec.Q > bestQ || bestWild > 1) {
72 bestQ = spec.Q
73 bestWild = 1
74 bestOffer = rawOffer
75 }
76 default:
77 if spec.Value == offer &&
78 (spec.Q > bestQ || bestWild > 0) {
79 bestQ = spec.Q
80 bestWild = 0
81 bestOffer = rawOffer
82 }
83 }
84 }
85 }
86 return bestOffer
87 }
88
89 func normalizeOffers(orig []string) (norm []string) {
90 for _, o := range orig {
91 norm = append(norm, normalizeOffer(o))
92 }
93 return
94 }
95
96 func normalizeOffer(orig string) string {
97 return strings.SplitN(orig, ";", 2)[0]
98 }
99
View as plain text