Files
2026-07-13 12:32:21 +08:00

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)
}
}
]]