| # vim:set ft= ts=4 sw=4 et fdm=marker: |
| use lib 'lib'; |
| use Test::Nginx::Socket::Lua; |
| |
| #worker_connections(1014); |
| #master_on(); |
| #workers(2); |
| #log_level('warn'); |
| |
| repeat_each(2); |
| #repeat_each(1); |
| |
| plan tests => repeat_each() * (blocks() * 3 + 7); |
| |
| #no_diff(); |
| #no_long_string(); |
| run_tests(); |
| |
| __DATA__ |
| |
| === TEST 1: sanity |
| --- config |
| location /lua { |
| content_by_lua ' |
| ngx.ctx.foo = 32; |
| ngx.say(ngx.ctx.foo) |
| '; |
| } |
| --- request |
| GET /lua |
| --- response_body |
| 32 |
| --- no_error_log |
| [error] |
| |
| |
| |
| === TEST 2: rewrite, access, and content |
| --- config |
| location /lua { |
| rewrite_by_lua ' |
| ngx.say("foo = ", ngx.ctx.foo) |
| ngx.ctx.foo = 76 |
| '; |
| access_by_lua ' |
| ngx.ctx.foo = ngx.ctx.foo + 3 |
| '; |
| content_by_lua ' |
| ngx.say(ngx.ctx.foo) |
| '; |
| } |
| --- request |
| GET /lua |
| --- response_body |
| foo = nil |
| 79 |
| --- no_error_log |
| [error] |
| |
| |
| |
| === TEST 3: interal redirect clears ngx.ctx |
| --- config |
| location /echo { |
| content_by_lua ' |
| ngx.say(ngx.ctx.foo) |
| '; |
| } |
| location /lua { |
| content_by_lua ' |
| ngx.ctx.foo = ngx.var.arg_data |
| -- ngx.say(ngx.ctx.foo) |
| ngx.exec("/echo") |
| '; |
| } |
| --- request |
| GET /lua?data=hello |
| --- response_body |
| nil |
| --- no_error_log |
| [error] |
| |
| |
| |
| === TEST 4: subrequest has its own ctx |
| --- config |
| location /sub { |
| content_by_lua ' |
| ngx.say("sub pre: ", ngx.ctx.blah) |
| ngx.ctx.blah = 32 |
| ngx.say("sub post: ", ngx.ctx.blah) |
| '; |
| } |
| location /main { |
| content_by_lua ' |
| ngx.ctx.blah = 73 |
| ngx.say("main pre: ", ngx.ctx.blah) |
| local res = ngx.location.capture("/sub") |
| ngx.print(res.body) |
| ngx.say("main post: ", ngx.ctx.blah) |
| '; |
| } |
| --- request |
| GET /main |
| --- response_body |
| main pre: 73 |
| sub pre: nil |
| sub post: 32 |
| main post: 73 |
| --- no_error_log |
| [error] |
| |
| |
| |
| === TEST 5: overriding ctx |
| --- config |
| location /lua { |
| content_by_lua ' |
| ngx.ctx = { foo = 32, bar = 54 }; |
| ngx.say(ngx.ctx.foo) |
| ngx.say(ngx.ctx.bar) |
| |
| ngx.ctx = { baz = 56 }; |
| ngx.say(ngx.ctx.foo) |
| ngx.say(ngx.ctx.baz) |
| '; |
| } |
| --- request |
| GET /lua |
| --- response_body |
| 32 |
| 54 |
| nil |
| 56 |
| --- no_error_log |
| [error] |
| |
| |
| |
| === TEST 6: header filter |
| --- config |
| location /lua { |
| content_by_lua ' |
| ngx.ctx.foo = 32; |
| ngx.say(ngx.ctx.foo) |
| '; |
| header_filter_by_lua ' |
| ngx.header.blah = ngx.ctx.foo + 1 |
| '; |
| } |
| --- request |
| GET /lua |
| --- response_headers |
| blah: 33 |
| --- response_body |
| 32 |
| --- no_error_log |
| [error] |
| |
| |
| |
| === TEST 7: capture_multi |
| --- config |
| location /other { |
| content_by_lua ' |
| ngx.say("dog = ", ngx.ctx.dog) |
| '; |
| } |
| |
| location /lua { |
| set $dog 'blah'; |
| set $cat 'foo'; |
| content_by_lua ' |
| local res1, res2 = ngx.location.capture_multi{ |
| {"/other/1", |
| { ctx = { dog = "hello" }} |
| }, |
| {"/other/2", |
| { ctx = { dog = "hiya" }} |
| } |
| }; |
| |
| ngx.print(res1.body) |
| ngx.print(res2.body) |
| ngx.say("parent: ", ngx.ctx.dog) |
| '; |
| } |
| --- request |
| GET /lua |
| --- response_body |
| dog = hello |
| dog = hiya |
| parent: nil |
| --- no_error_log |
| [error] |
| |
| |
| |
| === TEST 8: set_by_lua |
| --- config |
| location /lua { |
| set_by_lua $bar 'ngx.ctx.foo = 3 return 4'; |
| set_by_lua $foo 'return ngx.ctx.foo'; |
| echo "foo = $foo, bar = $bar"; |
| } |
| --- request |
| GET /lua |
| --- response_body |
| foo = 3, bar = 4 |
| --- no_error_log |
| [error] |
| |
| |
| |
| === TEST 9: ngx.ctx leaks with ngx.exec + log_by_lua |
| --- config |
| location = /t { |
| content_by_lua ' |
| ngx.ctx.foo = 32; |
| ngx.exec("/f") |
| '; |
| log_by_lua 'ngx.log(ngx.WARN, "ctx.foo = ", ngx.ctx.foo)'; |
| } |
| location = /f { |
| content_by_lua ' |
| ngx.say(ngx.ctx.foo) |
| '; |
| } |
| --- request |
| GET /t |
| --- response_body |
| nil |
| --- no_error_log |
| [error] |
| ctx.foo = |
| |
| |
| |
| === TEST 10: memory leaks with ngx.ctx + ngx.req.set_uri + log_by_lua |
| --- config |
| location = /t { |
| rewrite_by_lua ' |
| ngx.ctx.foo = 32; |
| ngx.req.set_uri("/f", true) |
| '; |
| log_by_lua 'ngx.log(ngx.WARN, "ctx.foo = ", ngx.ctx.foo)'; |
| } |
| location = /f { |
| content_by_lua ' |
| ngx.say(ngx.ctx.foo) |
| '; |
| } |
| --- request |
| GET /t |
| --- response_body |
| nil |
| --- no_error_log |
| [error] |
| ctx.foo = |
| |
| |
| |
| === TEST 11: ngx.ctx + ngx.exit(ngx.ERROR) + log_by_lua |
| --- config |
| location = /t { |
| rewrite_by_lua ' |
| ngx.ctx.foo = 32; |
| ngx.exit(ngx.ERROR) |
| '; |
| log_by_lua 'ngx.log(ngx.WARN, "ngx.ctx = ", ngx.ctx.foo)'; |
| } |
| --- request |
| GET /t |
| --- ignore_response |
| --- no_error_log |
| [error] |
| --- error_log |
| ngx.ctx = 32 |
| |
| |
| |
| === TEST 12: ngx.ctx + ngx.exit(200) + log_by_lua |
| --- config |
| location = /t { |
| rewrite_by_lua ' |
| ngx.ctx.foo = 32; |
| ngx.say(ngx.ctx.foo) |
| ngx.exit(200) |
| '; |
| log_by_lua 'ngx.log(ngx.WARN, "ctx.foo = ", ngx.ctx.foo)'; |
| } |
| --- request |
| GET /t |
| --- response_body |
| 32 |
| --- no_error_log |
| [error] |
| --- error_log |
| ctx.foo = 32 |
| |
| |
| |
| === TEST 13: ngx.ctx + ngx.redirect + log_by_lua |
| --- config |
| location = /t { |
| rewrite_by_lua ' |
| ngx.ctx.foo = 32; |
| ngx.redirect("/f") |
| '; |
| log_by_lua 'ngx.log(ngx.WARN, "ngx.ctx.foo = ", 32)'; |
| } |
| --- request |
| GET /t |
| --- response_body_like: 302 Found |
| --- error_code: 302 |
| --- error_log |
| ctx.foo = 32 |
| --- no_error_log |
| [error] |
| |
| |
| |
| === TEST 14: set ngx.ctx before internal redirects performed by other nginx modules |
| --- config |
| location = /t { |
| rewrite_by_lua ' |
| ngx.ctx.foo = "hello world"; |
| '; |
| echo_exec /foo; |
| } |
| |
| location = /foo { |
| echo hello; |
| } |
| --- request |
| GET /t |
| --- response_body |
| hello |
| --- no_error_log |
| [error] |
| --- log_level: debug |
| --- error_log |
| lua release ngx.ctx at ref |
| |
| |
| |
| === TEST 15: set ngx.ctx before internal redirects performed by other nginx modules (with log_by_lua) |
| --- config |
| location = /t { |
| rewrite_by_lua ' |
| ngx.ctx.foo = "hello world"; |
| '; |
| echo_exec /foo; |
| } |
| |
| location = /foo { |
| echo hello; |
| log_by_lua return; |
| } |
| --- request |
| GET /t |
| --- response_body |
| hello |
| --- no_error_log |
| [error] |
| --- log_level: debug |
| --- error_log |
| lua release ngx.ctx at ref |
| |
| |
| |
| === TEST 16: set ngx.ctx before simple uri rewrite performed by other nginx modules |
| --- config |
| location = /t { |
| set_by_lua $a 'ngx.ctx.foo = "hello world"; return 1'; |
| rewrite ^ /foo last; |
| echo blah; |
| } |
| |
| location = /foo { |
| echo foo; |
| } |
| --- request |
| GET /t |
| --- response_body |
| foo |
| --- no_error_log |
| [error] |
| --- log_level: debug |
| --- error_log |
| lua release ngx.ctx at ref |
| |