Background Currently, response-rewrite plugin only supports set / delete headers. The limitation makes some operations impossible. For example, we can't add a Set-Cookie header in APISIX as it may override the Set-Cookie header from the upstream. Therefore, we need a way to add a header without overriding the existing one.
Solution We can enrich the headers field and add the operation name to it. Here is the new configuration schema: headers = { description = "new headers for response", anyOf = { { type = "object", minProperties = 1, patternProperties = { ["^[^:]+$"] = { oneOf = { {type = "string"}, {type = "number"}, } } }, }, { properties = { add = { type = "array", minItems = 1, items = { type = "string", -- "Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<number>" pattern = "^[^:]+:[^:]+$" } }, set = { type = "object", minProperties = 1, patternProperties = { ["^[^:]+$"] = { oneOf = { {type = "string"}, {type = "number"}, } } }, }, remove = { type = "array", minItems = 1, items = { type = "string", -- "Set-Cookie" pattern = "^[^:]+$" } }, } } } }, set means rewriting the headers, remove means removing the headers, addmeans appending the new headers. For set and add, the header format is "name: value", while for remove, the format is "name". We use array to represent multiple headers, so the same header can be used multiple times in the add. For example, add = { "Cache-Control: no-cache", "Cache-Control: max-age=0, must-revalidate" } The previous configuration can be migrated as part of the new configuration. The execution order among those operations are ["add", "set", "remove"]. Inspired by: https://istio.io/latest/docs/reference/config/networking/virtual-service/#Headers-HeaderOperations https://docs.konghq.com/hub/kong-inc/response-transformer/