blob: b997b31b8b5d16747d89bc6a807d5b59fc9b36e8 [file] [log] [blame]
Tim Duesterhusd371e992021-04-15 21:45:58 +02001varnishtest "normalize-uri tests"
2#REQUIRE_VERSION=2.4
3
4# This reg-test tests the http-request normalize-uri action.
5
6feature ignore_unknown_macro
7
8server s1 {
9 rxreq
10 txresp
Tim Duesterhusa4071932021-04-15 21:46:02 +020011} -repeat 43 -start
Tim Duesterhusd371e992021-04-15 21:45:58 +020012
13haproxy h1 -conf {
14 defaults
15 mode http
16 timeout connect 1s
17 timeout client 1s
18 timeout server 1s
19
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020020 frontend fe_path_merge_slashes
21 bind "fd@${fe_path_merge_slashes}"
Tim Duesterhusd371e992021-04-15 21:45:58 +020022
23 http-request set-var(txn.before) url
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020024 http-request normalize-uri path-merge-slashes
Tim Duesterhusd371e992021-04-15 21:45:58 +020025 http-request set-var(txn.after) url
26
27 http-response add-header before %[var(txn.before)]
28 http-response add-header after %[var(txn.after)]
29
30 default_backend be
31
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020032 frontend fe_path_strip_dotdot
33 bind "fd@${fe_path_strip_dotdot}"
Tim Duesterhus9982fc22021-04-15 21:45:59 +020034
35 http-request set-var(txn.before) url
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020036 http-request normalize-uri path-strip-dotdot
Tim Duesterhus9982fc22021-04-15 21:45:59 +020037 http-request set-var(txn.after) url
38
Tim Duesterhus560e1a62021-04-15 21:46:00 +020039 http-request set-uri %[var(txn.before)]
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020040 http-request normalize-uri path-strip-dotdot full
Tim Duesterhus560e1a62021-04-15 21:46:00 +020041 http-request set-var(txn.after_full) url
42
Tim Duesterhus9982fc22021-04-15 21:45:59 +020043 http-response add-header before %[var(txn.before)]
44 http-response add-header after %[var(txn.after)]
Tim Duesterhus560e1a62021-04-15 21:46:00 +020045 http-response add-header after-full %[var(txn.after_full)]
Tim Duesterhus9982fc22021-04-15 21:45:59 +020046
47 default_backend be
48
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020049 frontend fe_sort_query_by_name
50 bind "fd@${fe_sort_query_by_name}"
Tim Duesterhusd7b89be2021-04-15 21:46:01 +020051
52 http-request set-var(txn.before) url
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020053 http-request normalize-uri query-sort-by-name
Tim Duesterhusd7b89be2021-04-15 21:46:01 +020054 http-request set-var(txn.after) url
55
56 http-response add-header before %[var(txn.before)]
57 http-response add-header after %[var(txn.after)]
58
59 default_backend be
60
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020061 frontend fe_percent_to_uppercase
62 bind "fd@${fe_percent_to_uppercase}"
Tim Duesterhusa4071932021-04-15 21:46:02 +020063
64 http-request set-var(txn.before) url
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020065 http-request normalize-uri percent-to-uppercase
Tim Duesterhusa4071932021-04-15 21:46:02 +020066 http-request set-var(txn.after) url
67
68 http-response add-header before %[var(txn.before)]
69 http-response add-header after %[var(txn.after)]
70
71 default_backend be
72
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020073 frontend fe_percent_to_uppercase_strict
74 bind "fd@${fe_percent_to_uppercase_strict}"
Tim Duesterhusa4071932021-04-15 21:46:02 +020075
76 http-request set-var(txn.before) url
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020077 http-request normalize-uri percent-to-uppercase strict
Tim Duesterhusa4071932021-04-15 21:46:02 +020078 http-request set-var(txn.after) url
79
80 http-response add-header before %[var(txn.before)]
81 http-response add-header after %[var(txn.after)]
82
83 default_backend be
84
Tim Duesterhusd371e992021-04-15 21:45:58 +020085 backend be
86 server s1 ${s1_addr}:${s1_port}
87
88} -start
89
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020090client c1 -connect ${h1_fe_path_merge_slashes_sock} {
Tim Duesterhusd371e992021-04-15 21:45:58 +020091 txreq -url "/foo/bar"
92 rxresp
93 expect resp.http.before == "/foo/bar"
94 expect resp.http.after == "/foo/bar"
95
96 txreq -url "/foo//bar"
97 rxresp
98 expect resp.http.before == "/foo//bar"
99 expect resp.http.after == "/foo/bar"
100
101 txreq -url "/foo///bar"
102 rxresp
103 expect resp.http.before == "/foo///bar"
104 expect resp.http.after == "/foo/bar"
105
106 txreq -url "///foo///bar"
107 rxresp
108 expect resp.http.before == "///foo///bar"
109 expect resp.http.after == "/foo/bar"
110
111 txreq -url "///foo/bar"
112 rxresp
113 expect resp.http.before == "///foo/bar"
114 expect resp.http.after == "/foo/bar"
115
116 txreq -url "///foo///bar///"
117 rxresp
118 expect resp.http.before == "///foo///bar///"
119 expect resp.http.after == "/foo/bar/"
120
121 txreq -url "///"
122 rxresp
123 expect resp.http.before == "///"
124 expect resp.http.after == "/"
125
126 txreq -url "/foo?bar=///"
127 rxresp
128 expect resp.http.before == "/foo?bar=///"
129 expect resp.http.after == "/foo?bar=///"
130
131 txreq -url "//foo?bar=///"
132 rxresp
133 expect resp.http.before == "//foo?bar=///"
134 expect resp.http.after == "/foo?bar=///"
135
136 txreq -req OPTIONS -url "*"
137 rxresp
138 expect resp.http.before == "*"
139 expect resp.http.after == "*"
140} -run
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200141
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200142client c2 -connect ${h1_fe_path_strip_dotdot_sock} {
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200143 txreq -url "/foo/bar"
144 rxresp
145 expect resp.http.before == "/foo/bar"
146 expect resp.http.after == "/foo/bar"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200147 expect resp.http.after-full == "/foo/bar"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200148
149 txreq -url "/foo/.."
150 rxresp
151 expect resp.http.before == "/foo/.."
152 expect resp.http.after == "/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200153 expect resp.http.after-full == "/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200154
155 txreq -url "/foo/../"
156 rxresp
157 expect resp.http.before == "/foo/../"
158 expect resp.http.after == "/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200159 expect resp.http.after-full == "/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200160
161 txreq -url "/foo/bar/../"
162 rxresp
163 expect resp.http.before == "/foo/bar/../"
164 expect resp.http.after == "/foo/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200165 expect resp.http.after-full == "/foo/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200166
167 txreq -url "/foo/../bar"
168 rxresp
169 expect resp.http.before == "/foo/../bar"
170 expect resp.http.after == "/bar"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200171 expect resp.http.after-full == "/bar"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200172
173 txreq -url "/foo/../bar/"
174 rxresp
175 expect resp.http.before == "/foo/../bar/"
176 expect resp.http.after == "/bar/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200177 expect resp.http.after-full == "/bar/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200178
179 txreq -url "/foo/../../bar/"
180 rxresp
181 expect resp.http.before == "/foo/../../bar/"
182 expect resp.http.after == "/../bar/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200183 expect resp.http.after-full == "/bar/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200184
185 txreq -url "/foo//../../bar/"
186 rxresp
187 expect resp.http.before == "/foo//../../bar/"
188 expect resp.http.after == "/bar/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200189 expect resp.http.after-full == "/bar/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200190
191 txreq -url "/foo/?bar=/foo/../"
192 rxresp
193 expect resp.http.before == "/foo/?bar=/foo/../"
194 expect resp.http.after == "/foo/?bar=/foo/../"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200195 expect resp.http.after-full == "/foo/?bar=/foo/../"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200196
197 txreq -url "/foo/../?bar=/foo/../"
198 rxresp
199 expect resp.http.before == "/foo/../?bar=/foo/../"
200 expect resp.http.after == "/?bar=/foo/../"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200201 expect resp.http.after-full == "/?bar=/foo/../"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200202
203 txreq -req OPTIONS -url "*"
204 rxresp
205 expect resp.http.before == "*"
206 expect resp.http.after == "*"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200207 expect resp.http.after-full == "*"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200208} -run
Tim Duesterhusd7b89be2021-04-15 21:46:01 +0200209
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200210client c3 -connect ${h1_fe_sort_query_by_name_sock} {
Tim Duesterhusd7b89be2021-04-15 21:46:01 +0200211 txreq -url "/?a=a"
212 rxresp
213 expect resp.http.before == "/?a=a"
214 expect resp.http.after == "/?a=a"
215
216 txreq -url "/?a=a&z=z"
217 rxresp
218 expect resp.http.before == "/?a=a&z=z"
219 expect resp.http.after == "/?a=a&z=z"
220
221 txreq -url "/?z=z&a=a"
222 rxresp
223 expect resp.http.before == "/?z=z&a=a"
224 expect resp.http.after == "/?a=a&z=z"
225
226 txreq -url "/?a=z&z=a"
227 rxresp
228 expect resp.http.before == "/?a=z&z=a"
229 expect resp.http.after == "/?a=z&z=a"
230
231 txreq -url "/?z=a&a=z"
232 rxresp
233 expect resp.http.before == "/?z=a&a=z"
234 expect resp.http.after == "/?a=z&z=a"
235
236 txreq -url "/?c&b&a&z&x&y"
237 rxresp
238 expect resp.http.before == "/?c&b&a&z&x&y"
239 expect resp.http.after == "/?a&b&c&x&y&z"
240
241 txreq -url "/?a=&aa=&aaa=&aaaa="
242 rxresp
243 expect resp.http.before == "/?a=&aa=&aaa=&aaaa="
244 expect resp.http.after == "/?a=&aa=&aaa=&aaaa="
245
246 txreq -url "/?aaaa=&a=&aa=&aaa="
247 rxresp
248 expect resp.http.before == "/?aaaa=&a=&aa=&aaa="
249 expect resp.http.after == "/?a=&aa=&aaa=&aaaa="
250
251 txreq -url "/?a=5&a=3&a=1&a=2&a=4"
252 rxresp
253 expect resp.http.before == "/?a=5&a=3&a=1&a=2&a=4"
254 expect resp.http.after == "/?a=5&a=3&a=1&a=2&a=4"
255
256 txreq -url "/?a=5&b=3&a=1&a=2&b=4"
257 rxresp
258 expect resp.http.before == "/?a=5&b=3&a=1&a=2&b=4"
259 expect resp.http.after == "/?a=5&a=1&a=2&b=3&b=4"
260
261 txreq -url "/"
262 rxresp
263 expect resp.http.before == "/"
264 expect resp.http.after == "/"
265
266 txreq -url "/?"
267 rxresp
268 expect resp.http.before == "/?"
269 expect resp.http.after == "/?"
270
271 txreq -req OPTIONS -url "*"
272 rxresp
273 expect resp.http.before == "*"
274 expect resp.http.after == "*"
275} -run
Tim Duesterhusa4071932021-04-15 21:46:02 +0200276
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200277client c4 -connect ${h1_fe_percent_to_uppercase_sock} {
Tim Duesterhusa4071932021-04-15 21:46:02 +0200278 txreq -url "/a?a=a"
279 rxresp
280 expect resp.http.before == "/a?a=a"
281 expect resp.http.after == "/a?a=a"
282
283 txreq -url "/%aa?a=%aa"
284 rxresp
285 expect resp.http.before == "/%aa?a=%aa"
286 expect resp.http.after == "/%AA?a=%AA"
287
288 txreq -url "/%zz?a=%zz"
289 rxresp
290 expect resp.status == 200
291 expect resp.http.before == "/%zz?a=%zz"
292 expect resp.http.after == "/%zz?a=%zz"
293
294 txreq -req OPTIONS -url "*"
295 rxresp
296 expect resp.http.before == "*"
297 expect resp.http.after == "*"
298} -run
299
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200300client c5 -connect ${h1_fe_percent_to_uppercase_strict_sock} {
Tim Duesterhusa4071932021-04-15 21:46:02 +0200301 txreq -url "/a?a=a"
302 rxresp
303 expect resp.http.before == "/a?a=a"
304 expect resp.http.after == "/a?a=a"
305
306 txreq -url "/%aa?a=%aa"
307 rxresp
308 expect resp.http.before == "/%aa?a=%aa"
309 expect resp.http.after == "/%AA?a=%AA"
310
311 txreq -url "/%zz?a=%zz"
312 rxresp
313 expect resp.status == 400
314} -run