pub struct ResponseRewritePlugin {
status_code: Option<u16>,
body: Option<Bytes>,
filters: Vec<BodyFilter>,
add_headers: Vec<(String, String)>,
set_headers: Vec<(String, String)>,
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 $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<Bytes>Replacement body, already base64-decoded when body_base64 was set.
filters: Vec<BodyFilter>§add_headers: Vec<(String, String)>§set_headers: Vec<(String, String)>§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). -
body_base64(bool, defaultfalse): when true,bodyis decoded from base64 at config load; 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$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),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 execute<'life0, 'life1, 'async_trait>(
&'life0 self,
ctx: Context,
_named_inputs: &'life1 HashMap<String, Value>,
) -> Pin<Box<dyn Future<Output = Result<PluginOutput, PluginExecutionError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn execute<'life0, 'life1, 'async_trait>(
&'life0 self,
ctx: Context,
_named_inputs: &'life1 HashMap<String, Value>,
) -> Pin<Box<dyn Future<Output = Result<PluginOutput, PluginExecutionError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Auto Trait Implementations§
impl !Freeze for ResponseRewritePlugin
impl RefUnwindSafe for ResponseRewritePlugin
impl Send for ResponseRewritePlugin
impl Sync for ResponseRewritePlugin
impl Unpin for ResponseRewritePlugin
impl UnsafeUnpin for ResponseRewritePlugin
impl UnwindSafe 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