1# vi:filetype=
2
3use lib 'lib';
4use Test::Nginx::Socket;
5
6repeat_each(2);
7
8plan tests => repeat_each() * (2 * blocks() + 1);
9
10run_tests();
11
12__DATA__
13
14=== TEST 1: sanity
15--- config
16    location /main {
17        echo_location_async /sub;
18    }
19    location /sub {
20        echo hello;
21    }
22--- request
23    GET /main
24--- response_body
25hello
26
27
28
29=== TEST 2: trailing echo
30--- config
31    location /main {
32        echo_location_async /sub;
33        echo after subrequest;
34    }
35    location /sub {
36        echo hello;
37    }
38--- request
39    GET /main
40--- response_body
41hello
42after subrequest
43
44
45
46=== TEST 3: leading echo
47--- config
48    location /main {
49        echo before subrequest;
50        echo_location_async /sub;
51    }
52    location /sub {
53        echo hello;
54    }
55--- request
56    GET /main
57--- response_body
58before subrequest
59hello
60
61
62
63=== TEST 4: leading & trailing echo
64--- config
65    location /main {
66        echo before subrequest;
67        echo_location_async /sub;
68        echo after subrequest;
69    }
70    location /sub {
71        echo hello;
72    }
73--- request
74    GET /main
75--- response_body
76before subrequest
77hello
78after subrequest
79
80
81
82=== TEST 5: multiple subrequests
83--- config
84    location /main {
85        echo before sr 1;
86        echo_location_async /sub;
87        echo after sr 1;
88        echo before sr 2;
89        echo_location_async /sub;
90        echo after sr 2;
91    }
92    location /sub {
93        echo hello;
94    }
95--- request
96    GET /main
97--- response_body
98before sr 1
99hello
100after sr 1
101before sr 2
102hello
103after sr 2
104
105
106
107=== TEST 6: timed multiple subrequests (blocking sleep)
108--- config
109    location /main {
110        echo_reset_timer;
111        echo_location_async /sub1;
112        echo_location_async /sub2;
113        echo "took $echo_timer_elapsed sec for total.";
114    }
115    location /sub1 {
116        echo_blocking_sleep 0.02;
117        echo hello;
118    }
119    location /sub2 {
120        echo_blocking_sleep 0.01;
121        echo world;
122    }
123
124--- request
125    GET /main
126--- response_body_like
127^hello
128world
129took 0\.00[0-5] sec for total\.$
130
131
132
133=== TEST 7: timed multiple subrequests (non-blocking sleep)
134--- config
135    location /main {
136        echo_reset_timer;
137        echo_location_async /sub1;
138        echo_location_async /sub2;
139        echo "took $echo_timer_elapsed sec for total.";
140    }
141    location /sub1 {
142        echo_sleep 0.02;
143        echo hello;
144    }
145    location /sub2 {
146        echo_sleep 0.01;
147        echo world;
148    }
149
150--- request
151    GET /main
152--- response_body_like
153^hello
154world
155took 0\.00[0-5] sec for total\.$
156
157
158
159=== TEST 8: location with args
160--- config
161    location /main {
162        echo_location_async /sub 'foo=Foo&bar=Bar';
163    }
164    location /sub {
165        echo $arg_foo $arg_bar;
166    }
167--- request
168    GET /main
169--- response_body
170Foo Bar
171
172
173
174=== TEST 9: encoded chars in query strings
175--- config
176    location /main {
177        echo_location_async /sub 'foo=a%20b&bar=Bar';
178    }
179    location /sub {
180        echo $arg_foo $arg_bar;
181    }
182--- request
183    GET /main
184--- response_body
185a%20b Bar
186
187
188
189=== TEST 10: UTF-8 chars in query strings
190--- config
191    location /main {
192        echo_location_async /sub 'foo=你好';
193    }
194    location /sub {
195        echo $arg_foo;
196    }
197--- request
198    GET /main
199--- response_body
200你好
201
202
203
204=== TEST 11: encoded chars in location url
205--- config
206    location /main {
207        echo_location_async /sub%31 'foo=Foo&bar=Bar';
208    }
209    location /sub%31 {
210        echo 'sub%31';
211    }
212    location /sub1 {
213        echo 'sub1';
214    }
215--- request
216    GET /main
217--- response_body
218sub1
219
220
221
222=== TEST 12: querystring in url
223--- config
224    location /main {
225        echo_location_async /sub?foo=Foo&bar=Bar;
226    }
227    location /sub {
228        echo $arg_foo $arg_bar;
229    }
230--- request
231    GET /main
232--- response_body
233Foo Bar
234
235
236
237=== TEST 13: querystring in url *AND* an explicit querystring
238--- config
239    location /main {
240        echo_location_async /sub?foo=Foo&bar=Bar blah=Blah;
241    }
242    location /sub {
243        echo $arg_foo $arg_bar $arg_blah;
244    }
245--- request
246    GET /main
247--- response_body
248  Blah
249
250
251
252=== TEST 14: explicit flush in main request
253flush won't really flush the buffer...
254--- config
255    location /main_flush {
256        echo 'pre main';
257        echo_location_async /sub;
258        echo 'post main';
259        echo_flush;
260    }
261
262    location /sub {
263        echo_sleep 0.02;
264        echo 'sub';
265    }
266--- request
267    GET /main_flush
268--- response_body
269pre main
270sub
271post main
272
273
274
275=== TEST 15: no varaiable inheritance
276--- config
277    location /main {
278        echo $echo_cacheable_request_uri;
279        echo_location_async /sub;
280        echo_location_async /sub2;
281    }
282    location /sub {
283        echo $echo_cacheable_request_uri;
284    }
285    location /sub2 {
286        echo $echo_cacheable_request_uri;
287    }
288
289--- request
290    GET /main
291--- response_body
292/main
293/sub
294/sub2
295
296
297
298=== TEST 16: unsafe uri
299--- config
300    location /unsafe {
301        echo_location_async '/../foo';
302    }
303--- request
304    GET /unsafe
305--- stap2
306F(ngx_http_send_header) {
307    printf("send header on req %p (header sent: %d)\n", $r, $r->header_sent)
308    print_ubacktrace()
309}
310--- ignore_response
311--- error_log
312echo_location_async sees unsafe uri: "/../foo"
313--- no_error_log
314[error]
315[alert]
316
317
318
319=== TEST 17: access/deny (access phase handlers skipped in subrequests)
320--- config
321    location /main {
322        echo_location_async /denied;
323    }
324    location /denied {
325        deny all;
326        echo No no no;
327    }
328--- request
329    GET /main
330--- error_code: 200
331--- response_body
332No no no
333
334
335
336=== TEST 18: rewrite is honored.
337--- config
338    location /main {
339        echo_location_async /rewrite;
340    }
341    location /rewrite {
342        rewrite ^ /foo break;
343        echo $uri;
344    }
345--- request
346    GET /main
347--- response_body
348/foo
349
350
351
352=== TEST 19: let subrequest to read the main request's request body
353--- SKIP
354--- config
355    location /main {
356        echo_location_async /sub;
357    }
358    location /sub {
359        echo_read_request_body;
360        echo_request_body;
361    }
362--- request
363POST /main
364hello, body!
365--- response_body chomp
366hello, body!
367
368
369
370=== TEST 20: leading subrequest & echo_before_body
371--- config
372    location /main {
373        echo_before_body hello;
374        echo_location_async /foo;
375    }
376    location /foo {
377        echo world;
378    }
379--- request
380    GET /main
381--- response_body
382hello
383world
384
385
386
387=== TEST 21: leading subrequest & xss
388--- config
389    location /main {
390        default_type 'application/json';
391        xss_get on;
392        xss_callback_arg c;
393        echo_location_async /foo;
394    }
395    location /foo {
396        echo -n world;
397    }
398--- request
399    GET /main?c=hi
400--- response_body chop
401hi(world);
402
403
404
405=== TEST 22: multiple leading subrequest & xss
406--- config
407    location /main {
408        default_type 'application/json';
409        xss_get on;
410        xss_callback_arg c;
411        echo_location_async /foo;
412        echo_location_async /bar;
413    }
414    location /foo {
415        echo -n world;
416    }
417    location /bar {
418        echo -n ' people';
419    }
420--- request
421    GET /main?c=hi
422--- response_body chop
423hi(world people);
424
425
426
427=== TEST 23: sanity (HEAD)
428--- config
429    location /main {
430        echo_location_async /sub;
431        echo_location_async /sub;
432    }
433    location /sub {
434        echo hello;
435    }
436--- request
437    HEAD /main
438--- response_body
439
440