248 lines
5.2 KiB
Lua
248 lines
5.2 KiB
Lua
return [[
|
|
# if not hostname then
|
|
# hostname = "_"
|
|
# end
|
|
# if not debug.port then
|
|
# error("debug.port is required")
|
|
# end
|
|
# if not shm_size then
|
|
# shm_size = "20m"
|
|
# end
|
|
daemon on;
|
|
# if not worker_num then
|
|
# worker_num = 1
|
|
# end
|
|
worker_processes $(worker_num);
|
|
error_log logs/error.log info;
|
|
pid logs/nginx.pid;
|
|
worker_rlimit_nofile 8192;
|
|
|
|
events {
|
|
worker_connections 1024;
|
|
}
|
|
|
|
http {
|
|
lua_shared_dict mock_logs $(shm_size);
|
|
|
|
# for dict, size in pairs(dicts or {}) do
|
|
lua_shared_dict $(dict) $(size);
|
|
# end
|
|
|
|
init_by_lua_block {
|
|
# if log_opts.err then
|
|
-- disable warning of global variable
|
|
local g_meta = getmetatable(_G)
|
|
setmetatable(_G, nil)
|
|
|
|
original_assert = assert -- luacheck: ignore
|
|
|
|
local function insert_err(err)
|
|
local err_t = ngx.ctx.err
|
|
if not err_t then
|
|
err_t = {}
|
|
ngx.ctx.err = err_t
|
|
end
|
|
table.insert(err_t, {err, debug.traceback("", 3)})
|
|
end
|
|
|
|
function assert(truthy, err, ...) -- luacheck: ignore
|
|
if not truthy and ngx.ctx then
|
|
insert_err(err)
|
|
end
|
|
|
|
return original_assert(truthy, err, ...)
|
|
end
|
|
|
|
original_error = error -- luacheck: ignore
|
|
|
|
function error(msg, ...) -- luacheck: ignore
|
|
if ngx.ctx then
|
|
insert_err(msg)
|
|
end
|
|
|
|
return original_error(msg, ...)
|
|
end
|
|
|
|
err_patched = true -- luacheck: ignore
|
|
|
|
setmetatable(_G, g_meta)
|
|
# end
|
|
# if init then
|
|
$(init)
|
|
# end
|
|
}
|
|
|
|
server {
|
|
listen 0.0.0.0:$(debug.port);
|
|
server_name mock_debug;
|
|
|
|
location = /status {
|
|
stub_status;
|
|
}
|
|
|
|
location /logs {
|
|
default_type application/json;
|
|
|
|
access_by_lua_block {
|
|
local mock_logs = ngx.shared.mock_logs
|
|
|
|
if ngx.req.get_method() == "DELETE" then
|
|
mock_logs:flush_all()
|
|
return ngx.exit(204)
|
|
end
|
|
|
|
if ngx.req.get_method() ~= "POST" then
|
|
return ngx.exit(405)
|
|
end
|
|
|
|
ngx.print("[")
|
|
local ele, err
|
|
repeat
|
|
local old_ele = ele
|
|
ele, err = mock_logs:lpop("mock_logs")
|
|
if old_ele and ele then
|
|
ngx.print(",", ele)
|
|
elseif ele then
|
|
ngx.print(ele)
|
|
end
|
|
if err then
|
|
return ngx.exit(500)
|
|
end
|
|
until not ele
|
|
ngx.print("]")
|
|
ngx.exit(200)
|
|
}
|
|
}
|
|
}
|
|
|
|
server {
|
|
# for _, listen in ipairs(listens or {}) do
|
|
listen $(listen);
|
|
# end
|
|
server_name $(hostname);
|
|
|
|
# for _, directive in ipairs(directives or {}) do
|
|
$(directive)
|
|
|
|
# end
|
|
# if tls then
|
|
ssl_certificate ../../spec/fixtures/kong_spec.crt;
|
|
ssl_certificate_key ../../spec/fixtures/kong_spec.key;
|
|
ssl_protocols TLSv1.2;
|
|
ssl_ciphers HIGH:!aNULL:!MD5;
|
|
|
|
# end
|
|
# for location, route in pairs(routes or {}) do
|
|
location $(location) {
|
|
# if route.directives then
|
|
$(route.directives)
|
|
|
|
# end
|
|
# if route.access or log_opts.req then
|
|
access_by_lua_block {
|
|
# if log_opts.req then
|
|
-- collect request
|
|
local method = ngx.req.get_method()
|
|
local uri = ngx.var.request_uri
|
|
local headers = ngx.req.get_headers(nil, true)
|
|
|
|
|
|
ngx.req.read_body()
|
|
local body
|
|
# if log_opts.req_body then
|
|
-- collect body
|
|
body = ngx.req.get_body_data()
|
|
if not body then
|
|
local file = ngx.req.get_body_file()
|
|
if file then
|
|
# if log_opts.req_large_body then
|
|
local f = io.open(file, "r")
|
|
if f then
|
|
body = f:read("*a")
|
|
f:close()
|
|
end
|
|
# else
|
|
body = { "body is too large" }
|
|
# end -- if log_opts.req_large_body
|
|
end
|
|
end
|
|
# end -- if log_opts.req_body
|
|
ngx.ctx.req = {
|
|
method = method,
|
|
uri = uri,
|
|
headers = headers,
|
|
body = body,
|
|
}
|
|
|
|
# end -- if log_opts.req
|
|
# if route.access then
|
|
$(route.access)
|
|
# end
|
|
}
|
|
# end
|
|
|
|
# if route.header_filter then
|
|
header_filter_by_lua_block {
|
|
$(route.header)
|
|
}
|
|
|
|
# end
|
|
# if route.content then
|
|
content_by_lua_block {
|
|
$(route.content)
|
|
}
|
|
|
|
# end
|
|
# if route.body_filter or log_opts.resp_body then
|
|
body_filter_by_lua_block {
|
|
# if route.body_filter then
|
|
$(route.body)
|
|
|
|
# end
|
|
# if log_opts.resp_body then
|
|
-- collect body
|
|
ngx.ctx.resp_body = ngx.ctx.resp_body or {}
|
|
if not ngx.arg[2] then
|
|
table.insert(ngx.ctx.resp_body, ngx.arg[1])
|
|
end
|
|
# end -- if log_opts.resp_body
|
|
}
|
|
|
|
# end
|
|
log_by_lua_block {
|
|
# if route.log then
|
|
$(route.log)
|
|
|
|
# end
|
|
-- collect session data
|
|
local cjson = require "cjson"
|
|
local start_time = ngx.req.start_time()
|
|
local end_time = ngx.now()
|
|
|
|
local req = ngx.ctx.req or {}
|
|
local resp
|
|
# if log_opts.resp then
|
|
resp = {
|
|
status = ngx.status,
|
|
headers = ngx.resp.get_headers(nil, true),
|
|
body = ngx.ctx.resp_body and table.concat(ngx.ctx.resp_body),
|
|
}
|
|
# else -- if log_opts.resp
|
|
resp = {}
|
|
# end -- if log_opts.resp
|
|
local err = ngx.ctx.err
|
|
|
|
ngx.shared.mock_logs:rpush("mock_logs", cjson.encode({
|
|
start_time = start_time,
|
|
end_time = end_time,
|
|
req = req,
|
|
resp = resp,
|
|
err = err,
|
|
}))
|
|
}
|
|
}
|
|
# end -- for location, route in pairs(routes)
|
|
}
|
|
}
|
|
]]
|