in kong/kong/runloop/handler.lua [1275:1477]
before = function(ctx)
if ctx.service and (ctx.service.protocol == "grpc" or
ctx.service.protocol == "grpcs")
then
return
end
ctx.scheme = var.scheme
ctx.request_uri = var.request_uri
local span = instrumentation.router()
local router = get_updated_router()
local match_t = router:exec(ctx)
if not match_t then
if span then
span:set_status(2)
span:finish()
end
return kong.response.exit(404, { message = "no Route matched with those values" })
end
if span then
span:finish()
end
ctx.workspace = match_t.route and match_t.route.ws_id
local host = var.host
local port = tonumber(ctx.host_port, 10)
or tonumber(var.server_port, 10)
local route = match_t.route
local service = match_t.service
local upstream_url_t = match_t.upstream_url_t
local realip_remote_addr = var.realip_remote_addr
local forwarded_proto
local forwarded_host
local forwarded_port
local forwarded_path
local forwarded_prefix
local trusted_ip = kong.ip.is_trusted(realip_remote_addr)
if trusted_ip then
forwarded_proto = var.http_x_forwarded_proto or ctx.scheme
forwarded_host = var.http_x_forwarded_host or host
forwarded_port = var.http_x_forwarded_port or port
forwarded_path = var.http_x_forwarded_path
forwarded_prefix = var.http_x_forwarded_prefix
else
forwarded_proto = ctx.scheme
forwarded_host = host
forwarded_port = port
end
if not forwarded_path then
forwarded_path = ctx.request_uri
local p = find(forwarded_path, "?", 2, true)
if p then
forwarded_path = sub(forwarded_path, 1, p - 1)
end
end
if not forwarded_prefix and match_t.prefix ~= "/" then
forwarded_prefix = match_t.prefix
end
local protocols = route.protocols
if (protocols and protocols.https and not protocols.http and
forwarded_proto ~= "https")
then
local redirect_status_code = route.https_redirect_status_code or 426
if redirect_status_code == 426 then
return kong.response.exit(426, { message = "Please use HTTPS protocol" }, {
["Connection"] = "Upgrade",
["Upgrade"] = "TLS/1.2, HTTP/1.1",
})
end
if redirect_status_code == 301
or redirect_status_code == 302
or redirect_status_code == 307
or redirect_status_code == 308
then
header["Location"] = "https://" .. forwarded_host .. ctx.request_uri
return kong.response.exit(redirect_status_code)
end
end
local protocol_version = http_version()
if protocols.grpc or protocols.grpcs then
local content_type = var.content_type
if content_type and sub(content_type, 1, #"application/grpc") == "application/grpc" then
if protocol_version ~= 2 then
return kong.response.exit(426, { message = "Please use HTTP2 protocol" }, {
["connection"] = "Upgrade",
["upgrade"] = "HTTP/2",
})
end
else
return kong.response.exit(415, { message = "Non-gRPC request matched gRPC route" })
end
if not protocols.grpc and forwarded_proto ~= "https" then
return kong.response.exit(200, nil, {
["content-type"] = "application/grpc",
["grpc-status"] = 1,
["grpc-message"] = "gRPC request matched gRPCs route",
})
end
end
balancer_prepare(ctx, match_t.upstream_scheme,
upstream_url_t.type,
upstream_url_t.host,
upstream_url_t.port,
service, route)
ctx.router_matches = match_t.matches
var.upstream_scheme = match_t.upstream_scheme
var.upstream_uri = escape(match_t.upstream_uri)
if match_t.upstream_host then
var.upstream_host = match_t.upstream_host
end
local upgrade = var.http_upgrade
if upgrade and lower(upgrade) == "websocket" then
var.upstream_connection = "keep-alive, Upgrade"
var.upstream_upgrade = "websocket"
else
var.upstream_connection = "keep-alive"
end
local http_x_forwarded_for = var.http_x_forwarded_for
if http_x_forwarded_for then
var.upstream_x_forwarded_for = http_x_forwarded_for .. ", " ..
realip_remote_addr
else
var.upstream_x_forwarded_for = var.remote_addr
end
var.upstream_x_forwarded_proto = forwarded_proto
var.upstream_x_forwarded_host = forwarded_host
var.upstream_x_forwarded_port = forwarded_port
var.upstream_x_forwarded_path = forwarded_path
var.upstream_x_forwarded_prefix = forwarded_prefix
if service and var.kong_proxy_mode == "http" then
if service.protocol == "grpc" or service.protocol == "grpcs" then
return exec("@grpc")
end
if protocol_version == 1.1 then
if route.request_buffering == false then
if route.response_buffering == false then
return exec("@unbuffered")
end
return exec("@unbuffered_request")
end
if route.response_buffering == false then
return exec("@unbuffered_response")
end
end
end
end,