in apisix/plugin.lua [476:568]
function _M.filter(ctx, conf, plugins, route_conf, phase)
local user_plugin_conf = conf.value.plugins
if user_plugin_conf == nil or
core.table.nkeys(user_plugin_conf) == 0 then
trace_plugins_info_for_debug(nil, nil)
return plugins or core.tablepool.fetch("plugins", 0, 0)
end
local custom_sort = false
local route_plugin_conf = route_conf and route_conf.value.plugins
plugins = plugins or core.tablepool.fetch("plugins", 32, 0)
for _, plugin_obj in ipairs(local_plugins) do
local name = plugin_obj.name
local plugin_conf = user_plugin_conf[name]
if type(plugin_conf) ~= "table" then
goto continue
end
if check_disable(plugin_conf) then
goto continue
end
if plugin_obj.run_policy == "prefer_route" and route_plugin_conf ~= nil then
local plugin_conf_in_route = route_plugin_conf[name]
local disable_in_route = check_disable(plugin_conf_in_route)
if plugin_conf_in_route and not disable_in_route then
goto continue
end
end
if phase == "rewrite_in_consumer"
and (not plugin_conf._from_consumer or plugin_obj.type == "auth") then
plugin_conf._skip_rewrite_in_consumer = true
end
if plugin_conf._meta and plugin_conf._meta.priority then
custom_sort = true
end
core.table.insert(plugins, plugin_obj)
core.table.insert(plugins, plugin_conf)
::continue::
end
trace_plugins_info_for_debug(ctx, plugins)
if custom_sort then
local tmp_plugin_objs = core.tablepool.fetch("tmp_plugin_objs", 0, #plugins / 2)
local tmp_plugin_confs = core.tablepool.fetch("tmp_plugin_confs", #plugins / 2, 0)
for i = 1, #plugins, 2 do
local plugin_obj = plugins[i]
local plugin_conf = plugins[i + 1]
tmp_plugin_objs[plugin_conf] = plugin_obj
core.table.insert(tmp_plugin_confs, plugin_conf)
if not plugin_conf._meta then
plugin_conf._meta = core.table.new(0, 1)
plugin_conf._meta.priority = plugin_obj.priority
else
if not plugin_conf._meta.priority then
plugin_conf._meta.priority = plugin_obj.priority
end
end
end
sort_tab(tmp_plugin_confs, custom_sort_plugin)
local index
for i = 1, #tmp_plugin_confs do
index = i * 2 - 1
local plugin_conf = tmp_plugin_confs[i]
local plugin_obj = tmp_plugin_objs[plugin_conf]
plugins[index] = plugin_obj
plugins[index + 1] = plugin_conf
end
core.tablepool.release("tmp_plugin_objs", tmp_plugin_objs)
core.tablepool.release("tmp_plugin_confs", tmp_plugin_confs)
end
return plugins
end