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

289 lines
6.0 KiB
Lua

---
-- The Plugin Development Kit (PDK) is set of Lua functions and variables
-- that can be used by plugins to implement their own logic.
-- The PDK is originally released in Kong 0.14.0.
-- The PDK is guaranteed to be forward-compatible
-- from its 1.0.0 release and onward.
--
-- The Plugin Development Kit is accessible from the `kong` global variable,
-- and various functionalities are namespaced under this table, such as
-- `kong.request`, `kong.log`, etc.
--
-- @module PDK
-- @release 1.0.0
---
-- Top-level variables
-- @section top_level_variables
---
-- A human-readable string containing the version number of the currently
-- running node.
--
-- @field kong.version
-- @usage print(kong.version) -- "2.0.0"
---
-- An integral number representing the version number of the currently running
-- node, useful for comparison and feature-existence checks.
--
-- @field kong.version_num
-- @usage
-- if kong.version_num < 3004001 then -- 300.40.1 -> 3.4.1
-- -- no support for Routes & Services
-- end
---
-- A read-only table containing the configuration of the current Kong node,
-- based on the configuration file and environment variables.
--
-- See [kong.conf.default](https://github.com/Kong/kong/blob/master/kong.conf.default)
-- for details.
--
-- Comma-separated lists in the `kong.conf` file get promoted to arrays of strings in this
-- table.
--
-- @field kong.configuration
-- @usage
-- print(kong.configuration.prefix) -- "/usr/local/kong"
-- -- this table is read-only; the following throws an error:
-- kong.configuration.prefix = "foo"
--- Request/Response
-- @section request_response
--- Current request context data
-- @field kong.ctx
-- @redirect kong.ctx
--- Client information module
-- @field kong.client
-- @redirect kong.client
--- Client request module
-- @field kong.request
-- @redirect kong.request
--- Properties of the connection to the Service
-- @field kong.service
-- @redirect kong.service
--- Manipulation of the request to the Service
-- @field kong.service.request
-- @redirect kong.service.request
--- Manipulation of the response from the Service
-- @field kong.service.response
-- @redirect kong.service.response
--- Client response module
-- @field kong.response
-- @redirect kong.response
--- Router module
-- @field kong.router
-- @redirect kong.router
--- Nginx module
-- @field kong.nginx
-- @redirect kong.nginx
---
-- Instance of Kong's DAO (the `kong.db` module). Contains accessor objects
-- to various entities.
--
-- A more thorough documentation of this DAO and new schema definitions is to
-- be made available in the future.
--
-- @field kong.db
-- @usage
-- kong.db.services:insert()
-- kong.db.routes:select()
---
-- Instance of Kong's DNS resolver, a client object from the
-- [lua-resty-dns-client](https://github.com/kong/lua-resty-dns-client) module.
--
-- **Note:** Usage of this module is currently reserved to the core or to
-- advanced users.
--
-- @field kong.dns
---
-- Instance of Kong's IPC module for inter-workers communication from the
-- [lua-resty-events](https://github.com/Kong/lua-resty-events)
-- module.
--
-- **Note:** Usage of this module is currently reserved to the core or to
-- advanced users.
--
-- @field kong.worker_events
---
-- Instance of Kong's cluster events module for inter-nodes communication.
--
-- **Note:** Usage of this module is currently reserved to the core or to
-- advanced users.
--
-- @field kong.cluster_events
---
-- Instance of Kong's database caching object, from the `kong.cache` module.
--
-- **Note:** Usage of this module is currently reserved to the core or to
-- advanced users.
--
-- @field kong.cache
---
-- Instance of Kong's IP module to determine whether a given IP address is
-- trusted
-- @field kong.ip
-- @redirect kong.ip
--- Utilities
-- @section utilities
--- Node-level utilities
-- @field kong.node
-- @redirect kong.node
--- Utilities for Lua tables
-- @field kong.table
-- @redirect kong.table
--- Instance of Kong logging factory with various utilities
-- @field kong.log
-- @redirect kong.log
assert(package.loaded["resty.core"])
local get_request = require("resty.core.base").get_request
local type = type
local error = error
local rawget = rawget
local ipairs = ipairs
local setmetatable = setmetatable
local MAJOR_MODULES = {
"table",
"node",
"log",
"ctx",
"ip",
"client",
"service",
"request",
"service.request",
"service.response",
"response",
"router",
"nginx",
"cluster",
"vault",
"tracing",
"plugin",
"telemetry",
}
if ngx.config.subsystem == 'http' then
table.insert(MAJOR_MODULES, 'client.tls')
end
local _PDK = { }
function _PDK.new(kong_config, self)
if kong_config then
if type(kong_config) ~= "table" then
error("kong_config must be a table", 2)
end
else
kong_config = {}
end
self = self or {}
self.configuration = setmetatable({
remove_sensitive = function()
local conf_loader = require "kong.conf_loader"
return conf_loader.remove_sensitive(kong_config)
end,
}, {
__index = function(_, v)
return kong_config[v]
end,
__newindex = function()
error("cannot write to configuration", 2)
end,
})
for _, module_name in ipairs(MAJOR_MODULES) do
local parent = self
for part in module_name:gmatch("([^.]+)%.") do
if not parent[part] then
parent[part] = {}
end
parent = parent[part]
end
local child = module_name:match("[^.]*$")
if parent[child] then
error("PDK module '" .. module_name .. "' conflicts with a key")
end
local mod = require("kong.pdk." .. module_name)
parent[child] = mod.new(self)
end
self._log = self.log
self.log = nil
return setmetatable(self, {
__index = function(t, k)
if k == "log" then
if get_request() then
local log = ngx.ctx.KONG_LOG
if log then
return log
end
end
return (rawget(t, "_log"))
end
end
})
end
return _PDK