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