diff --git a/changelog/unreleased/kong/fix-age-header.yml b/changelog/unreleased/kong/fix-age-header.yml new file mode 100644 index 000000000000..f3db9eba9bef --- /dev/null +++ b/changelog/unreleased/kong/fix-age-header.yml @@ -0,0 +1,3 @@ +message: "proxy-cache response_headers age schema parameter changed from age to Age." +type: bugfix +scope: "Plugin" diff --git a/kong-3.8.0-0.rockspec b/kong-3.8.0-0.rockspec index f0a3a451c2bc..bf2167708e30 100644 --- a/kong-3.8.0-0.rockspec +++ b/kong-3.8.0-0.rockspec @@ -538,6 +538,7 @@ build = { ["kong.plugins.proxy-cache.api"] = "kong/plugins/proxy-cache/api.lua", ["kong.plugins.proxy-cache.strategies"] = "kong/plugins/proxy-cache/strategies/init.lua", ["kong.plugins.proxy-cache.strategies.memory"] = "kong/plugins/proxy-cache/strategies/memory.lua", + ["kong.plugins.proxy-cache.clustering.compat.response_headers_translation"] = "kong/plugins/proxy-cache/clustering/compat/response_headers_translation.lua", ["kong.plugins.grpc-web.deco"] = "kong/plugins/grpc-web/deco.lua", ["kong.plugins.grpc-web.handler"] = "kong/plugins/grpc-web/handler.lua", diff --git a/kong/clustering/compat/checkers.lua b/kong/clustering/compat/checkers.lua index 3c9828f56e97..3dd083fd7ebb 100644 --- a/kong/clustering/compat/checkers.lua +++ b/kong/clustering/compat/checkers.lua @@ -23,6 +23,24 @@ end local compatible_checkers = { + { 3008000000, --[[ 3.8.0.0 ]] + function (config_table, dp_version, log_suffix) + local has_update + local adapter = require("kong.plugins.proxy-cache.clustering.compat.response_headers_translation").adapter + for _, plugin in ipairs(config_table.plugins or {}) do + if plugin.name == 'proxy-cache' then + has_update = adapter(plugin.config) + if has_update then + log_warn_message('adapts ' .. plugin.name .. ' plugin response_headers configuration to older version', + 'revert to older schema', + dp_version, log_suffix) + end + end + end + + return has_update + end + }, { 3007000000, --[[ 3.7.0.0 ]] function(config_table, dp_version, log_suffix) local has_update diff --git a/kong/plugins/proxy-cache/clustering/compat/response_headers_translation.lua b/kong/plugins/proxy-cache/clustering/compat/response_headers_translation.lua new file mode 100644 index 000000000000..56c602f23bb5 --- /dev/null +++ b/kong/plugins/proxy-cache/clustering/compat/response_headers_translation.lua @@ -0,0 +1,13 @@ +local function adapter(config_to_update) + if config_to_update.response_headers["Age"] ~= nil then + config_to_update.response_headers.age = config_to_update.response_headers["Age"] + config_to_update.response_headers["Age"] = nil + return true + end + + return false +end + +return { + adapter = adapter +} diff --git a/kong/plugins/proxy-cache/schema.lua b/kong/plugins/proxy-cache/schema.lua index 768e6f06975f..34efa9648b56 100644 --- a/kong/plugins/proxy-cache/schema.lua +++ b/kong/plugins/proxy-cache/schema.lua @@ -78,7 +78,7 @@ return { description = "Caching related diagnostic headers that should be included in cached responses", type = "record", fields = { - { age = {type = "boolean", default = true} }, + { ["Age"] = {type = "boolean", default = true} }, { ["X-Cache-Status"] = {type = "boolean", default = true} }, { ["X-Cache-Key"] = {type = "boolean", default = true} }, }, diff --git a/spec/02-integration/09-hybrid_mode/09-config-compat_spec.lua b/spec/02-integration/09-hybrid_mode/09-config-compat_spec.lua index 53d21bf08a0d..03867d030415 100644 --- a/spec/02-integration/09-hybrid_mode/09-config-compat_spec.lua +++ b/spec/02-integration/09-hybrid_mode/09-config-compat_spec.lua @@ -472,6 +472,46 @@ describe("CP/DP config compat transformations #" .. strategy, function() admin.plugins:remove({ id = response_rl.id }) end) end) + + describe("proxy-cache plugin", function() + it("rename age field in response_headers config from age to Age", function() + -- [[ 3.8.x ]] -- + local response_rl = admin.plugins:insert { + name = "proxy-cache", + enabled = true, + config = { + response_code = { 200, 301, 404 }, + request_method = { "GET", "HEAD" }, + content_type = { "text/plain", "application/json" }, + cache_ttl = 300, + strategy = "memory", + cache_control = false, + memory = { + dictionary_name = "kong_db_cache", + }, + -- [[ age field renamed to Age + response_headers = { + ["Age"] = true, + ["X-Cache-Status"] = true, + ["X-Cache-Key"] = true + } + -- ]] + } + } + + local expected_response_rl_prior_38 = cycle_aware_deep_copy(response_rl) + expected_response_rl_prior_38.config.response_headers = { + ["age"] = true, + ["X-Cache-Status"] = true, + ["X-Cache-Key"] = true + } + + do_assert(uuid(), "3.7.0", expected_response_rl_prior_38) + + -- cleanup + admin.plugins:remove({ id = response_rl.id }) + end) + end) end) describe("ai plugins", function() diff --git a/spec/03-plugins/31-proxy-cache/02-access_spec.lua b/spec/03-plugins/31-proxy-cache/02-access_spec.lua index 1dc0c5bb9305..665e23fade03 100644 --- a/spec/03-plugins/31-proxy-cache/02-access_spec.lua +++ b/spec/03-plugins/31-proxy-cache/02-access_spec.lua @@ -329,7 +329,7 @@ do content_type = { "text/plain", "application/json" }, [policy] = policy_config, response_headers = { - age = false, + ["Age"] = false, ["X-Cache-Status"] = false, ["X-Cache-Key"] = false },