195 lines
5.1 KiB
Lua
195 lines
5.1 KiB
Lua
local STRATEGY_PATH = "kong.plugins.proxy-cache.strategies"
|
|
|
|
|
|
local require = require
|
|
local kong = kong
|
|
local fmt = string.format
|
|
|
|
|
|
local function broadcast_purge(plugin_id, cache_key)
|
|
local data = fmt("%s:%s", plugin_id, cache_key or "nil")
|
|
kong.log.debug("broadcasting purge '", data, "'")
|
|
return kong.cluster_events:broadcast("proxy-cache:purge", data)
|
|
end
|
|
|
|
|
|
local function each_proxy_cache()
|
|
local iter = kong.db.plugins:each()
|
|
|
|
return function()
|
|
while true do
|
|
local plugin, err = iter()
|
|
if err then
|
|
return kong.response.exit(500, { message = err })
|
|
end
|
|
if not plugin then
|
|
return
|
|
end
|
|
if plugin.name == "proxy-cache" then
|
|
return plugin
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
return {
|
|
["/proxy-cache"] = {
|
|
resource = "proxy-cache",
|
|
|
|
DELETE = function()
|
|
for plugin in each_proxy_cache() do
|
|
|
|
local strategy = require(STRATEGY_PATH)({
|
|
strategy_name = plugin.config.strategy,
|
|
strategy_opts = plugin.config[plugin.config.strategy],
|
|
})
|
|
|
|
local ok, err = strategy:flush(true)
|
|
if not ok then
|
|
return kong.response.exit(500, { message = err })
|
|
end
|
|
|
|
if require(STRATEGY_PATH).LOCAL_DATA_STRATEGIES[plugin.config.strategy]
|
|
then
|
|
local ok, err = broadcast_purge(plugin.id, nil)
|
|
if not ok then
|
|
kong.log.err("failed broadcasting proxy cache purge to cluster: ", err)
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
return kong.response.exit(204)
|
|
end
|
|
},
|
|
["/proxy-cache/:cache_key"] = {
|
|
resource = "proxy-cache",
|
|
|
|
GET = function(self)
|
|
for plugin in each_proxy_cache() do
|
|
|
|
local strategy = require(STRATEGY_PATH)({
|
|
strategy_name = plugin.config.strategy,
|
|
strategy_opts = plugin.config[plugin.config.strategy],
|
|
})
|
|
|
|
local cache_val, err = strategy:fetch(self.params.cache_key)
|
|
if err and err ~= "request object not in cache" then
|
|
return kong.response.exit(500, err)
|
|
end
|
|
|
|
if cache_val then
|
|
return kong.response.exit(200, cache_val)
|
|
end
|
|
|
|
end
|
|
|
|
-- fell through, not found
|
|
return kong.response.exit(404)
|
|
end,
|
|
|
|
DELETE = function(self)
|
|
for plugin in each_proxy_cache() do
|
|
|
|
local strategy = require(STRATEGY_PATH)({
|
|
strategy_name = plugin.config.strategy,
|
|
strategy_opts = plugin.config[plugin.config.strategy],
|
|
})
|
|
|
|
local cache_val, err = strategy:fetch(self.params.cache_key)
|
|
if err and err ~= "request object not in cache" then
|
|
return kong.response.exit(500, err)
|
|
end
|
|
|
|
if cache_val then
|
|
local _, err = strategy:purge(self.params.cache_key)
|
|
if err then
|
|
return kong.response.exit(500, err)
|
|
end
|
|
|
|
if require(STRATEGY_PATH).LOCAL_DATA_STRATEGIES[plugin.config.strategy]
|
|
then
|
|
local ok, err = broadcast_purge(plugin.id, self.params.cache_key)
|
|
if not ok then
|
|
kong.log.err("failed broadcasting proxy cache purge to cluster: ", err)
|
|
end
|
|
end
|
|
|
|
return kong.response.exit(204)
|
|
end
|
|
|
|
end
|
|
|
|
-- fell through, not found
|
|
return kong.response.exit(404)
|
|
end,
|
|
},
|
|
["/proxy-cache/:plugin_id/caches/:cache_key"] = {
|
|
resource = "proxy-cache",
|
|
|
|
GET = function(self)
|
|
local plugin, err = kong.db.plugins:select({ id = self.params.plugin_id })
|
|
if err then
|
|
return kong.response.exit(500, err)
|
|
end
|
|
|
|
if not plugin then
|
|
return kong.response.exit(404)
|
|
end
|
|
|
|
local conf = plugin.config
|
|
local strategy = require(STRATEGY_PATH)({
|
|
strategy_name = conf.strategy,
|
|
strategy_opts = conf[conf.strategy],
|
|
})
|
|
|
|
local cache_val, err = strategy:fetch(self.params.cache_key)
|
|
if err == "request object not in cache" then
|
|
return kong.response.exit(404)
|
|
elseif err then
|
|
return kong.response.exit(500, err)
|
|
end
|
|
|
|
return kong.response.exit(200, cache_val)
|
|
end,
|
|
DELETE = function(self)
|
|
local plugin, err = kong.db.plugins:select({ id = self.params.plugin_id })
|
|
if err then
|
|
return kong.response.exit(500, err)
|
|
end
|
|
|
|
if not plugin then
|
|
return kong.response.exit(404)
|
|
end
|
|
|
|
local conf = plugin.config
|
|
local strategy = require(STRATEGY_PATH)({
|
|
strategy_name = conf.strategy,
|
|
strategy_opts = conf[conf.strategy],
|
|
})
|
|
|
|
local _, err = strategy:fetch(self.params.cache_key)
|
|
if err == "request object not in cache" then
|
|
return kong.response.exit(404)
|
|
elseif err then
|
|
return kong.response.exit(500, err)
|
|
end
|
|
|
|
local _, err = strategy:purge(self.params.cache_key)
|
|
if err then
|
|
return kong.response.exit(500, err)
|
|
end
|
|
|
|
if require(STRATEGY_PATH).LOCAL_DATA_STRATEGIES[conf.strategy] then
|
|
local ok, err = broadcast_purge(plugin.id, self.params.cache_key)
|
|
if not ok then
|
|
kong.log.err("failed broadcasting proxy cache purge to cluster: ", err)
|
|
end
|
|
end
|
|
|
|
return kong.response.exit(204)
|
|
end
|
|
},
|
|
}
|