83 lines
1.9 KiB
Lua
83 lines
1.9 KiB
Lua
local ipairs = ipairs
|
|
|
|
local _M = {}
|
|
|
|
-- splits strings into host and port
|
|
local function parse_addr(addr)
|
|
local _, _, host, port = addr:find("([^:]+):([^:]+)")
|
|
if host and port then
|
|
return {host=host, port=port}
|
|
else
|
|
return nil, "error in parsing upstream address!"
|
|
end
|
|
end
|
|
|
|
function _M.get_first_value(var)
|
|
local t = _M.split_upstream_var(var) or {}
|
|
if #t == 0 then return nil end
|
|
return t[1]
|
|
end
|
|
|
|
function _M.get_last_value(var)
|
|
local t = _M.split_upstream_var(var) or {}
|
|
if #t == 0 then return nil end
|
|
return t[#t]
|
|
end
|
|
|
|
-- http://nginx.org/en/docs/http/ngx_http_upstream_module.html#example
|
|
-- CAVEAT: nginx is giving out : instead of , so the docs are wrong
|
|
-- 127.0.0.1:26157 : 127.0.0.1:26157 , ngx.var.upstream_addr
|
|
-- 200 : 200 , ngx.var.upstream_status
|
|
-- 0.00 : 0.00, ngx.var.upstream_response_time
|
|
function _M.split_upstream_var(var)
|
|
if not var then
|
|
return nil, nil
|
|
end
|
|
local t = {}
|
|
for v in var:gmatch("[^%s|,]+") do
|
|
if v ~= ":" then
|
|
t[#t+1] = v
|
|
end
|
|
end
|
|
return t
|
|
end
|
|
|
|
-- Splits an NGINX $upstream_addr and returns an array of tables
|
|
-- with a `host` and `port` key-value pair.
|
|
function _M.split_upstream_addr(addrs_str)
|
|
if not addrs_str then
|
|
return nil, nil
|
|
end
|
|
|
|
local addrs = _M.split_upstream_var(addrs_str)
|
|
local host_and_ports = {}
|
|
|
|
for _, v in ipairs(addrs) do
|
|
local a, err = parse_addr(v)
|
|
if err then
|
|
return nil, err
|
|
end
|
|
host_and_ports[#host_and_ports+1] = a
|
|
end
|
|
if #host_and_ports == 0 then
|
|
return nil, "no upstream addresses to parse!"
|
|
end
|
|
return host_and_ports
|
|
end
|
|
|
|
-- Splits string by delimiter. Returns array of parsed values and the length of the array.
|
|
function _M.split_string(what, delim)
|
|
local result = {}
|
|
local idx = 0
|
|
|
|
if what and delim and delim ~= "" then
|
|
for chunk in what:gmatch("([^" .. delim .. "]+)") do
|
|
idx = idx + 1
|
|
result[idx] = chunk
|
|
end
|
|
end
|
|
|
|
return result, idx
|
|
end
|
|
|
|
return _M
|