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