1
1
package acceptHeaders
2
2
3
3
import (
4
+ "mjpclab.dev/ghfs/src/util"
4
5
"strconv"
5
6
"strings"
6
7
)
7
8
8
- const qualitySign = "; q="
9
+ const qualitySign = "q="
9
10
const defaultQuality = 1000
10
11
const maxQualityDecimals = 3
11
12
@@ -42,9 +43,21 @@ func (item acceptItem) match(value string) bool {
42
43
}
43
44
44
45
func parseAcceptItem (input string ) acceptItem {
45
- value := input
46
- if semiColonIndex := strings .IndexByte (value , ';' ); semiColonIndex >= 0 {
47
- value = value [:semiColonIndex ]
46
+ entries := strings .Split (input , ";" )
47
+ if len (entries ) == 0 {
48
+ return acceptItem {}
49
+ }
50
+ util .InPlaceTrim (entries )
51
+
52
+ value := entries [0 ]
53
+ entries = entries [1 :]
54
+
55
+ quality := defaultQuality
56
+ for _ , entry := range entries {
57
+ entry = strings .TrimSpace (entry )
58
+ if strings .HasPrefix (entry , qualitySign ) {
59
+ quality = parseQuality (entry [len (qualitySign ):])
60
+ }
48
61
}
49
62
50
63
wildcards := 0
@@ -54,43 +67,37 @@ func parseAcceptItem(input string) acceptItem {
54
67
wildcards = 1
55
68
}
56
69
57
- rest := input [len (value ):]
58
- qSignIndex := strings .Index (rest , qualitySign )
59
- if qSignIndex < 0 {
60
- return acceptItem {value , defaultQuality , wildcards }
61
- }
70
+ return acceptItem {value , quality , wildcards }
71
+ }
62
72
63
- rest = rest [qSignIndex + len (qualitySign ):]
64
- if semiColonIndex := strings .IndexByte (rest , ';' ); semiColonIndex >= 0 {
65
- rest = rest [:semiColonIndex ]
66
- }
67
- qLen := len (rest )
73
+ func parseQuality (input string ) (quality int ) {
74
+ qLen := len (input )
68
75
69
76
if qLen == 0 {
70
- return acceptItem { value , defaultQuality , wildcards }
77
+ return defaultQuality
71
78
}
72
- if qLen > 1 && rest [1 ] != '.' {
73
- return acceptItem { value , defaultQuality , wildcards }
79
+ if qLen > 1 && input [1 ] != '.' {
80
+ return defaultQuality
74
81
}
75
82
76
- // "q= 1" or q is an invalid value
77
- if rest [0 ] != '0' {
78
- return acceptItem { value , defaultQuality , wildcards }
83
+ // q is " 1" or q is an invalid value
84
+ if input [0 ] != '0' {
85
+ return defaultQuality
79
86
}
80
87
81
- // "q= 0."
88
+ // "0."
82
89
if qLen <= 2 {
83
- return acceptItem { value , 0 , wildcards }
90
+ return 0
84
91
}
85
92
86
- rest = rest [2 :]
87
- qDecimalLen := len (rest )
93
+ input = input [2 :]
94
+ qDecimalLen := len (input )
88
95
if qDecimalLen > maxQualityDecimals {
89
96
qDecimalLen = maxQualityDecimals
90
- rest = rest [:qDecimalLen ]
97
+ input = input [:qDecimalLen ]
91
98
}
92
99
93
- quality , err := strconv .Atoi (rest )
100
+ quality , err := strconv .Atoi (input )
94
101
if err != nil {
95
102
quality = defaultQuality
96
103
} else {
@@ -99,5 +106,5 @@ func parseAcceptItem(input string) acceptItem {
99
106
quality *= 10
100
107
}
101
108
}
102
- return acceptItem { value , quality , wildcards }
109
+ return quality
103
110
}
0 commit comments