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

105 lines
2.5 KiB
Lua

local _M = {}
local timing
local function before_connect_new(self, options)
local destination
local scheme = options.scheme
if scheme == nil then
destination = "unix://" .. options.path
else
local port = options.port or (scheme == "http" and 80 or 443)
destination = scheme .. "://" .. options.host .. ":" .. port
end
self.__kong_timing_destination__ = destination
timing.enter_context("external_http")
timing.enter_context(destination)
end
-- https://github.com/ledgetech/lua-resty-http#TCP-only-connect
local function before_connect_deprecated(self, host, port, _options)
local destination
if type(port) == "number" then
destination = "http(s)://" .. host .. ":" .. port
else
destination = "unix://" .. host
end
self.__kong_timing_destination__ = destination
timing.enter_context("external_http")
timing.enter_context(destination)
end
local function before_connect(self, arg0, ...)
if type(arg0) == "table" then
before_connect_new(self, arg0)
return
end
before_connect_deprecated(self, arg0, ...)
end
local function after_connect()
timing.leave_context() -- leave destination
timing.leave_context() -- leave external_http
end
local function before_request(self, _params)
timing.enter_context("external_http")
timing.enter_context(self.__kong_timing_destination__ or "unknown")
timing.enter_context("http_request")
end
local function after_request()
timing.leave_context() -- leave http_request
timing.leave_context() -- leave destination
timing.leave_context() -- leave external_http
end
function _M.register_hooks(timing_module)
local http = require("resty.http")
local req_dyn_hook = require("kong.dynamic_hook")
--[[
The `connect()` function can receive <= 4 arguments (including `self`).
The `before_connect_deprecated()` is the deprecated version of `connect()`,
it can receive 4 arguments (including `self`).
The `connect()` function can receive 2 arguments (including `self`).
So the max_args is 4.
--]]
req_dyn_hook.hook_function("timing", http, "connect", 4, {
befores = { before_connect },
afters = { after_connect },
})
--[[
The `request()` function can receive <= 2 arguments (including `self`).
Here is the signature of the `request()` function:
function request(self, params)
--]]
req_dyn_hook.hook_function("timing", http, "request", 2, {
befores = { before_request },
afters = { after_request },
})
timing = timing_module
end
return _M