1# vi:filetype=
2
3use lib 'lib';
4
5use Test::Nginx::Socket;
6
7repeat_each(2);
8
9plan tests => repeat_each() * (2 * blocks() + 2);
10
11#$Test::Nginx::LWP::LogLevel = 'debug';
12
13#no_diff();
14
15run_tests();
16
17__DATA__
18
19=== TEST 1: sanity
20--- config
21    location /main {
22        echo_location /sub;
23    }
24    location /sub {
25        echo hello;
26    }
27--- request
28    GET /main
29--- response_body
30hello
31
32
33
34=== TEST 2: sanity with proxy in the middle
35--- config
36    location /main {
37        echo_location /proxy;
38    }
39    location /proxy {
40        proxy_pass $scheme://127.0.0.1:$server_port/sub;
41    }
42    location /sub {
43        echo hello;
44    }
45--- request
46    GET /main
47--- response_body
48hello
49
50
51
52=== TEST 3: trailing echo
53--- config
54    location /main {
55        echo_location /sub;
56        echo after subrequest;
57    }
58    location /sub {
59        echo hello;
60    }
61--- request
62    GET /main
63--- response_body
64hello
65after subrequest
66
67
68
69=== TEST 4: leading echo
70--- config
71    location /main {
72        echo before subrequest;
73        echo_location /sub;
74    }
75    location /sub {
76        echo hello;
77    }
78--- request
79    GET /main
80--- response_body
81before subrequest
82hello
83
84
85
86=== TEST 5: leading & trailing echo
87--- config
88    location /main {
89        echo before subrequest;
90        echo_location /sub;
91        echo after subrequest;
92    }
93    location /sub {
94        echo hello;
95    }
96--- request
97    GET /main
98--- response_body
99before subrequest
100hello
101after subrequest
102
103
104
105=== TEST 6: multiple subrequests
106--- config
107    location /main {
108        echo before sr 1;
109        echo_location /sub;
110        echo after sr 1;
111        echo before sr 2;
112        echo_location /sub;
113        echo after sr 2;
114    }
115    location /sub {
116        echo hello;
117    }
118--- request
119    GET /main
120--- response_body
121before sr 1
122hello
123after sr 1
124before sr 2
125hello
126after sr 2
127
128
129
130=== TEST 7: timed multiple subrequests (blocking sleep)
131--- config
132    location /main {
133        echo_reset_timer;
134        echo_location /sub1;
135        echo_location /sub2;
136        echo "took $echo_timer_elapsed sec for total.";
137    }
138    location /sub1 {
139        echo_blocking_sleep 0.02;
140        echo hello;
141    }
142    location /sub2 {
143        echo_blocking_sleep 0.01;
144        echo world;
145    }
146
147--- request
148    GET /main
149--- response_body_like
150^hello
151world
152took 0\.0(?:2[5-9]|3[0-6]) sec for total\.$
153
154
155
156=== TEST 8: timed multiple subrequests (non-blocking sleep)
157--- config
158    location /main {
159        echo_reset_timer;
160        echo_location /sub1;
161        echo_location /sub2;
162        echo "took $echo_timer_elapsed sec for total.";
163    }
164    location /sub1 {
165        echo_sleep 0.02;
166        echo hello;
167    }
168    location /sub2 {
169        echo_sleep 0.01;
170        echo world;
171    }
172
173--- request
174    GET /main
175--- response_body_like
176^hello
177world
178took 0\.0(?:2[5-9]|3[0-6]) sec for total\.$
179
180
181
182=== TEST 9: location with args
183--- config
184    location /main {
185        echo_location /sub 'foo=Foo&bar=Bar';
186    }
187    location /sub {
188        echo $arg_foo $arg_bar;
189    }
190--- request
191    GET /main
192--- response_body
193Foo Bar
194
195
196
197=== TEST 10: chained subrequests
198--- config
199    location /main {
200        echo 'pre main';
201        echo_location /sub;
202        echo 'post main';
203    }
204
205    location /sub {
206        echo 'pre sub';
207        echo_location /subsub;
208        echo 'post sub';
209    }
210
211    location /subsub {
212        echo 'subsub';
213    }
214--- request
215    GET /main
216--- response_body
217pre main
218pre sub
219subsub
220post sub
221post main
222
223
224
225=== TEST 11: chained subrequests using named locations
226as of 0.8.20, ngx_http_subrequest still does not support
227named location. sigh. this case is a TODO.
228--- config
229    location /main {
230        echo 'pre main';
231        echo_location @sub;
232        echo 'post main';
233    }
234
235    location @sub {
236        echo 'pre sub';
237        echo_location @subsub;
238        echo 'post sub';
239    }
240
241    location @subsub {
242        echo 'subsub';
243    }
244--- request
245    GET /main
246--- response_body
247pre main
248pre sub
249subsub
250post sub
251post main
252--- SKIP
253
254
255
256=== TEST 12: explicit flush in main request
257--- config
258    location /main {
259        echo 'pre main';
260        echo_location /sub;
261        echo 'post main';
262        echo_flush;
263    }
264
265    location /sub {
266        echo_sleep 0.02;
267        echo 'sub';
268    }
269--- request
270    GET /main
271--- response_body
272pre main
273sub
274post main
275
276
277
278=== TEST 13: no varaiable inheritance
279--- config
280    location /main {
281        echo $echo_cacheable_request_uri;
282        echo_location /sub;
283        echo_location /sub2;
284    }
285    location /sub {
286        echo $echo_cacheable_request_uri;
287    }
288    location /sub2 {
289        echo $echo_cacheable_request_uri;
290    }
291
292--- request
293    GET /main
294--- response_body
295/main
296/sub
297/sub2
298
299
300
301=== TEST 14: unsafe uri
302--- config
303    location /unsafe {
304        echo_location '/../foo';
305    }
306--- request
307    GET /unsafe
308--- ignore_response
309--- error_log
310echo_location sees unsafe uri: "/../foo"
311--- no_error_log
312[error]
313[alert]
314
315
316
317=== TEST 15: querystring in url
318--- config
319    location /main {
320        echo_location /sub?foo=Foo&bar=Bar;
321    }
322    location /sub {
323        echo $arg_foo $arg_bar;
324    }
325--- request
326    GET /main
327--- response_body
328Foo Bar
329
330
331
332=== TEST 16: querystring in url *AND* an explicit querystring
333--- config
334    location /main {
335        echo_location /sub?foo=Foo&bar=Bar blah=Blah;
336    }
337    location /sub {
338        echo $arg_foo $arg_bar $arg_blah;
339    }
340--- request
341    GET /main
342--- response_body
343  Blah
344
345
346
347=== TEST 17: let subrequest to read the main request's request body
348--- SKIP
349--- config
350    location /main {
351        echo_location /sub;
352    }
353    location /sub {
354        echo_read_request_body;
355        echo_request_body;
356    }
357--- request
358POST /main
359hello, body!
360--- response_body chomp
361hello, body!
362
363
364
365=== TEST 18: sleep after location
366--- config
367    location /main {
368        echo_location /sub;
369        echo_sleep 0.001;
370        echo_location /sub;
371    }
372    location /sub {
373        echo_sleep 0.001;
374        echo sub;
375    }
376--- request
377    GET /main
378--- response_body
379sub
380sub
381--- skip_nginx: 2: < 0.8.11
382
383
384
385=== TEST 19: deep nested echo_location/echo_location_async
386--- config
387    location /main {
388        echo_location /bar;
389        echo_location_async /bar;
390        echo_location_async /bar;
391        echo_location /group;
392        echo_location_async /group;
393    }
394
395    location /group {
396        echo_location /bar;
397        echo_location_async /bar;
398    }
399
400    location /bar {
401        #echo_sleep 0.001;
402        echo $echo_incr;
403    }
404--- request
405GET /main
406--- response_body
4071
4082
4093
4104
4115
4126
4137
414--- timeout: 2
415
416
417
418=== TEST 20: deep nested echo_location/echo_location_async (with sleep)
419--- config
420    location /main {
421        echo_location /bar;
422        echo_location_async /bar;
423        echo_location_async /bar;
424        echo_location /group;
425        echo_location_async /group;
426    }
427
428    location /group {
429        echo_location /baz;
430        echo_location_async /bah;
431    }
432
433    location ~ '^/ba[rzh]' {
434        echo_sleep 0.001;
435        echo $echo_incr;
436    }
437--- request
438GET /main
439--- response_body
4401
4412
4423
4434
4445
4456
4467
447--- timeout: 2
448
449
450
451=== TEST 21: deep nested echo_location (with sleep)
452--- config
453    location /main {
454        echo_location /bar;
455        echo_location /bar;
456        echo_location /bar;
457        echo_location /group;
458        echo_location /group;
459    }
460
461    location /group {
462        echo_location /bar;
463        echo_location /bar;
464    }
465
466    location /incr {
467        echo_sleep 0.001;
468        echo $echo_incr;
469    }
470
471    location /bar {
472        proxy_pass $scheme://127.0.0.1:$server_port/incr;
473    }
474--- request
475GET /main
476--- response_body
4771
4781
4791
4801
4811
4821
4831
484--- timeout: 5
485--- no_error_log
486[error]
487
488
489
490=== TEST 22: leading subrequest & echo_before_body
491--- config
492    location /main {
493        echo_before_body hello;
494        echo_location /foo;
495    }
496    location /foo {
497        echo world;
498    }
499--- request
500    GET /main
501--- response_body
502hello
503world
504
505
506
507=== TEST 23: leading subrequest & xss
508--- config
509    location /main {
510        default_type 'application/json';
511        xss_get on;
512        xss_callback_arg c;
513        echo_location /foo;
514    }
515    location /foo {
516        echo -n world;
517    }
518--- request
519    GET /main?c=hi
520--- response_body chop
521hi(world);
522
523
524
525=== TEST 24: multiple leading subrequest & xss
526--- config
527    location /main {
528        default_type 'application/json';
529        xss_get on;
530        xss_callback_arg c;
531        echo_location /foo;
532        echo_location /bar;
533    }
534    location /main2 {
535        content_by_lua '
536            local res = ngx.location.capture("/foo")
537            local res2 = ngx.location.capture("/bar")
538            ngx.say(res.body)
539            ngx.say(res2.body)
540        ';
541    }
542    location /foo {
543        echo -n world;
544    }
545    location /bar {
546        echo -n ' people';
547    }
548--- request
549    GET /main?c=hi
550--- response_body chop
551hi(world people);
552
553
554
555=== TEST 25: sanity (HEAD)
556--- config
557    location /main {
558        echo_location /sub;
559        echo_location /sub;
560    }
561    location /sub {
562        echo hello;
563    }
564--- request
565    HEAD /main
566--- response_body
567
568