# vim:set ft= ts=4 sw=4 et fdm=marker: use lib 'lib'; use Test::Nginx::Socket::Lua; use Cwd qw(cwd); #worker_connections(1014); #master_process_enabled(1); #log_level('warn'); repeat_each(2); plan tests => repeat_each() * (blocks() * 5 + 5); my $pwd = cwd(); our $HttpConfig = <<_EOC_; lua_shared_dict dogs 1m; lua_package_path "$pwd/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;"; init_by_lua ' local verbose = false if verbose then local dump = require "jit.dump" dump.on("b", "$Test::Nginx::Util::ErrLogFile") else local v = require "jit.v" v.on("$Test::Nginx::Util::ErrLogFile") end require "resty.core" -- jit.off() '; _EOC_ #no_diff(); #no_long_string(); check_accum_error_log(); run_tests(); __DATA__ === TEST 1: write to ngx.header.HEADER (single value) --- http_config eval: $::HttpConfig --- config location = /t { set $foo hello; content_by_lua ' for i = 1, 100 do ngx.header["Foo"] = i end ngx.say("Foo: ", ngx.header["Foo"]) '; } --- request GET /t --- response_body Foo: 100 --- error_log eval qr/\[TRACE \d+ content_by_lua\(nginx\.conf:\d+\):2 loop\]/ --- no_error_log [error] -- NYI: === TEST 2: write to ngx.header.HEADER (nil) --- http_config eval: $::HttpConfig --- config location = /t { set $foo hello; content_by_lua ' for i = 1, 200 do ngx.header["Foo"] = i ngx.header["Foo"] = nil end ngx.say("Foo: ", ngx.header["Foo"]) '; } --- request GET /t --- response_body Foo: nil --- error_log eval qr/\[TRACE \d+ content_by_lua\(nginx\.conf:\d+\):2 loop\]/ --- wait: 0.2 --- no_error_log [error] -- NYI: === TEST 3: write to ngx.header.HEADER (multi-value) --- http_config eval: $::HttpConfig --- config location = /t { set $foo hello; content_by_lua ' for i = 1, 200 do ngx.header["Foo"] = {i, i + 1} end local v = ngx.header["Foo"] if type(v) == "table" then ngx.say("Foo: ", table.concat(v, ", ")) else ngx.say("Foo: ", v) end '; } --- request GET /t --- response_body Foo: 200, 201 --- error_log eval qr/\[TRACE \d+ content_by_lua\(nginx\.conf:\d+\):2 loop\]/ --- no_error_log [error] -- NYI: === TEST 4: read from ngx.header.HEADER (single value) --- http_config eval: $::HttpConfig --- config location = /t { set $foo hello; content_by_lua ' local v for i = 1, 100 do ngx.header["Foo"] = i v = ngx.header["Foo"] end ngx.say("Foo: ", v) '; } --- request GET /t --- response_body Foo: 100 --- error_log eval qr/\[TRACE \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/ --- no_error_log eval [ "[error]", qr/ -- NYI: (?!return to lower frame)/, "stitch", ] === TEST 5: read from ngx.header.HEADER (not found) --- http_config eval: $::HttpConfig --- config location = /t { set $foo hello; content_by_lua ' local v for i = 1, 100 do v = ngx.header["Foo"] end ngx.say("Foo: ", v) '; } --- request GET /t --- response_body Foo: nil --- error_log eval qr/\[TRACE \d+ content_by_lua\(nginx\.conf:\d+\):3 loop\]/ --- no_error_log [error] -- NYI: stitch === TEST 6: read from ngx.header.HEADER (multi-value) --- http_config eval: $::HttpConfig --- config location = /t { set $foo hello; content_by_lua ' ngx.header["Foo"] = {"foo", "bar"} local v for i = 1, 100 do v = ngx.header["Foo"] end ngx.say("Foo: ", table.concat(v, ", ")) '; } --- request GET /t --- response_body Foo: foo, bar --- error_log eval qr/\[TRACE \d+ content_by_lua\(nginx\.conf:\d+\):4 loop\]/ --- no_error_log [error] -- NYI: stitch === TEST 7: set multi values to cache-control and override it with multiple values --- http_config eval: $::HttpConfig --- config location /lua { content_by_lua ' ngx.header.cache_control = { "private", "no-store" } ngx.header.cache_control = { "no-cache", "blah", "foo" } local v for i = 1, 400 do v = ngx.header.cache_control end ngx.say("Cache-Control: ", table.concat(v, ", ")) '; } --- request GET /lua --- response_headers Cache-Control: no-cache, blah, foo --- response_body_like chop ^Cache-Control: no-cache[;,] blah[;,] foo$ --- error_log eval qr/\[TRACE \d+ content_by_lua\(nginx\.conf:\d+\):5 (?:loop|-> \d+)\]/ --- no_error_log [error] -- NYI: stitch