1 package v2
2
3 import (
4 "testing"
5 )
6
7 func TestParseForwardedHeader(t *testing.T) {
8 for _, tc := range []struct {
9 name string
10 raw string
11 expected map[string]string
12 expectedRest string
13 expectedError bool
14 }{
15 {
16 name: "empty",
17 raw: "",
18 },
19 {
20 name: "one pair",
21 raw: " key = value ",
22 expected: map[string]string{"key": "value"},
23 },
24 {
25 name: "two pairs",
26 raw: " key1 = value1; key2=value2",
27 expected: map[string]string{"key1": "value1", "key2": "value2"},
28 },
29 {
30 name: "uppercase parameter",
31 raw: "KeY=VaL",
32 expected: map[string]string{"key": "VaL"},
33 },
34 {
35 name: "missing key=value pair - be tolerant",
36 raw: "key=val;",
37 expected: map[string]string{"key": "val"},
38 },
39 {
40 name: "quoted values",
41 raw: `key="val";param = "[[ $((1 + 1)) == 3 ]] && echo panic!;" ; p=" abcd "`,
42 expected: map[string]string{"key": "val", "param": "[[ $((1 + 1)) == 3 ]] && echo panic!;", "p": " abcd "},
43 },
44 {
45 name: "empty quoted value",
46 raw: `key=""`,
47 expected: map[string]string{"key": ""},
48 },
49 {
50 name: "quoted double quotes",
51 raw: `key="\"value\""`,
52 expected: map[string]string{"key": `"value"`},
53 },
54 {
55 name: "quoted backslash",
56 raw: `key="\"\\\""`,
57 expected: map[string]string{"key": `"\"`},
58 },
59 {
60 name: "ignore subsequent elements",
61 raw: "key=a, param= b",
62 expected: map[string]string{"key": "a"},
63 expectedRest: " param= b",
64 },
65 {
66 name: "empty element - be tolerant",
67 raw: " , key=val",
68 expectedRest: " key=val",
69 },
70 {
71 name: "obscure key",
72 raw: `ob₷C&r€ = value`,
73 expected: map[string]string{`ob₷c&r€`: "value"},
74 },
75 {
76 name: "duplicate parameter",
77 raw: "key=a; p=b; key=c",
78 expectedError: true,
79 },
80 {
81 name: "empty parameter",
82 raw: "=value",
83 expectedError: true,
84 },
85 {
86 name: "empty value",
87 raw: "key= ",
88 expectedError: true,
89 },
90 {
91 name: "empty value before a new element ",
92 raw: "key=,",
93 expectedError: true,
94 },
95 {
96 name: "empty value before a new pair",
97 raw: "key=;",
98 expectedError: true,
99 },
100 {
101 name: "just parameter",
102 raw: "key",
103 expectedError: true,
104 },
105 {
106 name: "missing key-value",
107 raw: "a=b;;",
108 expectedError: true,
109 },
110 {
111 name: "unclosed quoted value",
112 raw: `key="value`,
113 expectedError: true,
114 },
115 {
116 name: "escaped terminating dquote",
117 raw: `key="value\"`,
118 expectedError: true,
119 },
120 {
121 name: "just a quoted value",
122 raw: `"key=val"`,
123 expectedError: true,
124 },
125 {
126 name: "quoted key",
127 raw: `"key"=val`,
128 expectedError: true,
129 },
130 } {
131 parsed, rest, err := parseForwardedHeader(tc.raw)
132 if err != nil && !tc.expectedError {
133 t.Errorf("[%s] got unexpected error: %v", tc.name, err)
134 }
135 if err == nil && tc.expectedError {
136 t.Errorf("[%s] got unexpected non-error", tc.name)
137 }
138 if err != nil || tc.expectedError {
139 continue
140 }
141 for key, value := range tc.expected {
142 v, exists := parsed[key]
143 if !exists {
144 t.Errorf("[%s] missing expected parameter %q", tc.name, key)
145 continue
146 }
147 if v != value {
148 t.Errorf("[%s] got unexpected value for parameter %q: %q != %q", tc.name, key, v, value)
149 }
150 }
151 for key, value := range parsed {
152 if _, exists := tc.expected[key]; !exists {
153 t.Errorf("[%s] got unexpected key/value pair: %q=%q", tc.name, key, value)
154 }
155 }
156
157 if rest != tc.expectedRest {
158 t.Errorf("[%s] got unexpected unparsed string: %q != %q", tc.name, rest, tc.expectedRest)
159 }
160 }
161 }
162
View as plain text