blob: 9884b6c4389adcb02f26d0a28bcb5eac92d2edb5 [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
Maximilian Maderff3bb8b2021-04-21 00:22:50 +020011} -repeat 54 -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 Duesterhusd371e992021-04-15 21:45:58 +020097 backend be
98 server s1 ${s1_addr}:${s1_port}
99
100} -start
101
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200102client c1 -connect ${h1_fe_path_merge_slashes_sock} {
Tim Duesterhusd371e992021-04-15 21:45:58 +0200103 txreq -url "/foo/bar"
104 rxresp
105 expect resp.http.before == "/foo/bar"
106 expect resp.http.after == "/foo/bar"
107
108 txreq -url "/foo//bar"
109 rxresp
110 expect resp.http.before == "/foo//bar"
111 expect resp.http.after == "/foo/bar"
112
113 txreq -url "/foo///bar"
114 rxresp
115 expect resp.http.before == "/foo///bar"
116 expect resp.http.after == "/foo/bar"
117
118 txreq -url "///foo///bar"
119 rxresp
120 expect resp.http.before == "///foo///bar"
121 expect resp.http.after == "/foo/bar"
122
123 txreq -url "///foo/bar"
124 rxresp
125 expect resp.http.before == "///foo/bar"
126 expect resp.http.after == "/foo/bar"
127
128 txreq -url "///foo///bar///"
129 rxresp
130 expect resp.http.before == "///foo///bar///"
131 expect resp.http.after == "/foo/bar/"
132
133 txreq -url "///"
134 rxresp
135 expect resp.http.before == "///"
136 expect resp.http.after == "/"
137
138 txreq -url "/foo?bar=///"
139 rxresp
140 expect resp.http.before == "/foo?bar=///"
141 expect resp.http.after == "/foo?bar=///"
142
143 txreq -url "//foo?bar=///"
144 rxresp
145 expect resp.http.before == "//foo?bar=///"
146 expect resp.http.after == "/foo?bar=///"
147
148 txreq -req OPTIONS -url "*"
149 rxresp
150 expect resp.http.before == "*"
151 expect resp.http.after == "*"
152} -run
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200153
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200154client c2 -connect ${h1_fe_path_strip_dotdot_sock} {
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200155 txreq -url "/foo/bar"
156 rxresp
157 expect resp.http.before == "/foo/bar"
158 expect resp.http.after == "/foo/bar"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200159 expect resp.http.after-full == "/foo/bar"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200160
161 txreq -url "/foo/.."
162 rxresp
163 expect resp.http.before == "/foo/.."
164 expect resp.http.after == "/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200165 expect resp.http.after-full == "/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200166
167 txreq -url "/foo/../"
168 rxresp
169 expect resp.http.before == "/foo/../"
170 expect resp.http.after == "/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200171 expect resp.http.after-full == "/"
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 == "/foo/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200177 expect resp.http.after-full == "/foo/"
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/"
192 rxresp
193 expect resp.http.before == "/foo/../../bar/"
194 expect resp.http.after == "/../bar/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200195 expect resp.http.after-full == "/bar/"
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 == "/bar/"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200201 expect resp.http.after-full == "/bar/"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200202
203 txreq -url "/foo/?bar=/foo/../"
204 rxresp
205 expect resp.http.before == "/foo/?bar=/foo/../"
206 expect resp.http.after == "/foo/?bar=/foo/../"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200207 expect resp.http.after-full == "/foo/?bar=/foo/../"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200208
209 txreq -url "/foo/../?bar=/foo/../"
210 rxresp
211 expect resp.http.before == "/foo/../?bar=/foo/../"
212 expect resp.http.after == "/?bar=/foo/../"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200213 expect resp.http.after-full == "/?bar=/foo/../"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200214
215 txreq -req OPTIONS -url "*"
216 rxresp
217 expect resp.http.before == "*"
218 expect resp.http.after == "*"
Tim Duesterhus560e1a62021-04-15 21:46:00 +0200219 expect resp.http.after-full == "*"
Tim Duesterhus9982fc22021-04-15 21:45:59 +0200220} -run
Tim Duesterhusd7b89be2021-04-15 21:46:01 +0200221
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200222client c3 -connect ${h1_fe_sort_query_by_name_sock} {
Tim Duesterhusd7b89be2021-04-15 21:46:01 +0200223 txreq -url "/?a=a"
224 rxresp
225 expect resp.http.before == "/?a=a"
226 expect resp.http.after == "/?a=a"
227
228 txreq -url "/?a=a&z=z"
229 rxresp
230 expect resp.http.before == "/?a=a&z=z"
231 expect resp.http.after == "/?a=a&z=z"
232
233 txreq -url "/?z=z&a=a"
234 rxresp
235 expect resp.http.before == "/?z=z&a=a"
236 expect resp.http.after == "/?a=a&z=z"
237
238 txreq -url "/?a=z&z=a"
239 rxresp
240 expect resp.http.before == "/?a=z&z=a"
241 expect resp.http.after == "/?a=z&z=a"
242
243 txreq -url "/?z=a&a=z"
244 rxresp
245 expect resp.http.before == "/?z=a&a=z"
246 expect resp.http.after == "/?a=z&z=a"
247
248 txreq -url "/?c&b&a&z&x&y"
249 rxresp
250 expect resp.http.before == "/?c&b&a&z&x&y"
251 expect resp.http.after == "/?a&b&c&x&y&z"
252
253 txreq -url "/?a=&aa=&aaa=&aaaa="
254 rxresp
255 expect resp.http.before == "/?a=&aa=&aaa=&aaaa="
256 expect resp.http.after == "/?a=&aa=&aaa=&aaaa="
257
258 txreq -url "/?aaaa=&a=&aa=&aaa="
259 rxresp
260 expect resp.http.before == "/?aaaa=&a=&aa=&aaa="
261 expect resp.http.after == "/?a=&aa=&aaa=&aaaa="
262
263 txreq -url "/?a=5&a=3&a=1&a=2&a=4"
264 rxresp
265 expect resp.http.before == "/?a=5&a=3&a=1&a=2&a=4"
266 expect resp.http.after == "/?a=5&a=3&a=1&a=2&a=4"
267
268 txreq -url "/?a=5&b=3&a=1&a=2&b=4"
269 rxresp
270 expect resp.http.before == "/?a=5&b=3&a=1&a=2&b=4"
271 expect resp.http.after == "/?a=5&a=1&a=2&b=3&b=4"
272
273 txreq -url "/"
274 rxresp
275 expect resp.http.before == "/"
276 expect resp.http.after == "/"
277
278 txreq -url "/?"
279 rxresp
280 expect resp.http.before == "/?"
281 expect resp.http.after == "/?"
282
283 txreq -req OPTIONS -url "*"
284 rxresp
285 expect resp.http.before == "*"
286 expect resp.http.after == "*"
287} -run
Tim Duesterhusa4071932021-04-15 21:46:02 +0200288
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200289client c4 -connect ${h1_fe_percent_to_uppercase_sock} {
Tim Duesterhusa4071932021-04-15 21:46:02 +0200290 txreq -url "/a?a=a"
291 rxresp
292 expect resp.http.before == "/a?a=a"
293 expect resp.http.after == "/a?a=a"
294
295 txreq -url "/%aa?a=%aa"
296 rxresp
297 expect resp.http.before == "/%aa?a=%aa"
298 expect resp.http.after == "/%AA?a=%AA"
299
300 txreq -url "/%zz?a=%zz"
301 rxresp
302 expect resp.status == 200
303 expect resp.http.before == "/%zz?a=%zz"
304 expect resp.http.after == "/%zz?a=%zz"
305
306 txreq -req OPTIONS -url "*"
307 rxresp
308 expect resp.http.before == "*"
309 expect resp.http.after == "*"
310} -run
311
Tim Duesterhus5be6ab22021-04-17 11:21:10 +0200312client c5 -connect ${h1_fe_percent_to_uppercase_strict_sock} {
Tim Duesterhusa4071932021-04-15 21:46:02 +0200313 txreq -url "/a?a=a"
314 rxresp
315 expect resp.http.before == "/a?a=a"
316 expect resp.http.after == "/a?a=a"
317
318 txreq -url "/%aa?a=%aa"
319 rxresp
320 expect resp.http.before == "/%aa?a=%aa"
321 expect resp.http.after == "/%AA?a=%AA"
322
323 txreq -url "/%zz?a=%zz"
324 rxresp
325 expect resp.status == 400
326} -run
Maximilian Maderff3bb8b2021-04-21 00:22:50 +0200327
328client c6 -connect ${h1_fe_dot_sock} {
329 txreq -url "/"
330 rxresp
331 expect resp.http.before == "/"
332 expect resp.http.after == "/"
333
334 txreq -url "/a/b"
335 rxresp
336 expect resp.http.before == "/a/b"
337 expect resp.http.after == "/a/b"
338
339 txreq -url "/."
340 rxresp
341 expect resp.http.before == "/."
342 expect resp.http.after == "/"
343
344 txreq -url "/./"
345 rxresp
346 expect resp.http.before == "/./"
347 expect resp.http.after == "/"
348
349 txreq -url "/a/."
350 rxresp
351 expect resp.http.before == "/a/."
352 expect resp.http.after == "/a/"
353
354 txreq -url "/a."
355 rxresp
356 expect resp.http.before == "/a."
357 expect resp.http.after == "/a."
358
359 txreq -url "/.a"
360 rxresp
361 expect resp.http.before == "/.a"
362 expect resp.http.after == "/.a"
363
364 txreq -url "/a/."
365 rxresp
366 expect resp.http.before == "/a/."
367 expect resp.http.after == "/a/"
368
369 txreq -url "/a/./"
370 rxresp
371 expect resp.http.before == "/a/./"
372 expect resp.http.after == "/a/"
373
374 txreq -url "/a/./a"
375 rxresp
376 expect resp.http.before == "/a/./a"
377 expect resp.http.after == "/a/a"
378
379 txreq -url "/a/../"
380 rxresp
381 expect resp.http.before == "/a/../"
382 expect resp.http.after == "/a/../"
383
384 txreq -url "/a/../a"
385 rxresp
386 expect resp.http.before == "/a/../a"
387 expect resp.http.after == "/a/../a"
388
389 txreq -url "/?a=/./"
390 rxresp
391 expect resp.http.before == "/?a=/./"
392 expect resp.http.after == "/?a=/./"
393} -run