in kong/kong/router/atc_compat.lua [582:670]
function _M:select(req_method, req_uri, req_host, req_scheme,
src_ip, src_port,
dst_ip, dst_port,
sni, req_headers)
check_select_params(req_method, req_uri, req_host, req_scheme,
src_ip, src_port,
dst_ip, dst_port,
sni, req_headers)
local c = context.new(self.schema)
local host, port = split_host_port(req_host)
for _, field in ipairs(self.fields) do
if field == "http.method" then
assert(c:add_value("http.method", req_method))
elseif field == "http.path" then
assert(c:add_value("http.path", req_uri))
elseif field == "http.host" then
assert(c:add_value("http.host", host))
elseif field == "net.port" then
assert(c:add_value("net.port", port))
elseif field == "net.protocol" then
assert(c:add_value("net.protocol", req_scheme))
elseif field == "tls.sni" then
assert(c:add_value("tls.sni", sni))
elseif req_headers and field:sub(1, 13) == "http.headers." then
local h = field:sub(14)
local v = req_headers[h]
if v then
if type(v) == "string" then
assert(c:add_value(field, v:lower()))
else
for _, v in ipairs(v) do
assert(c:add_value(field, v:lower()))
end
end
end
end
end
local matched = self.router:execute(c)
if not matched then
return nil
end
local uuid, matched_path, captures = c:get_result("http.path")
local service = self.services[uuid]
local matched_route = self.routes[uuid]
local service_protocol, _,
service_host, service_port,
service_hostname_type, service_path = get_service_info(service)
local request_prefix = matched_route.strip_path and matched_path or nil
local request_postfix = request_prefix and req_uri:sub(#matched_path + 1) or req_uri:sub(2, -1)
request_postfix = sanitize_uri_postfix(request_postfix) or ""
local upstream_base = service_path or "/"
local upstream_uri = get_upstream_uri_v0(matched_route, request_postfix, req_uri,
upstream_base)
return {
route = matched_route,
service = service,
prefix = request_prefix,
matches = {
uri_captures = (captures and captures[1]) and captures or nil,
},
upstream_url_t = {
type = service_hostname_type,
host = service_host,
port = service_port,
},
upstream_scheme = service_protocol,
upstream_uri = upstream_uri,
upstream_host = matched_route.preserve_host and req_host or nil,
}
end