blob: cc880606676cee57f72f56fd2e26d2475a54c999 [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 Duesterhus2e4a18e2021-04-21 21:20:36 +020011} -repeat 63 -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
Maximilian Maderff3bb8b2021-04-21 00:22:50 +020085 frontend fe_dot
86 bind "fd@${fe_dot}"
87
88 http-request set-var(txn.before) url
89 http-request normalize-uri path-strip-dot
90 http-request set-var(txn.after) url
91
92 http-response add-header before %[var(txn.before)]
93 http-response add-header after %[var(txn.after)]
94
95 default_backend be
96
Tim Duesterhus2e4a18e2021-04-21 21:20:36 +020097 frontend fe_percent_decode_unreserved
98 bind "fd@${fe_percent_decode_unreserved}"
99
100 http-request set-var(txn.before) url
101 http-request normalize-uri percent-decode-unreserved
102 http-request set-var(txn.after) url
103
104 http-response add-header before %[var(txn.before)]
105 http-response add-header after %[var(txn.after)]
106
107 default_backend be
108
109 frontend fe_percent_decode_unreserved_strict
110 bind "fd@${fe_percent_decode_unreserved_strict}"
111
112 http-request set-var(txn.before) url
113 http-request normalize-uri percent-decode-unreserved strict
114 http-request set-var(txn.after) url
115
116 http-response add-header before %[var(txn.before)]
117 http-response add-header after %[var(txn.after)]
118
119 default_backend be
120
Tim Duesterhusd371e992021-04-15 21:45:58 +0200121 backend be
122 server s1 ${s1_addr}:${s1_port}
123
124} -start
125
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200126client c1 -connect ${h1_fe_path_merge_slashes_sock} {
Tim Duesterhusd371e992021-04-15 21:45:58 +0200127 txreq -url "/foo/bar"
128 rxresp
129 expect resp.http.before == "/foo/bar"
130 expect resp.http.after == "/foo/bar"
131
132 txreq -url "/foo//bar"
133 rxresp
134 expect resp.http.before == "/foo//bar"
135 expect resp.http.after == "/foo/bar"
136
137 txreq -url "/foo///bar"
138 rxresp
139 expect resp.http.before == "/foo///bar"
140 expect resp.http.after == "/foo/bar"
141
142 txreq -url "///foo///bar"
143 rxresp
144 expect resp.http.before == "///foo///bar"
145 expect resp.http.after == "/foo/bar"
146
147 txreq -url "///foo/bar"
148 rxresp
149 expect resp.http.before == "///foo/bar"
150 expect resp.http.after == "/foo/bar"
151
152 txreq -url "///foo///bar///"
153 rxresp
154 expect resp.http.before == "///foo///bar///"
155 expect resp.http.after == "/foo/bar/"
156
157 txreq -url "///"
158 rxresp
159 expect resp.http.before == "///"
160 expect resp.http.after == "/"
161
162 txreq -url "/foo?bar=///"
163 rxresp
164 expect resp.http.before == "/foo?bar=///"
165 expect resp.http.after == "/foo?bar=///"
166
167 txreq -url "//foo?bar=///"
168 rxresp
169 expect resp.http.before == "//foo?bar=///"
170 expect resp.http.after == "/foo?bar=///"
171
172 txreq -req OPTIONS -url "*"
173 rxresp
174 expect resp.http.before == "*"
175 expect resp.http.after == "*"
176} -run
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200177
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200178client c2 -connect ${h1_fe_path_strip_dotdot_sock} {
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200179 txreq -url "/foo/bar"
180 rxresp
181 expect resp.http.before == "/foo/bar"
182 expect resp.http.after == "/foo/bar"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200183 expect resp.http.after-full == "/foo/bar"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200184
185 txreq -url "/foo/.."
186 rxresp
187 expect resp.http.before == "/foo/.."
188 expect resp.http.after == "/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200189 expect resp.http.after-full == "/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200190
191 txreq -url "/foo/../"
192 rxresp
193 expect resp.http.before == "/foo/../"
194 expect resp.http.after == "/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200195 expect resp.http.after-full == "/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200196
197 txreq -url "/foo/bar/../"
198 rxresp
199 expect resp.http.before == "/foo/bar/../"
200 expect resp.http.after == "/foo/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200201 expect resp.http.after-full == "/foo/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200202
203 txreq -url "/foo/../bar"
204 rxresp
205 expect resp.http.before == "/foo/../bar"
206 expect resp.http.after == "/bar"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200207 expect resp.http.after-full == "/bar"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200208
209 txreq -url "/foo/../bar/"
210 rxresp
211 expect resp.http.before == "/foo/../bar/"
212 expect resp.http.after == "/bar/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200213 expect resp.http.after-full == "/bar/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200214
215 txreq -url "/foo/../../bar/"
216 rxresp
217 expect resp.http.before == "/foo/../../bar/"
218 expect resp.http.after == "/../bar/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200219 expect resp.http.after-full == "/bar/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200220
221 txreq -url "/foo//../../bar/"
222 rxresp
223 expect resp.http.before == "/foo//../../bar/"
224 expect resp.http.after == "/bar/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200225 expect resp.http.after-full == "/bar/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200226
227 txreq -url "/foo/?bar=/foo/../"
228 rxresp
229 expect resp.http.before == "/foo/?bar=/foo/../"
230 expect resp.http.after == "/foo/?bar=/foo/../"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200231 expect resp.http.after-full == "/foo/?bar=/foo/../"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200232
233 txreq -url "/foo/../?bar=/foo/../"
234 rxresp
235 expect resp.http.before == "/foo/../?bar=/foo/../"
236 expect resp.http.after == "/?bar=/foo/../"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200237 expect resp.http.after-full == "/?bar=/foo/../"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200238
239 txreq -req OPTIONS -url "*"
240 rxresp
241 expect resp.http.before == "*"
242 expect resp.http.after == "*"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200243 expect resp.http.after-full == "*"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200244} -run
Tim Duesterhusd7b89be2021-04-15 21:46:01 +0200245
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200246client c3 -connect ${h1_fe_sort_query_by_name_sock} {
Tim Duesterhusd7b89be2021-04-15 21:46:01 +0200247 txreq -url "/?a=a"
248 rxresp
249 expect resp.http.before == "/?a=a"
250 expect resp.http.after == "/?a=a"
251
252 txreq -url "/?a=a&z=z"
253 rxresp
254 expect resp.http.before == "/?a=a&z=z"
255 expect resp.http.after == "/?a=a&z=z"
256
257 txreq -url "/?z=z&a=a"
258 rxresp
259 expect resp.http.before == "/?z=z&a=a"
260 expect resp.http.after == "/?a=a&z=z"
261
262 txreq -url "/?a=z&z=a"
263 rxresp
264 expect resp.http.before == "/?a=z&z=a"
265 expect resp.http.after == "/?a=z&z=a"
266
267 txreq -url "/?z=a&a=z"
268 rxresp
269 expect resp.http.before == "/?z=a&a=z"
270 expect resp.http.after == "/?a=z&z=a"
271
272 txreq -url "/?c&b&a&z&x&y"
273 rxresp
274 expect resp.http.before == "/?c&b&a&z&x&y"
275 expect resp.http.after == "/?a&b&c&x&y&z"
276
277 txreq -url "/?a=&aa=&aaa=&aaaa="
278 rxresp
279 expect resp.http.before == "/?a=&aa=&aaa=&aaaa="
280 expect resp.http.after == "/?a=&aa=&aaa=&aaaa="
281
282 txreq -url "/?aaaa=&a=&aa=&aaa="
283 rxresp
284 expect resp.http.before == "/?aaaa=&a=&aa=&aaa="
285 expect resp.http.after == "/?a=&aa=&aaa=&aaaa="
286
287 txreq -url "/?a=5&a=3&a=1&a=2&a=4"
288 rxresp
289 expect resp.http.before == "/?a=5&a=3&a=1&a=2&a=4"
290 expect resp.http.after == "/?a=5&a=3&a=1&a=2&a=4"
291
292 txreq -url "/?a=5&b=3&a=1&a=2&b=4"
293 rxresp
294 expect resp.http.before == "/?a=5&b=3&a=1&a=2&b=4"
295 expect resp.http.after == "/?a=5&a=1&a=2&b=3&b=4"
296
297 txreq -url "/"
298 rxresp
299 expect resp.http.before == "/"
300 expect resp.http.after == "/"
301
302 txreq -url "/?"
303 rxresp
304 expect resp.http.before == "/?"
305 expect resp.http.after == "/?"
306
307 txreq -req OPTIONS -url "*"
308 rxresp
309 expect resp.http.before == "*"
310 expect resp.http.after == "*"
311} -run
Tim Duesterhusa4071932021-04-15 21:46:02 +0200312
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200313client c4 -connect ${h1_fe_percent_to_uppercase_sock} {
Tim Duesterhusa4071932021-04-15 21:46:02 +0200314 txreq -url "/a?a=a"
315 rxresp
316 expect resp.http.before == "/a?a=a"
317 expect resp.http.after == "/a?a=a"
318
319 txreq -url "/%aa?a=%aa"
320 rxresp
321 expect resp.http.before == "/%aa?a=%aa"
322 expect resp.http.after == "/%AA?a=%AA"
323
324 txreq -url "/%zz?a=%zz"
325 rxresp
326 expect resp.status == 200
327 expect resp.http.before == "/%zz?a=%zz"
328 expect resp.http.after == "/%zz?a=%zz"
329
330 txreq -req OPTIONS -url "*"
331 rxresp
332 expect resp.http.before == "*"
333 expect resp.http.after == "*"
334} -run
335
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200336client c5 -connect ${h1_fe_percent_to_uppercase_strict_sock} {
Tim Duesterhusa4071932021-04-15 21:46:02 +0200337 txreq -url "/a?a=a"
338 rxresp
339 expect resp.http.before == "/a?a=a"
340 expect resp.http.after == "/a?a=a"
341
342 txreq -url "/%aa?a=%aa"
343 rxresp
344 expect resp.http.before == "/%aa?a=%aa"
345 expect resp.http.after == "/%AA?a=%AA"
346
347 txreq -url "/%zz?a=%zz"
348 rxresp
349 expect resp.status == 400
350} -run
Maximilian Maderff3bb8b2021-04-21 00:22:50 +0200351
352client c6 -connect ${h1_fe_dot_sock} {
353 txreq -url "/"
354 rxresp
355 expect resp.http.before == "/"
356 expect resp.http.after == "/"
357
358 txreq -url "/a/b"
359 rxresp
360 expect resp.http.before == "/a/b"
361 expect resp.http.after == "/a/b"
362
363 txreq -url "/."
364 rxresp
365 expect resp.http.before == "/."
366 expect resp.http.after == "/"
367
368 txreq -url "/./"
369 rxresp
370 expect resp.http.before == "/./"
371 expect resp.http.after == "/"
372
373 txreq -url "/a/."
374 rxresp
375 expect resp.http.before == "/a/."
376 expect resp.http.after == "/a/"
377
378 txreq -url "/a."
379 rxresp
380 expect resp.http.before == "/a."
381 expect resp.http.after == "/a."
382
383 txreq -url "/.a"
384 rxresp
385 expect resp.http.before == "/.a"
386 expect resp.http.after == "/.a"
387
388 txreq -url "/a/."
389 rxresp
390 expect resp.http.before == "/a/."
391 expect resp.http.after == "/a/"
392
393 txreq -url "/a/./"
394 rxresp
395 expect resp.http.before == "/a/./"
396 expect resp.http.after == "/a/"
397
398 txreq -url "/a/./a"
399 rxresp
400 expect resp.http.before == "/a/./a"
401 expect resp.http.after == "/a/a"
402
403 txreq -url "/a/../"
404 rxresp
405 expect resp.http.before == "/a/../"
406 expect resp.http.after == "/a/../"
407
408 txreq -url "/a/../a"
409 rxresp
410 expect resp.http.before == "/a/../a"
411 expect resp.http.after == "/a/../a"
412
413 txreq -url "/?a=/./"
414 rxresp
415 expect resp.http.before == "/?a=/./"
416 expect resp.http.after == "/?a=/./"
417} -run
Tim Duesterhus2e4a18e2021-04-21 21:20:36 +0200418
419client c7 -connect ${h1_fe_percent_decode_unreserved_sock} {
420 txreq -url "/a?a=a"
421 rxresp
422 expect resp.http.before == "/a?a=a"
423 expect resp.http.after == "/a?a=a"
424
425 txreq -url "/%61?%61=%61"
426 rxresp
427 expect resp.http.before == "/%61?%61=%61"
428 expect resp.http.after == "/a?a=a"
429
430 txreq -url "/%3F?foo=bar"
431 rxresp
432 expect resp.http.before == "/%3F?foo=bar"
433 expect resp.http.after == "/%3F?foo=bar"
434
435 txreq -url "/%%36%36"
436 rxresp
437 expect resp.status == 200
438 expect resp.http.before == "/%%36%36"
439 expect resp.http.after == "/%66"
440
441 txreq -req OPTIONS -url "*"
442 rxresp
443 expect resp.http.before == "*"
444 expect resp.http.after == "*"
445} -run
446
447client c8 -connect ${h1_fe_percent_decode_unreserved_strict_sock} {
448 txreq -url "/a?a=a"
449 rxresp
450 expect resp.http.before == "/a?a=a"
451 expect resp.http.after == "/a?a=a"
452
453 txreq -url "/%61?%61=%61"
454 rxresp
455 expect resp.http.before == "/%61?%61=%61"
456 expect resp.http.after == "/a?a=a"
457
458 txreq -url "/%3F?foo=bar"
459 rxresp
460 expect resp.http.before == "/%3F?foo=bar"
461 expect resp.http.after == "/%3F?foo=bar"
462
463 txreq -url "/%%36%36"
464 rxresp
465 expect resp.status == 400
466} -run