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

79 lines
4.1 KiB
Lua

local typedefs = require "kong.db.schema.typedefs"
local url = require "socket.url"
return {
name = "http-log",
fields = {
{ protocols = typedefs.protocols },
{ config = {
type = "record",
fields = {
{ http_endpoint = typedefs.url({ required = true, encrypted = true, referenceable = true }) }, -- encrypted = true is a Kong-Enterprise exclusive feature, does nothing in Kong CE
{ method = { description = "An optional method used to send data to the HTTP server. Supported values are `POST` (default), `PUT`, and `PATCH`.", type = "string", default = "POST", one_of = { "POST", "PUT", "PATCH" }, }, },
{ content_type = { description = "Indicates the type of data sent. The only available option is `application/json`.", type = "string", default = "application/json", one_of = { "application/json", "application/json; charset=utf-8" }, }, },
{ timeout = { description = "An optional timeout in milliseconds when sending data to the upstream server.", type = "number", default = 10000 }, },
{ keepalive = { description = "An optional value in milliseconds that defines how long an idle connection will live before being closed.", type = "number", default = 60000 }, },
{ retry_count = {
description = "Number of times to retry when sending data to the upstream server.",
type = "integer",
deprecation = {
message = "http-log: config.retry_count no longer works, please use config.queue.max_retry_time instead",
removal_in_version = "4.0",
old_default = 10 }, }, },
{ queue_size = {
description = "Maximum number of log entries to be sent on each message to the upstream server.",
type = "integer",
deprecation = {
message = "http-log: config.queue_size is deprecated, please use config.queue.max_batch_size instead",
removal_in_version = "4.0",
old_default = 1 }, }, },
{ flush_timeout = {
description = "Optional time in seconds. If `queue_size` > 1, this is the max idle time before sending a log with less than `queue_size` records.",
type = "number",
deprecation = {
message = "http-log: config.flush_timeout is deprecated, please use config.queue.max_coalescing_delay instead",
removal_in_version = "4.0",
old_default = 2 }, }, },
{ headers = { description = "An optional table of headers included in the HTTP message to the upstream server. Values are indexed by header name, and each header name accepts a single string.", type = "map",
keys = typedefs.header_name {
match_none = {
{
pattern = "^[Hh][Oo][Ss][Tt]$",
err = "cannot contain 'Host' header",
},
{
pattern = "^[Cc][Oo][Nn][Tt][Ee][Nn][Tt]%-[Ll][Ee][nn][Gg][Tt][Hh]$",
err = "cannot contain 'Content-Length' header",
},
{
pattern = "^[Cc][Oo][Nn][Tt][Ee][Nn][Tt]%-[Tt][Yy][Pp][Ee]$",
err = "cannot contain 'Content-Type' header",
},
},
},
values = {
type = "string",
referenceable = true,
},
}},
{ queue = typedefs.queue },
{ custom_fields_by_lua = typedefs.lua_code },
},
custom_validator = function(config)
-- check no double userinfo + authorization header
local parsed_url = url.parse(config.http_endpoint)
if parsed_url.userinfo and config.headers and config.headers ~= ngx.null then
for hname, hvalue in pairs(config.headers) do
if hname:lower() == "authorization" then
return false, "specifying both an 'Authorization' header and user info in 'http_endpoint' is not allowed"
end
end
end
return true
end,
},
},
},
}