pub struct ResponseRewritePlugin {
status_code: Option<u16>,
body: Option<ResponseBody>,
filters: Vec<BodyFilter>,
add_headers: Vec<(String, Template)>,
set_headers: Vec<(String, Template)>,
remove_headers: Vec<String>,
vars: Option<Expr>,
}Expand description
Rewrites Context.response: optionally forces a status code, replaces the
body (with optional base64-decoded config content), applies regex filters
to the body, and adds/sets/removes headers with {{namespace.path}}
references plus legacy $var interpolation in header values. An optional
vars expression gates the whole node — when present and false the node
is a pure passthrough. This plugin never fails at execution time.
Fields§
§status_code: Option<u16>§body: Option<ResponseBody>Replacement body. The plain-text form is a {{namespace.path}}
template rendered per request; a body_base64 body is decoded once
at config load and used verbatim — it is opaque binary content
(images, protobufs, …), not text, so it is never templated.
filters: Vec<BodyFilter>§add_headers: Vec<(String, Template)>Header name → value template; supports {{namespace.path}}
references and legacy $var interpolation (see
Template::render_with_legacy).
set_headers: Vec<(String, Template)>Same rendering as add_headers.
remove_headers: Vec<String>§vars: Option<Expr>Implementations§
Source§impl ResponseRewritePlugin
impl ResponseRewritePlugin
Sourcepub fn from_config(config: &HashMap<String, Value>) -> Result<Self, String>
pub fn from_config(config: &HashMap<String, Value>) -> Result<Self, String>
Builds the plugin from node config.
Accepted keys (all optional):
-
status_code(integer, 200-598): new response status code. -
body(string): new response body. Wins overfilters— configuring both is rejected (as in APISIX). Supports{{namespace.path}}references, rendered per request — unlessbody_base64is set (see below), in which case it is opaque binary content and is never templated. -
body_base64(bool, defaultfalse): when true,bodyis decoded from base64 at config load and used verbatim as fixed bytes on every request (never templated — a base64 body is binary content such as an image, not text); invalid or empty base64 content fails here. -
headers— either the structured shape or the deprecated flat map:add(array of"Name: value"strings): appended alongside existing values. The value must be non-empty and colon-free.set(map{name: value}): replaces existing values. Values may be strings or numbers.remove(array of names): deleted.- flat map
{name: value}(deprecated): treated asset.
add/setvalues support{{namespace.path}}references plus legacy$var/${var}interpolation at execution time (e.g.$remote_addr,$status,$http_x_id). -
filters(array): regex substitutions applied to the response body. Each entry:regex(required, non-empty),replace(required; supports{{namespace.path}}references, rendered before the regex engine applies its own$1/$2capture-group substitution, so those stay untouched by templating),scope(once|global, defaultonce),options(only"i"for case-insensitive; anything else is rejected). Regexes are compiled here, so invalid patterns fail at config load. -
vars(array, APISIX triple-array expression): gate — when present and it evaluates to false, the node passes the context through unchanged.
type: response-rewrite
config:
status_code: 200
headers:
set:
x-server-id: "3"
add:
- "x-trace: $http_x_request_id"
remove: [x-powered-by]
filters:
- regex: "X-Amzn-"
scope: global
replace: ""
vars:
- ["status", "==", "200"]Sourcefn apply_filters(&self, ctx: &mut Context)
fn apply_filters(&self, ctx: &mut Context)
Runs the configured regex filters against the response body, decoding a content-encoded body first. On any obstacle (unsupported encoding, corrupt compressed data, non-UTF-8 body) it logs a warning and leaves the response untouched, matching APISIX’s “filters may not work as expected” behavior.
Trait Implementations§
Source§impl Plugin for ResponseRewritePlugin
impl Plugin for ResponseRewritePlugin
Source§fn plugin_type(&self) -> &str
fn plugin_type(&self) -> &str
Source§fn reads_response_body(&self) -> bool
fn reads_response_body(&self) -> bool
context.response.body. Read moreSource§fn execute<'life0, 'async_trait>(
&'life0 self,
ctx: Context,
) -> Pin<Box<dyn Future<Output = Result<PluginOutput, PluginExecutionError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn execute<'life0, 'async_trait>(
&'life0 self,
ctx: Context,
) -> Pin<Box<dyn Future<Output = Result<PluginOutput, PluginExecutionError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn cache_target(&self) -> Option<CacheTarget>
fn cache_target(&self) -> Option<CacheTarget>
proxy-cache half. Read moreAuto Trait Implementations§
impl !Freeze for ResponseRewritePlugin
impl !RefUnwindSafe for ResponseRewritePlugin
impl !UnwindSafe for ResponseRewritePlugin
impl Send for ResponseRewritePlugin
impl Sync for ResponseRewritePlugin
impl Unpin for ResponseRewritePlugin
impl UnsafeUnpin for ResponseRewritePlugin
Blanket Implementations§
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more