Skip to main content

RequestValidationPlugin

Struct RequestValidationPlugin 

Source
pub struct RequestValidationPlugin {
    header_schema: Option<Validator>,
    body_schema: Option<Validator>,
    conditions: Option<Expr>,
    rejected_code: u16,
    rejected_msg: Option<Template>,
}
Expand description

Validates context.request headers and body against compiled JSON Schemas, and optionally evaluates boolean condition predicates on the request. On failure the request is rejected through the denied port with a JSON response using rejected_code.

Headers are validated as a single-value object (first value per header, names lowercased), matching the shape APISIX passes to its schema check. After a successful JSON-body validation the body is re-serialized from the parsed document, so the JSON that was validated is exactly the JSON the upstream receives (guards against JSON-interoperability smuggling).

Fields§

§header_schema: Option<Validator>§body_schema: Option<Validator>§conditions: Option<Expr>§rejected_code: u16§rejected_msg: Option<Template>

Fixed message returned instead of the validator’s error description. Supports {{namespace.path}} references (no legacy $var interpolation — this field never supported it, so this sweep must not start).

Implementations§

Source§

impl RequestValidationPlugin

Source

pub fn from_config(config: &HashMap<String, Value>) -> Result<Self, String>

Builds the plugin from node config.

Accepted keys:

  • header_schema (object): JSON Schema applied to the request headers, seen as {name: first_value} with lowercase names.
  • body_schema (object): JSON Schema applied to the parsed request body (JSON, or urlencoded decoded to a flat object).
  • conditions (array): a condition expression (see crate::vars::Expr) — rules ANDed at top level, nested AND/OR/NOT groups, JSONPath body subjects. Evaluated after the schemas; failure rejects like a schema failure with message “request conditions not satisfied”.
  • rejected_code (integer 200–599, default 400): response status for rejected requests.
  • rejected_msg (string): fixed message returned instead of the validator’s error description. Supports {{namespace.path}} references.

At least one of header_schema, body_schema, or conditions is required; schemas are compiled here so malformed schemas fail at config load.

type: request-validation
config:
  rejected_code: 422
  body_schema:
    type: object
    required: [name]
    properties:
      name: { type: string, minLength: 1 }
Source

fn reject( &self, ctx: Context, detail: String, ) -> Result<PluginOutput, PluginExecutionError>

Writes the rejection onto the response and routes the context through the node’s denied port.

Trait Implementations§

Source§

impl Debug for RequestValidationPlugin

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Plugin for RequestValidationPlugin

Source§

fn plugin_type(&self) -> &str

Unique identifier for the plugin type (e.g., “proxy-rewrite”, “upstream”). This is also the key its PortSpec is registered under in port_spec.
Source§

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,

Executes the plugin logic against the request/response context. Read more
Source§

fn reads_response_body(&self) -> bool

Whether this configured instance reads context.response.body. Read more
Source§

fn cache_target(&self) -> Option<CacheTarget>

The cache backend this node writes to, if it is a proxy-cache half. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
§

impl<T> MaybeSend for T

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more