in apisix/init.lua [569:724]
function _M.http_access_phase()
if ngx.req.http_version() == 3 then
ngx.var.upstream_host = ngx.var.host .. ":" .. ngx.var.server_port
end
local ngx_ctx = ngx.ctx
local api_ctx = core.tablepool.fetch("api_ctx", 0, 32)
ngx_ctx.api_ctx = api_ctx
core.ctx.set_vars_meta(api_ctx)
if not verify_https_client(api_ctx) then
return core.response.exit(400)
end
debug.dynamic_debug(api_ctx)
local uri = api_ctx.var.uri
if local_conf.apisix then
if local_conf.apisix.delete_uri_tail_slash then
if str_byte(uri, #uri) == str_byte("/") then
api_ctx.var.uri = str_sub(api_ctx.var.uri, 1, #uri - 1)
core.log.info("remove the end of uri '/', current uri: ", api_ctx.var.uri)
end
end
if local_conf.apisix.normalize_uri_like_servlet then
local new_uri, err = normalize_uri_like_servlet(uri)
if not new_uri then
core.log.error("failed to normalize: ", err)
return core.response.exit(400)
end
api_ctx.var.uri = new_uri
api_ctx.var.upstream_uri = uri
end
end
api_ctx.var.real_request_uri = api_ctx.var.request_uri
api_ctx.var.request_uri = api_ctx.var.uri .. api_ctx.var.is_args .. (api_ctx.var.args or "")
router.router_http.match(api_ctx)
local route = api_ctx.matched_route
if not route then
local global_rules = apisix_global_rules.global_rules()
plugin.run_global_rules(api_ctx, global_rules, nil)
core.log.info("not find any matched route")
return core.response.exit(404,
{error_msg = "404 Route Not Found"})
end
core.log.info("matched route: ",
core.json.delay_encode(api_ctx.matched_route, true))
local enable_websocket = route.value.enable_websocket
if route.value.plugin_config_id then
local conf = plugin_config.get(route.value.plugin_config_id)
if not conf then
core.log.error("failed to fetch plugin config by ",
"id: ", route.value.plugin_config_id)
return core.response.exit(503)
end
route = plugin_config.merge(route, conf)
end
if route.value.service_id then
local service = service_fetch(route.value.service_id)
if not service then
core.log.error("failed to fetch service configuration by ",
"id: ", route.value.service_id)
return core.response.exit(404)
end
route = plugin.merge_service_route(service, route)
api_ctx.matched_route = route
api_ctx.conf_type = "route&service"
api_ctx.conf_version = route.modifiedIndex .. "&" .. service.modifiedIndex
api_ctx.conf_id = route.value.id .. "&" .. service.value.id
api_ctx.service_id = service.value.id
api_ctx.service_name = service.value.name
if enable_websocket == nil then
enable_websocket = service.value.enable_websocket
end
else
api_ctx.conf_type = "route"
api_ctx.conf_version = route.modifiedIndex
api_ctx.conf_id = route.value.id
end
api_ctx.route_id = route.value.id
api_ctx.route_name = route.value.name
local global_rules = apisix_global_rules.global_rules()
plugin.run_global_rules(api_ctx, global_rules, nil)
if route.value.script then
script.load(route, api_ctx)
script.run("access", api_ctx)
else
local plugins = plugin.filter(api_ctx, route)
api_ctx.plugins = plugins
plugin.run_plugin("rewrite", plugins, api_ctx)
if api_ctx.consumer then
local changed
local group_conf
if api_ctx.consumer.group_id then
group_conf = consumer_group.get(api_ctx.consumer.group_id)
if not group_conf then
core.log.error("failed to fetch consumer group config by ",
"id: ", api_ctx.consumer.group_id)
return core.response.exit(503)
end
end
route, changed = plugin.merge_consumer_route(
route,
api_ctx.consumer,
group_conf,
api_ctx
)
core.log.info("find consumer ", api_ctx.consumer.username,
", config changed: ", changed)
if changed then
api_ctx.matched_route = route
core.table.clear(api_ctx.plugins)
local phase = "rewrite_in_consumer"
api_ctx.plugins = plugin.filter(api_ctx, route, api_ctx.plugins, nil, phase)
plugin.run_plugin(phase, api_ctx.plugins, api_ctx)
end
end
plugin.run_plugin("access", plugins, api_ctx)
end
_M.handle_upstream(api_ctx, route, enable_websocket)
end