blob: a144075a248a14602a400598a6691a4640258a52 [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
Christopher Faulet23d9efa2022-02-28 17:04:37 +010010 txresp -hdr "connection: close"
Tim Duesterhusdec1c362021-05-10 17:28:26 +020011} -repeat 70 -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}"
Willy Tarreauc7492152023-08-08 19:52:45 +0200130 option accept-invalid-http-request
Tim Duesterhusc9e05ab2021-05-10 17:28:25 +0200131
132 http-request set-var(txn.before) url
133 http-request normalize-uri fragment-strip
134 http-request set-var(txn.after) url
135
136 http-response add-header before %[var(txn.before)]
137 http-response add-header after %[var(txn.after)]
138
139 default_backend be
140
Tim Duesterhusdec1c362021-05-10 17:28:26 +0200141 frontend fe_fragment_encode
142 bind "fd@${fe_fragment_encode}"
Willy Tarreauc7492152023-08-08 19:52:45 +0200143 option accept-invalid-http-request
Tim Duesterhusdec1c362021-05-10 17:28:26 +0200144
145 http-request set-var(txn.before) url
146 http-request normalize-uri fragment-encode
147 http-request set-var(txn.after) url
148
149 http-response add-header before %[var(txn.before)]
150 http-response add-header after %[var(txn.after)]
151
152 default_backend be
153
Willy Tarreau73b9b132023-08-08 19:53:51 +0200154 frontend fe_fragment_block
155 bind "fd@${fe_fragment_block}"
156 http-request normalize-uri fragment-strip
157 default_backend be
158
Tim Duesterhusd371e992021-04-15 21:45:58 +0200159 backend be
160 server s1 ${s1_addr}:${s1_port}
161
162} -start
163
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200164client c1 -connect ${h1_fe_path_merge_slashes_sock} {
Tim Duesterhusd371e992021-04-15 21:45:58 +0200165 txreq -url "/foo/bar"
166 rxresp
167 expect resp.http.before == "/foo/bar"
168 expect resp.http.after == "/foo/bar"
169
170 txreq -url "/foo//bar"
171 rxresp
172 expect resp.http.before == "/foo//bar"
173 expect resp.http.after == "/foo/bar"
174
175 txreq -url "/foo///bar"
176 rxresp
177 expect resp.http.before == "/foo///bar"
178 expect resp.http.after == "/foo/bar"
179
180 txreq -url "///foo///bar"
181 rxresp
182 expect resp.http.before == "///foo///bar"
183 expect resp.http.after == "/foo/bar"
184
185 txreq -url "///foo/bar"
186 rxresp
187 expect resp.http.before == "///foo/bar"
188 expect resp.http.after == "/foo/bar"
189
190 txreq -url "///foo///bar///"
191 rxresp
192 expect resp.http.before == "///foo///bar///"
193 expect resp.http.after == "/foo/bar/"
194
195 txreq -url "///"
196 rxresp
197 expect resp.http.before == "///"
198 expect resp.http.after == "/"
199
200 txreq -url "/foo?bar=///"
201 rxresp
202 expect resp.http.before == "/foo?bar=///"
203 expect resp.http.after == "/foo?bar=///"
204
205 txreq -url "//foo?bar=///"
206 rxresp
207 expect resp.http.before == "//foo?bar=///"
208 expect resp.http.after == "/foo?bar=///"
209
210 txreq -req OPTIONS -url "*"
211 rxresp
212 expect resp.http.before == "*"
213 expect resp.http.after == "*"
214} -run
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200215
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200216client c2 -connect ${h1_fe_path_strip_dotdot_sock} {
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200217 txreq -url "/foo/bar"
218 rxresp
219 expect resp.http.before == "/foo/bar"
220 expect resp.http.after == "/foo/bar"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200221 expect resp.http.after-full == "/foo/bar"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200222
223 txreq -url "/foo/.."
224 rxresp
225 expect resp.http.before == "/foo/.."
226 expect resp.http.after == "/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200227 expect resp.http.after-full == "/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200228
229 txreq -url "/foo/../"
230 rxresp
231 expect resp.http.before == "/foo/../"
232 expect resp.http.after == "/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200233 expect resp.http.after-full == "/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200234
235 txreq -url "/foo/bar/../"
236 rxresp
237 expect resp.http.before == "/foo/bar/../"
238 expect resp.http.after == "/foo/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200239 expect resp.http.after-full == "/foo/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200240
241 txreq -url "/foo/../bar"
242 rxresp
243 expect resp.http.before == "/foo/../bar"
244 expect resp.http.after == "/bar"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200245 expect resp.http.after-full == "/bar"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200246
247 txreq -url "/foo/../bar/"
248 rxresp
249 expect resp.http.before == "/foo/../bar/"
250 expect resp.http.after == "/bar/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200251 expect resp.http.after-full == "/bar/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200252
253 txreq -url "/foo/../../bar/"
254 rxresp
255 expect resp.http.before == "/foo/../../bar/"
256 expect resp.http.after == "/../bar/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200257 expect resp.http.after-full == "/bar/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200258
259 txreq -url "/foo//../../bar/"
260 rxresp
261 expect resp.http.before == "/foo//../../bar/"
262 expect resp.http.after == "/bar/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200263 expect resp.http.after-full == "/bar/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200264
265 txreq -url "/foo/?bar=/foo/../"
266 rxresp
267 expect resp.http.before == "/foo/?bar=/foo/../"
268 expect resp.http.after == "/foo/?bar=/foo/../"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200269 expect resp.http.after-full == "/foo/?bar=/foo/../"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200270
271 txreq -url "/foo/../?bar=/foo/../"
272 rxresp
273 expect resp.http.before == "/foo/../?bar=/foo/../"
274 expect resp.http.after == "/?bar=/foo/../"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200275 expect resp.http.after-full == "/?bar=/foo/../"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200276
277 txreq -req OPTIONS -url "*"
278 rxresp
279 expect resp.http.before == "*"
280 expect resp.http.after == "*"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200281 expect resp.http.after-full == "*"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200282} -run
Tim Duesterhusd7b89be2021-04-15 21:46:01 +0200283
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200284client c3 -connect ${h1_fe_sort_query_by_name_sock} {
Tim Duesterhusd7b89be2021-04-15 21:46:01 +0200285 txreq -url "/?a=a"
286 rxresp
287 expect resp.http.before == "/?a=a"
288 expect resp.http.after == "/?a=a"
289
290 txreq -url "/?a=a&z=z"
291 rxresp
292 expect resp.http.before == "/?a=a&z=z"
293 expect resp.http.after == "/?a=a&z=z"
294
295 txreq -url "/?z=z&a=a"
296 rxresp
297 expect resp.http.before == "/?z=z&a=a"
298 expect resp.http.after == "/?a=a&z=z"
299
300 txreq -url "/?a=z&z=a"
301 rxresp
302 expect resp.http.before == "/?a=z&z=a"
303 expect resp.http.after == "/?a=z&z=a"
304
305 txreq -url "/?z=a&a=z"
306 rxresp
307 expect resp.http.before == "/?z=a&a=z"
308 expect resp.http.after == "/?a=z&z=a"
309
310 txreq -url "/?c&b&a&z&x&y"
311 rxresp
312 expect resp.http.before == "/?c&b&a&z&x&y"
313 expect resp.http.after == "/?a&b&c&x&y&z"
314
315 txreq -url "/?a=&aa=&aaa=&aaaa="
316 rxresp
317 expect resp.http.before == "/?a=&aa=&aaa=&aaaa="
318 expect resp.http.after == "/?a=&aa=&aaa=&aaaa="
319
320 txreq -url "/?aaaa=&a=&aa=&aaa="
321 rxresp
322 expect resp.http.before == "/?aaaa=&a=&aa=&aaa="
323 expect resp.http.after == "/?a=&aa=&aaa=&aaaa="
324
325 txreq -url "/?a=5&a=3&a=1&a=2&a=4"
326 rxresp
327 expect resp.http.before == "/?a=5&a=3&a=1&a=2&a=4"
328 expect resp.http.after == "/?a=5&a=3&a=1&a=2&a=4"
329
330 txreq -url "/?a=5&b=3&a=1&a=2&b=4"
331 rxresp
332 expect resp.http.before == "/?a=5&b=3&a=1&a=2&b=4"
333 expect resp.http.after == "/?a=5&a=1&a=2&b=3&b=4"
334
335 txreq -url "/"
336 rxresp
337 expect resp.http.before == "/"
338 expect resp.http.after == "/"
339
340 txreq -url "/?"
341 rxresp
342 expect resp.http.before == "/?"
343 expect resp.http.after == "/?"
344
345 txreq -req OPTIONS -url "*"
346 rxresp
347 expect resp.http.before == "*"
348 expect resp.http.after == "*"
349} -run
Tim Duesterhusa4071932021-04-15 21:46:02 +0200350
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200351client c4 -connect ${h1_fe_percent_to_uppercase_sock} {
Tim Duesterhusa4071932021-04-15 21:46:02 +0200352 txreq -url "/a?a=a"
353 rxresp
354 expect resp.http.before == "/a?a=a"
355 expect resp.http.after == "/a?a=a"
356
357 txreq -url "/%aa?a=%aa"
358 rxresp
359 expect resp.http.before == "/%aa?a=%aa"
360 expect resp.http.after == "/%AA?a=%AA"
361
362 txreq -url "/%zz?a=%zz"
363 rxresp
364 expect resp.status == 200
365 expect resp.http.before == "/%zz?a=%zz"
366 expect resp.http.after == "/%zz?a=%zz"
367
368 txreq -req OPTIONS -url "*"
369 rxresp
370 expect resp.http.before == "*"
371 expect resp.http.after == "*"
372} -run
373
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200374client c5 -connect ${h1_fe_percent_to_uppercase_strict_sock} {
Tim Duesterhusa4071932021-04-15 21:46:02 +0200375 txreq -url "/a?a=a"
376 rxresp
377 expect resp.http.before == "/a?a=a"
378 expect resp.http.after == "/a?a=a"
379
380 txreq -url "/%aa?a=%aa"
381 rxresp
382 expect resp.http.before == "/%aa?a=%aa"
383 expect resp.http.after == "/%AA?a=%AA"
384
385 txreq -url "/%zz?a=%zz"
386 rxresp
387 expect resp.status == 400
388} -run
Maximilian Maderff3bb8b2021-04-21 00:22:50 +0200389
390client c6 -connect ${h1_fe_dot_sock} {
391 txreq -url "/"
392 rxresp
393 expect resp.http.before == "/"
394 expect resp.http.after == "/"
395
396 txreq -url "/a/b"
397 rxresp
398 expect resp.http.before == "/a/b"
399 expect resp.http.after == "/a/b"
400
401 txreq -url "/."
402 rxresp
403 expect resp.http.before == "/."
404 expect resp.http.after == "/"
405
406 txreq -url "/./"
407 rxresp
408 expect resp.http.before == "/./"
409 expect resp.http.after == "/"
410
411 txreq -url "/a/."
412 rxresp
413 expect resp.http.before == "/a/."
414 expect resp.http.after == "/a/"
415
416 txreq -url "/a."
417 rxresp
418 expect resp.http.before == "/a."
419 expect resp.http.after == "/a."
420
421 txreq -url "/.a"
422 rxresp
423 expect resp.http.before == "/.a"
424 expect resp.http.after == "/.a"
425
426 txreq -url "/a/."
427 rxresp
428 expect resp.http.before == "/a/."
429 expect resp.http.after == "/a/"
430
431 txreq -url "/a/./"
432 rxresp
433 expect resp.http.before == "/a/./"
434 expect resp.http.after == "/a/"
435
436 txreq -url "/a/./a"
437 rxresp
438 expect resp.http.before == "/a/./a"
439 expect resp.http.after == "/a/a"
440
441 txreq -url "/a/../"
442 rxresp
443 expect resp.http.before == "/a/../"
444 expect resp.http.after == "/a/../"
445
446 txreq -url "/a/../a"
447 rxresp
448 expect resp.http.before == "/a/../a"
449 expect resp.http.after == "/a/../a"
450
451 txreq -url "/?a=/./"
452 rxresp
453 expect resp.http.before == "/?a=/./"
454 expect resp.http.after == "/?a=/./"
455} -run
Tim Duesterhus2e4a18e2021-04-21 21:20:36 +0200456
457client c7 -connect ${h1_fe_percent_decode_unreserved_sock} {
458 txreq -url "/a?a=a"
459 rxresp
460 expect resp.http.before == "/a?a=a"
461 expect resp.http.after == "/a?a=a"
462
463 txreq -url "/%61?%61=%61"
464 rxresp
465 expect resp.http.before == "/%61?%61=%61"
466 expect resp.http.after == "/a?a=a"
467
468 txreq -url "/%3F?foo=bar"
469 rxresp
470 expect resp.http.before == "/%3F?foo=bar"
471 expect resp.http.after == "/%3F?foo=bar"
472
473 txreq -url "/%%36%36"
474 rxresp
475 expect resp.status == 200
476 expect resp.http.before == "/%%36%36"
477 expect resp.http.after == "/%66"
478
479 txreq -req OPTIONS -url "*"
480 rxresp
481 expect resp.http.before == "*"
482 expect resp.http.after == "*"
483} -run
484
485client c8 -connect ${h1_fe_percent_decode_unreserved_strict_sock} {
486 txreq -url "/a?a=a"
487 rxresp
488 expect resp.http.before == "/a?a=a"
489 expect resp.http.after == "/a?a=a"
490
491 txreq -url "/%61?%61=%61"
492 rxresp
493 expect resp.http.before == "/%61?%61=%61"
494 expect resp.http.after == "/a?a=a"
495
496 txreq -url "/%3F?foo=bar"
497 rxresp
498 expect resp.http.before == "/%3F?foo=bar"
499 expect resp.http.after == "/%3F?foo=bar"
500
501 txreq -url "/%%36%36"
502 rxresp
503 expect resp.status == 400
504} -run
Tim Duesterhusc9e05ab2021-05-10 17:28:25 +0200505
506client c9 -connect ${h1_fe_fragment_strip_sock} {
507 txreq -url "/#foo"
508 rxresp
509 expect resp.http.before == "/#foo"
510 expect resp.http.after == "/"
511
512 txreq -url "/%23foo"
513 rxresp
514 expect resp.http.before == "/%23foo"
515 expect resp.http.after == "/%23foo"
516
517 txreq -req OPTIONS -url "*"
518 rxresp
519 expect resp.http.before == "*"
520 expect resp.http.after == "*"
521} -run
Tim Duesterhusdec1c362021-05-10 17:28:26 +0200522
523client c10 -connect ${h1_fe_fragment_encode_sock} {
524 txreq -url "/#foo"
525 rxresp
526 expect resp.http.before == "/#foo"
527 expect resp.http.after == "/%23foo"
528
529 txreq -url "/#foo/#foo"
530 rxresp
531 expect resp.http.before == "/#foo/#foo"
532 expect resp.http.after == "/%23foo/%23foo"
533
534 txreq -url "/%23foo"
535 rxresp
536 expect resp.http.before == "/%23foo"
537 expect resp.http.after == "/%23foo"
538
539 txreq -req OPTIONS -url "*"
540 rxresp
541 expect resp.http.before == "*"
542 expect resp.http.after == "*"
543} -run
Willy Tarreau73b9b132023-08-08 19:53:51 +0200544
545client c11 -connect ${h1_fe_fragment_block_sock} {
546 txreq -url "/#foo"
547 rxresp
548 expect resp.status == 400
549} -run