blob: 792bea5d4ff248c648b26edb2d6a793f21fafc0a [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 Duesterhusc9e05ab2021-05-10 17:28:25 +020011} -repeat 66 -start
Tim Duesterhusd371e992021-04-15 21:45:58 +020012
13haproxy h1 -conf {
Amaury Denoyellea9e639a2021-05-06 15:50:12 +020014 global
Willy Tarreaue1465c12021-05-09 14:41:41 +020015 # WT: limit false-positives causing "HTTP header incomplete" due to
16 # idle server connections being randomly used and randomly expiring
17 # under us.
18 tune.idle-pool.shared off
Amaury Denoyellea9e639a2021-05-06 15:50:12 +020019 expose-experimental-directives
20
Tim Duesterhusd371e992021-04-15 21:45:58 +020021 defaults
22 mode http
23 timeout connect 1s
24 timeout client 1s
25 timeout server 1s
26
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020027 frontend fe_path_merge_slashes
28 bind "fd@${fe_path_merge_slashes}"
Tim Duesterhusd371e992021-04-15 21:45:58 +020029
30 http-request set-var(txn.before) url
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020031 http-request normalize-uri path-merge-slashes
Tim Duesterhusd371e992021-04-15 21:45:58 +020032 http-request set-var(txn.after) url
33
34 http-response add-header before %[var(txn.before)]
35 http-response add-header after %[var(txn.after)]
36
37 default_backend be
38
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020039 frontend fe_path_strip_dotdot
40 bind "fd@${fe_path_strip_dotdot}"
Tim Duesterhus9982fc22021-04-15 21:45:59 +020041
42 http-request set-var(txn.before) url
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020043 http-request normalize-uri path-strip-dotdot
Tim Duesterhus9982fc22021-04-15 21:45:59 +020044 http-request set-var(txn.after) url
45
Tim Duesterhus560e1a62021-04-15 21:46:00 +020046 http-request set-uri %[var(txn.before)]
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020047 http-request normalize-uri path-strip-dotdot full
Tim Duesterhus560e1a62021-04-15 21:46:00 +020048 http-request set-var(txn.after_full) url
49
Tim Duesterhus9982fc22021-04-15 21:45:59 +020050 http-response add-header before %[var(txn.before)]
51 http-response add-header after %[var(txn.after)]
Tim Duesterhus560e1a62021-04-15 21:46:00 +020052 http-response add-header after-full %[var(txn.after_full)]
Tim Duesterhus9982fc22021-04-15 21:45:59 +020053
54 default_backend be
55
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020056 frontend fe_sort_query_by_name
57 bind "fd@${fe_sort_query_by_name}"
Tim Duesterhusd7b89be2021-04-15 21:46:01 +020058
59 http-request set-var(txn.before) url
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020060 http-request normalize-uri query-sort-by-name
Tim Duesterhusd7b89be2021-04-15 21:46:01 +020061 http-request set-var(txn.after) url
62
63 http-response add-header before %[var(txn.before)]
64 http-response add-header after %[var(txn.after)]
65
66 default_backend be
67
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020068 frontend fe_percent_to_uppercase
69 bind "fd@${fe_percent_to_uppercase}"
Tim Duesterhusa4071932021-04-15 21:46:02 +020070
71 http-request set-var(txn.before) url
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020072 http-request normalize-uri percent-to-uppercase
Tim Duesterhusa4071932021-04-15 21:46:02 +020073 http-request set-var(txn.after) url
74
75 http-response add-header before %[var(txn.before)]
76 http-response add-header after %[var(txn.after)]
77
78 default_backend be
79
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020080 frontend fe_percent_to_uppercase_strict
81 bind "fd@${fe_percent_to_uppercase_strict}"
Tim Duesterhusa4071932021-04-15 21:46:02 +020082
83 http-request set-var(txn.before) url
Tim Duesterhus5be6ab22021-04-17 11:21:10 +020084 http-request normalize-uri percent-to-uppercase strict
Tim Duesterhusa4071932021-04-15 21:46:02 +020085 http-request set-var(txn.after) url
86
87 http-response add-header before %[var(txn.before)]
88 http-response add-header after %[var(txn.after)]
89
90 default_backend be
91
Maximilian Maderff3bb8b2021-04-21 00:22:50 +020092 frontend fe_dot
93 bind "fd@${fe_dot}"
94
95 http-request set-var(txn.before) url
96 http-request normalize-uri path-strip-dot
97 http-request set-var(txn.after) url
98
99 http-response add-header before %[var(txn.before)]
100 http-response add-header after %[var(txn.after)]
101
102 default_backend be
103
Tim Duesterhus2e4a18e2021-04-21 21:20:36 +0200104 frontend fe_percent_decode_unreserved
105 bind "fd@${fe_percent_decode_unreserved}"
106
107 http-request set-var(txn.before) url
108 http-request normalize-uri percent-decode-unreserved
109 http-request set-var(txn.after) url
110
111 http-response add-header before %[var(txn.before)]
112 http-response add-header after %[var(txn.after)]
113
114 default_backend be
115
116 frontend fe_percent_decode_unreserved_strict
117 bind "fd@${fe_percent_decode_unreserved_strict}"
118
119 http-request set-var(txn.before) url
120 http-request normalize-uri percent-decode-unreserved strict
121 http-request set-var(txn.after) url
122
123 http-response add-header before %[var(txn.before)]
124 http-response add-header after %[var(txn.after)]
125
126 default_backend be
127
Tim Duesterhusc9e05ab2021-05-10 17:28:25 +0200128 frontend fe_fragment_strip
129 bind "fd@${fe_fragment_strip}"
130
131 http-request set-var(txn.before) url
132 http-request normalize-uri fragment-strip
133 http-request set-var(txn.after) url
134
135 http-response add-header before %[var(txn.before)]
136 http-response add-header after %[var(txn.after)]
137
138 default_backend be
139
Tim Duesterhusd371e992021-04-15 21:45:58 +0200140 backend be
141 server s1 ${s1_addr}:${s1_port}
142
143} -start
144
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200145client c1 -connect ${h1_fe_path_merge_slashes_sock} {
Tim Duesterhusd371e992021-04-15 21:45:58 +0200146 txreq -url "/foo/bar"
147 rxresp
148 expect resp.http.before == "/foo/bar"
149 expect resp.http.after == "/foo/bar"
150
151 txreq -url "/foo//bar"
152 rxresp
153 expect resp.http.before == "/foo//bar"
154 expect resp.http.after == "/foo/bar"
155
156 txreq -url "/foo///bar"
157 rxresp
158 expect resp.http.before == "/foo///bar"
159 expect resp.http.after == "/foo/bar"
160
161 txreq -url "///foo///bar"
162 rxresp
163 expect resp.http.before == "///foo///bar"
164 expect resp.http.after == "/foo/bar"
165
166 txreq -url "///foo/bar"
167 rxresp
168 expect resp.http.before == "///foo/bar"
169 expect resp.http.after == "/foo/bar"
170
171 txreq -url "///foo///bar///"
172 rxresp
173 expect resp.http.before == "///foo///bar///"
174 expect resp.http.after == "/foo/bar/"
175
176 txreq -url "///"
177 rxresp
178 expect resp.http.before == "///"
179 expect resp.http.after == "/"
180
181 txreq -url "/foo?bar=///"
182 rxresp
183 expect resp.http.before == "/foo?bar=///"
184 expect resp.http.after == "/foo?bar=///"
185
186 txreq -url "//foo?bar=///"
187 rxresp
188 expect resp.http.before == "//foo?bar=///"
189 expect resp.http.after == "/foo?bar=///"
190
191 txreq -req OPTIONS -url "*"
192 rxresp
193 expect resp.http.before == "*"
194 expect resp.http.after == "*"
195} -run
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200196
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200197client c2 -connect ${h1_fe_path_strip_dotdot_sock} {
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200198 txreq -url "/foo/bar"
199 rxresp
200 expect resp.http.before == "/foo/bar"
201 expect resp.http.after == "/foo/bar"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200202 expect resp.http.after-full == "/foo/bar"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200203
204 txreq -url "/foo/.."
205 rxresp
206 expect resp.http.before == "/foo/.."
207 expect resp.http.after == "/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200208 expect resp.http.after-full == "/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200209
210 txreq -url "/foo/../"
211 rxresp
212 expect resp.http.before == "/foo/../"
213 expect resp.http.after == "/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200214 expect resp.http.after-full == "/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200215
216 txreq -url "/foo/bar/../"
217 rxresp
218 expect resp.http.before == "/foo/bar/../"
219 expect resp.http.after == "/foo/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200220 expect resp.http.after-full == "/foo/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200221
222 txreq -url "/foo/../bar"
223 rxresp
224 expect resp.http.before == "/foo/../bar"
225 expect resp.http.after == "/bar"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200226 expect resp.http.after-full == "/bar"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200227
228 txreq -url "/foo/../bar/"
229 rxresp
230 expect resp.http.before == "/foo/../bar/"
231 expect resp.http.after == "/bar/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200232 expect resp.http.after-full == "/bar/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200233
234 txreq -url "/foo/../../bar/"
235 rxresp
236 expect resp.http.before == "/foo/../../bar/"
237 expect resp.http.after == "/../bar/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200238 expect resp.http.after-full == "/bar/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200239
240 txreq -url "/foo//../../bar/"
241 rxresp
242 expect resp.http.before == "/foo//../../bar/"
243 expect resp.http.after == "/bar/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200244 expect resp.http.after-full == "/bar/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200245
246 txreq -url "/foo/?bar=/foo/../"
247 rxresp
248 expect resp.http.before == "/foo/?bar=/foo/../"
249 expect resp.http.after == "/foo/?bar=/foo/../"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200250 expect resp.http.after-full == "/foo/?bar=/foo/../"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200251
252 txreq -url "/foo/../?bar=/foo/../"
253 rxresp
254 expect resp.http.before == "/foo/../?bar=/foo/../"
255 expect resp.http.after == "/?bar=/foo/../"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200256 expect resp.http.after-full == "/?bar=/foo/../"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200257
258 txreq -req OPTIONS -url "*"
259 rxresp
260 expect resp.http.before == "*"
261 expect resp.http.after == "*"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200262 expect resp.http.after-full == "*"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200263} -run
Tim Duesterhusd7b89be2021-04-15 21:46:01 +0200264
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200265client c3 -connect ${h1_fe_sort_query_by_name_sock} {
Tim Duesterhusd7b89be2021-04-15 21:46:01 +0200266 txreq -url "/?a=a"
267 rxresp
268 expect resp.http.before == "/?a=a"
269 expect resp.http.after == "/?a=a"
270
271 txreq -url "/?a=a&z=z"
272 rxresp
273 expect resp.http.before == "/?a=a&z=z"
274 expect resp.http.after == "/?a=a&z=z"
275
276 txreq -url "/?z=z&a=a"
277 rxresp
278 expect resp.http.before == "/?z=z&a=a"
279 expect resp.http.after == "/?a=a&z=z"
280
281 txreq -url "/?a=z&z=a"
282 rxresp
283 expect resp.http.before == "/?a=z&z=a"
284 expect resp.http.after == "/?a=z&z=a"
285
286 txreq -url "/?z=a&a=z"
287 rxresp
288 expect resp.http.before == "/?z=a&a=z"
289 expect resp.http.after == "/?a=z&z=a"
290
291 txreq -url "/?c&b&a&z&x&y"
292 rxresp
293 expect resp.http.before == "/?c&b&a&z&x&y"
294 expect resp.http.after == "/?a&b&c&x&y&z"
295
296 txreq -url "/?a=&aa=&aaa=&aaaa="
297 rxresp
298 expect resp.http.before == "/?a=&aa=&aaa=&aaaa="
299 expect resp.http.after == "/?a=&aa=&aaa=&aaaa="
300
301 txreq -url "/?aaaa=&a=&aa=&aaa="
302 rxresp
303 expect resp.http.before == "/?aaaa=&a=&aa=&aaa="
304 expect resp.http.after == "/?a=&aa=&aaa=&aaaa="
305
306 txreq -url "/?a=5&a=3&a=1&a=2&a=4"
307 rxresp
308 expect resp.http.before == "/?a=5&a=3&a=1&a=2&a=4"
309 expect resp.http.after == "/?a=5&a=3&a=1&a=2&a=4"
310
311 txreq -url "/?a=5&b=3&a=1&a=2&b=4"
312 rxresp
313 expect resp.http.before == "/?a=5&b=3&a=1&a=2&b=4"
314 expect resp.http.after == "/?a=5&a=1&a=2&b=3&b=4"
315
316 txreq -url "/"
317 rxresp
318 expect resp.http.before == "/"
319 expect resp.http.after == "/"
320
321 txreq -url "/?"
322 rxresp
323 expect resp.http.before == "/?"
324 expect resp.http.after == "/?"
325
326 txreq -req OPTIONS -url "*"
327 rxresp
328 expect resp.http.before == "*"
329 expect resp.http.after == "*"
330} -run
Tim Duesterhusa4071932021-04-15 21:46:02 +0200331
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200332client c4 -connect ${h1_fe_percent_to_uppercase_sock} {
Tim Duesterhusa4071932021-04-15 21:46:02 +0200333 txreq -url "/a?a=a"
334 rxresp
335 expect resp.http.before == "/a?a=a"
336 expect resp.http.after == "/a?a=a"
337
338 txreq -url "/%aa?a=%aa"
339 rxresp
340 expect resp.http.before == "/%aa?a=%aa"
341 expect resp.http.after == "/%AA?a=%AA"
342
343 txreq -url "/%zz?a=%zz"
344 rxresp
345 expect resp.status == 200
346 expect resp.http.before == "/%zz?a=%zz"
347 expect resp.http.after == "/%zz?a=%zz"
348
349 txreq -req OPTIONS -url "*"
350 rxresp
351 expect resp.http.before == "*"
352 expect resp.http.after == "*"
353} -run
354
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200355client c5 -connect ${h1_fe_percent_to_uppercase_strict_sock} {
Tim Duesterhusa4071932021-04-15 21:46:02 +0200356 txreq -url "/a?a=a"
357 rxresp
358 expect resp.http.before == "/a?a=a"
359 expect resp.http.after == "/a?a=a"
360
361 txreq -url "/%aa?a=%aa"
362 rxresp
363 expect resp.http.before == "/%aa?a=%aa"
364 expect resp.http.after == "/%AA?a=%AA"
365
366 txreq -url "/%zz?a=%zz"
367 rxresp
368 expect resp.status == 400
369} -run
Maximilian Maderff3bb8b2021-04-21 00:22:50 +0200370
371client c6 -connect ${h1_fe_dot_sock} {
372 txreq -url "/"
373 rxresp
374 expect resp.http.before == "/"
375 expect resp.http.after == "/"
376
377 txreq -url "/a/b"
378 rxresp
379 expect resp.http.before == "/a/b"
380 expect resp.http.after == "/a/b"
381
382 txreq -url "/."
383 rxresp
384 expect resp.http.before == "/."
385 expect resp.http.after == "/"
386
387 txreq -url "/./"
388 rxresp
389 expect resp.http.before == "/./"
390 expect resp.http.after == "/"
391
392 txreq -url "/a/."
393 rxresp
394 expect resp.http.before == "/a/."
395 expect resp.http.after == "/a/"
396
397 txreq -url "/a."
398 rxresp
399 expect resp.http.before == "/a."
400 expect resp.http.after == "/a."
401
402 txreq -url "/.a"
403 rxresp
404 expect resp.http.before == "/.a"
405 expect resp.http.after == "/.a"
406
407 txreq -url "/a/."
408 rxresp
409 expect resp.http.before == "/a/."
410 expect resp.http.after == "/a/"
411
412 txreq -url "/a/./"
413 rxresp
414 expect resp.http.before == "/a/./"
415 expect resp.http.after == "/a/"
416
417 txreq -url "/a/./a"
418 rxresp
419 expect resp.http.before == "/a/./a"
420 expect resp.http.after == "/a/a"
421
422 txreq -url "/a/../"
423 rxresp
424 expect resp.http.before == "/a/../"
425 expect resp.http.after == "/a/../"
426
427 txreq -url "/a/../a"
428 rxresp
429 expect resp.http.before == "/a/../a"
430 expect resp.http.after == "/a/../a"
431
432 txreq -url "/?a=/./"
433 rxresp
434 expect resp.http.before == "/?a=/./"
435 expect resp.http.after == "/?a=/./"
436} -run
Tim Duesterhus2e4a18e2021-04-21 21:20:36 +0200437
438client c7 -connect ${h1_fe_percent_decode_unreserved_sock} {
439 txreq -url "/a?a=a"
440 rxresp
441 expect resp.http.before == "/a?a=a"
442 expect resp.http.after == "/a?a=a"
443
444 txreq -url "/%61?%61=%61"
445 rxresp
446 expect resp.http.before == "/%61?%61=%61"
447 expect resp.http.after == "/a?a=a"
448
449 txreq -url "/%3F?foo=bar"
450 rxresp
451 expect resp.http.before == "/%3F?foo=bar"
452 expect resp.http.after == "/%3F?foo=bar"
453
454 txreq -url "/%%36%36"
455 rxresp
456 expect resp.status == 200
457 expect resp.http.before == "/%%36%36"
458 expect resp.http.after == "/%66"
459
460 txreq -req OPTIONS -url "*"
461 rxresp
462 expect resp.http.before == "*"
463 expect resp.http.after == "*"
464} -run
465
466client c8 -connect ${h1_fe_percent_decode_unreserved_strict_sock} {
467 txreq -url "/a?a=a"
468 rxresp
469 expect resp.http.before == "/a?a=a"
470 expect resp.http.after == "/a?a=a"
471
472 txreq -url "/%61?%61=%61"
473 rxresp
474 expect resp.http.before == "/%61?%61=%61"
475 expect resp.http.after == "/a?a=a"
476
477 txreq -url "/%3F?foo=bar"
478 rxresp
479 expect resp.http.before == "/%3F?foo=bar"
480 expect resp.http.after == "/%3F?foo=bar"
481
482 txreq -url "/%%36%36"
483 rxresp
484 expect resp.status == 400
485} -run
Tim Duesterhusc9e05ab2021-05-10 17:28:25 +0200486
487client c9 -connect ${h1_fe_fragment_strip_sock} {
488 txreq -url "/#foo"
489 rxresp
490 expect resp.http.before == "/#foo"
491 expect resp.http.after == "/"
492
493 txreq -url "/%23foo"
494 rxresp
495 expect resp.http.before == "/%23foo"
496 expect resp.http.after == "/%23foo"
497
498 txreq -req OPTIONS -url "*"
499 rxresp
500 expect resp.http.before == "*"
501 expect resp.http.after == "*"
502} -run