blob: 42c4c428b095492147ec00f1112f539f92a3034d [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 {
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 Duesterhusd371e992021-04-15 21:45:58 +0200128 backend be
129 server s1 ${s1_addr}:${s1_port}
130
131} -start
132
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200133client c1 -connect ${h1_fe_path_merge_slashes_sock} {
Tim Duesterhusd371e992021-04-15 21:45:58 +0200134 txreq -url "/foo/bar"
135 rxresp
136 expect resp.http.before == "/foo/bar"
137 expect resp.http.after == "/foo/bar"
138
139 txreq -url "/foo//bar"
140 rxresp
141 expect resp.http.before == "/foo//bar"
142 expect resp.http.after == "/foo/bar"
143
144 txreq -url "/foo///bar"
145 rxresp
146 expect resp.http.before == "/foo///bar"
147 expect resp.http.after == "/foo/bar"
148
149 txreq -url "///foo///bar"
150 rxresp
151 expect resp.http.before == "///foo///bar"
152 expect resp.http.after == "/foo/bar"
153
154 txreq -url "///foo/bar"
155 rxresp
156 expect resp.http.before == "///foo/bar"
157 expect resp.http.after == "/foo/bar"
158
159 txreq -url "///foo///bar///"
160 rxresp
161 expect resp.http.before == "///foo///bar///"
162 expect resp.http.after == "/foo/bar/"
163
164 txreq -url "///"
165 rxresp
166 expect resp.http.before == "///"
167 expect resp.http.after == "/"
168
169 txreq -url "/foo?bar=///"
170 rxresp
171 expect resp.http.before == "/foo?bar=///"
172 expect resp.http.after == "/foo?bar=///"
173
174 txreq -url "//foo?bar=///"
175 rxresp
176 expect resp.http.before == "//foo?bar=///"
177 expect resp.http.after == "/foo?bar=///"
178
179 txreq -req OPTIONS -url "*"
180 rxresp
181 expect resp.http.before == "*"
182 expect resp.http.after == "*"
183} -run
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200184
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200185client c2 -connect ${h1_fe_path_strip_dotdot_sock} {
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200186 txreq -url "/foo/bar"
187 rxresp
188 expect resp.http.before == "/foo/bar"
189 expect resp.http.after == "/foo/bar"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200190 expect resp.http.after-full == "/foo/bar"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200191
192 txreq -url "/foo/.."
193 rxresp
194 expect resp.http.before == "/foo/.."
195 expect resp.http.after == "/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200196 expect resp.http.after-full == "/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200197
198 txreq -url "/foo/../"
199 rxresp
200 expect resp.http.before == "/foo/../"
201 expect resp.http.after == "/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200202 expect resp.http.after-full == "/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200203
204 txreq -url "/foo/bar/../"
205 rxresp
206 expect resp.http.before == "/foo/bar/../"
207 expect resp.http.after == "/foo/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200208 expect resp.http.after-full == "/foo/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200209
210 txreq -url "/foo/../bar"
211 rxresp
212 expect resp.http.before == "/foo/../bar"
213 expect resp.http.after == "/bar"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200214 expect resp.http.after-full == "/bar"
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 == "/bar/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200220 expect resp.http.after-full == "/bar/"
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=/foo/../"
235 rxresp
236 expect resp.http.before == "/foo/?bar=/foo/../"
237 expect resp.http.after == "/foo/?bar=/foo/../"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200238 expect resp.http.after-full == "/foo/?bar=/foo/../"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200239
240 txreq -url "/foo/../?bar=/foo/../"
241 rxresp
242 expect resp.http.before == "/foo/../?bar=/foo/../"
243 expect resp.http.after == "/?bar=/foo/../"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200244 expect resp.http.after-full == "/?bar=/foo/../"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200245
246 txreq -req OPTIONS -url "*"
247 rxresp
248 expect resp.http.before == "*"
249 expect resp.http.after == "*"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200250 expect resp.http.after-full == "*"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200251} -run
Tim Duesterhusd7b89be2021-04-15 21:46:01 +0200252
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200253client c3 -connect ${h1_fe_sort_query_by_name_sock} {
Tim Duesterhusd7b89be2021-04-15 21:46:01 +0200254 txreq -url "/?a=a"
255 rxresp
256 expect resp.http.before == "/?a=a"
257 expect resp.http.after == "/?a=a"
258
259 txreq -url "/?a=a&z=z"
260 rxresp
261 expect resp.http.before == "/?a=a&z=z"
262 expect resp.http.after == "/?a=a&z=z"
263
264 txreq -url "/?z=z&a=a"
265 rxresp
266 expect resp.http.before == "/?z=z&a=a"
267 expect resp.http.after == "/?a=a&z=z"
268
269 txreq -url "/?a=z&z=a"
270 rxresp
271 expect resp.http.before == "/?a=z&z=a"
272 expect resp.http.after == "/?a=z&z=a"
273
274 txreq -url "/?z=a&a=z"
275 rxresp
276 expect resp.http.before == "/?z=a&a=z"
277 expect resp.http.after == "/?a=z&z=a"
278
279 txreq -url "/?c&b&a&z&x&y"
280 rxresp
281 expect resp.http.before == "/?c&b&a&z&x&y"
282 expect resp.http.after == "/?a&b&c&x&y&z"
283
284 txreq -url "/?a=&aa=&aaa=&aaaa="
285 rxresp
286 expect resp.http.before == "/?a=&aa=&aaa=&aaaa="
287 expect resp.http.after == "/?a=&aa=&aaa=&aaaa="
288
289 txreq -url "/?aaaa=&a=&aa=&aaa="
290 rxresp
291 expect resp.http.before == "/?aaaa=&a=&aa=&aaa="
292 expect resp.http.after == "/?a=&aa=&aaa=&aaaa="
293
294 txreq -url "/?a=5&a=3&a=1&a=2&a=4"
295 rxresp
296 expect resp.http.before == "/?a=5&a=3&a=1&a=2&a=4"
297 expect resp.http.after == "/?a=5&a=3&a=1&a=2&a=4"
298
299 txreq -url "/?a=5&b=3&a=1&a=2&b=4"
300 rxresp
301 expect resp.http.before == "/?a=5&b=3&a=1&a=2&b=4"
302 expect resp.http.after == "/?a=5&a=1&a=2&b=3&b=4"
303
304 txreq -url "/"
305 rxresp
306 expect resp.http.before == "/"
307 expect resp.http.after == "/"
308
309 txreq -url "/?"
310 rxresp
311 expect resp.http.before == "/?"
312 expect resp.http.after == "/?"
313
314 txreq -req OPTIONS -url "*"
315 rxresp
316 expect resp.http.before == "*"
317 expect resp.http.after == "*"
318} -run
Tim Duesterhusa4071932021-04-15 21:46:02 +0200319
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200320client c4 -connect ${h1_fe_percent_to_uppercase_sock} {
Tim Duesterhusa4071932021-04-15 21:46:02 +0200321 txreq -url "/a?a=a"
322 rxresp
323 expect resp.http.before == "/a?a=a"
324 expect resp.http.after == "/a?a=a"
325
326 txreq -url "/%aa?a=%aa"
327 rxresp
328 expect resp.http.before == "/%aa?a=%aa"
329 expect resp.http.after == "/%AA?a=%AA"
330
331 txreq -url "/%zz?a=%zz"
332 rxresp
333 expect resp.status == 200
334 expect resp.http.before == "/%zz?a=%zz"
335 expect resp.http.after == "/%zz?a=%zz"
336
337 txreq -req OPTIONS -url "*"
338 rxresp
339 expect resp.http.before == "*"
340 expect resp.http.after == "*"
341} -run
342
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200343client c5 -connect ${h1_fe_percent_to_uppercase_strict_sock} {
Tim Duesterhusa4071932021-04-15 21:46:02 +0200344 txreq -url "/a?a=a"
345 rxresp
346 expect resp.http.before == "/a?a=a"
347 expect resp.http.after == "/a?a=a"
348
349 txreq -url "/%aa?a=%aa"
350 rxresp
351 expect resp.http.before == "/%aa?a=%aa"
352 expect resp.http.after == "/%AA?a=%AA"
353
354 txreq -url "/%zz?a=%zz"
355 rxresp
356 expect resp.status == 400
357} -run
Maximilian Maderff3bb8b2021-04-21 00:22:50 +0200358
359client c6 -connect ${h1_fe_dot_sock} {
360 txreq -url "/"
361 rxresp
362 expect resp.http.before == "/"
363 expect resp.http.after == "/"
364
365 txreq -url "/a/b"
366 rxresp
367 expect resp.http.before == "/a/b"
368 expect resp.http.after == "/a/b"
369
370 txreq -url "/."
371 rxresp
372 expect resp.http.before == "/."
373 expect resp.http.after == "/"
374
375 txreq -url "/./"
376 rxresp
377 expect resp.http.before == "/./"
378 expect resp.http.after == "/"
379
380 txreq -url "/a/."
381 rxresp
382 expect resp.http.before == "/a/."
383 expect resp.http.after == "/a/"
384
385 txreq -url "/a."
386 rxresp
387 expect resp.http.before == "/a."
388 expect resp.http.after == "/a."
389
390 txreq -url "/.a"
391 rxresp
392 expect resp.http.before == "/.a"
393 expect resp.http.after == "/.a"
394
395 txreq -url "/a/."
396 rxresp
397 expect resp.http.before == "/a/."
398 expect resp.http.after == "/a/"
399
400 txreq -url "/a/./"
401 rxresp
402 expect resp.http.before == "/a/./"
403 expect resp.http.after == "/a/"
404
405 txreq -url "/a/./a"
406 rxresp
407 expect resp.http.before == "/a/./a"
408 expect resp.http.after == "/a/a"
409
410 txreq -url "/a/../"
411 rxresp
412 expect resp.http.before == "/a/../"
413 expect resp.http.after == "/a/../"
414
415 txreq -url "/a/../a"
416 rxresp
417 expect resp.http.before == "/a/../a"
418 expect resp.http.after == "/a/../a"
419
420 txreq -url "/?a=/./"
421 rxresp
422 expect resp.http.before == "/?a=/./"
423 expect resp.http.after == "/?a=/./"
424} -run
Tim Duesterhus2e4a18e2021-04-21 21:20:36 +0200425
426client c7 -connect ${h1_fe_percent_decode_unreserved_sock} {
427 txreq -url "/a?a=a"
428 rxresp
429 expect resp.http.before == "/a?a=a"
430 expect resp.http.after == "/a?a=a"
431
432 txreq -url "/%61?%61=%61"
433 rxresp
434 expect resp.http.before == "/%61?%61=%61"
435 expect resp.http.after == "/a?a=a"
436
437 txreq -url "/%3F?foo=bar"
438 rxresp
439 expect resp.http.before == "/%3F?foo=bar"
440 expect resp.http.after == "/%3F?foo=bar"
441
442 txreq -url "/%%36%36"
443 rxresp
444 expect resp.status == 200
445 expect resp.http.before == "/%%36%36"
446 expect resp.http.after == "/%66"
447
448 txreq -req OPTIONS -url "*"
449 rxresp
450 expect resp.http.before == "*"
451 expect resp.http.after == "*"
452} -run
453
454client c8 -connect ${h1_fe_percent_decode_unreserved_strict_sock} {
455 txreq -url "/a?a=a"
456 rxresp
457 expect resp.http.before == "/a?a=a"
458 expect resp.http.after == "/a?a=a"
459
460 txreq -url "/%61?%61=%61"
461 rxresp
462 expect resp.http.before == "/%61?%61=%61"
463 expect resp.http.after == "/a?a=a"
464
465 txreq -url "/%3F?foo=bar"
466 rxresp
467 expect resp.http.before == "/%3F?foo=bar"
468 expect resp.http.after == "/%3F?foo=bar"
469
470 txreq -url "/%%36%36"
471 rxresp
472 expect resp.status == 400
473} -run