Skip to main content

request-validation

The request-validation Plugin validates incoming requests before they are forwarded to the Upstream service. This Plugin leverages JSON Schema to enforce validation rules on headers and body content.

Attributes

NameTypeRequiredDefaultValid valuesDescription
header_schemaobjectFalseDefines schema validation for request headers.
body_schemaobjectFalseDefines schema validation for the request body.
rejected_codeintegerFalse400[200,...,599]HTTP status code to return when validation fails.
rejected_msgstringFalseCustom message to return when validation fails.
note

At least one of header_schema or body_schema must be specified.

Enable Plugin

You can enable the request-validation Plugin on a Route as shown below.

Step 1: Retrieve the Admin Key

Retrieve the admin_key from config.yaml and save it as an environment variable:

admin_key=$(yq '.deployment.admin.admin_key[0].key' conf/config.yaml | sed 's/"//g')

Step 2: Configure the Plugin

Enable the Plugin with a sample schema for body validation:

curl http://127.0.0.1:9180/api/stargate/v1/routes/5 \
-H "X-API-KEY: $admin_key" -X PUT -d '
{
"uri": "/get",
"plugins": {
"request-validation": {
"body_schema": {
"type": "object",
"required": ["required_payload"],
"properties": {
"required_payload": {"type": "string"},
"boolean_payload": {"type": "boolean"}
}
},
"rejected_msg": "Custom rejection message"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:8080": 1
}
}
}'

Example Scenarios

Enum Validation

Define a schema to validate specific string values:

{
"body_schema": {
"type": "object",
"required": ["enum_payload"],
"properties": {
"enum_payload": {
"type": "string",
"enum": ["value1", "value2"],
"default": "value1"
}
}
}
}

Header Validation

Define a schema to validate request headers, such as enforcing Content-Type:

{
"header_schema": {
"type": "object",
"required": ["Content-Type"],
"properties": {
"Content-Type": {
"type": "string",
"pattern": "^application/json$"
}
}
}
}

Regular Expression Validation

Define a schema to validate string patterns:

{
"body_schema": {
"type": "object",
"required": ["regex_payload"],
"properties": {
"regex_payload": {
"type": "string",
"minLength": 1,
"maxLength": 32,
"pattern": "^[a-zA-Z0-9_]+$"
}
}
}
}

Array Validation

Define a schema to validate arrays with unique integer values:

{
"body_schema": {
"type": "object",
"required": ["array_payload"],
"properties": {
"array_payload": {
"type": "array",
"minItems": 1,
"items": {
"type": "integer",
"minimum": 200,
"maximum": 599
},
"uniqueItems": true,
"default": [200, 302]
}
}
}
}

Example Usage

After configuring the Plugin, valid requests are forwarded to the Upstream service, while invalid ones are rejected.

Valid Request Example:

curl --header "Content-Type: application/json" \
--request POST \
--data '{"required_payload":"hello","boolean_payload":true}' \
http://127.0.0.1:9080/get

Invalid Request Example:
If required_payload is missing, the request is rejected with the configured status code and message:

curl --header "Content-Type: application/json" \
--request POST \
--data '{"boolean_payload":true}' \
http://127.0.0.1:9080/get

Delete Plugin

To remove the request-validation Plugin, delete its configuration. Stargate reloads changes automatically without requiring a restart:

curl http://127.0.0.1:9180/api/stargate/v1/routes/5 \
-H "X-API-KEY: $admin_key" -X PUT -d '
{
"uri": "/get",
"plugins": {},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:8080": 1
}
}
}'