# # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # use t::APISIX 'no_plan'; log_level('debug'); repeat_each(1); no_long_string(); no_root_location(); run_tests; __DATA__ === TEST 1: sanity --- config location /t { content_by_lua_block { local plugin = require("apisix.plugins.request-validation") local ok, err = plugin.check_schema({body_schema = {}}) if not ok then ngx.say(err) end ngx.say("done") } } --- request GET /t --- response_body done --- no_error_log [error] === TEST 2: missing schema for header and body --- config location /t { content_by_lua_block { local plugin = require("apisix.plugins.request-validation") local ok, err = plugin.check_schema({}) if not ok then ngx.say(err) end ngx.say("done") } } --- request GET /t --- response_body_like eval qr/object matches none of the requireds/ --- no_error_log [error] === TEST 3: add plugin with all combinations --- config location /t { content_by_lua_block { local json = require("toolkit.json") local t = require("lib.test_admin").test local data = { plugins = { ["request-validation"] = { body_schema = { type = "object", required = { "required_payload" }, properties = { required_payload = { type = "string" }, boolean_payload = { type = "boolean" }, timeouts = { type = "integer", minimum = 1, maximum = 254, default = 3 }, req_headers = { type = "array", minItems = 1, items = { type = "string" } } } } } }, upstream = { nodes = { ["127.0.0.1:1982"] = 1 }, type = "roundrobin" }, uri = "/opentracing" } local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, json.encode(data) ) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 4: required payload missing --- config location /t { content_by_lua_block { local http = require "resty.http" local httpc = http.new() local uri = "http://127.0.0.1:" .. ngx.var.server_port .. "/opentracing" local res, err = httpc:request_uri(uri, { method = "POST", body = '{"boolean-payload": true}', headers = { ["Content-Type"] = "application/json", } }) if res.status == 400 then ngx.say("required field missing") else ngx.say("failed") end } } --- request GET /t --- response_body required field missing --- error_log property "required_payload" is required === TEST 5: required payload added --- config location /t { content_by_lua_block { local http = require "resty.http" local httpc = http.new() local uri = "http://127.0.0.1:" .. ngx.var.server_port .. "/opentracing" local res, err = httpc:request_uri(uri, { method = "POST", body = '{"boolean-payload": true,' .. '"required_payload": "hello"}', headers = { ["Content-Type"] = "application/json", } }) if res.status == 200 then ngx.say("hello1 world") else ngx.say("failed") end } } --- request GET /t --- response_body hello1 world --- no_error_log === TEST 6: Add plugin with header_schema --- config location /t { content_by_lua_block { local json = require("toolkit.json") local t = require("lib.test_admin").test local data = { plugins = { ["request-validation"] = { header_schema = { type = "object", required = { "required_payload" }, properties = { required_payload = { type = "string" }, boolean_payload = { type = "boolean" }, timeouts = { type = "integer", minimum = 1, maximum = 254, default = 3 }, req_headers = { type = "array", minItems = 1, items = { type = "string" } } } } } }, upstream = { nodes = { ["127.0.0.1:1982"] = 1 }, type = "roundrobin" }, uri = "/opentracing" } local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, json.encode(data) ) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 7: required header payload missing --- config location /t { content_by_lua_block { local http = require "resty.http" local httpc = http.new() local uri = "http://127.0.0.1:" .. ngx.var.server_port .. "/opentracing" local res, err = httpc:request_uri(uri, { method = "GET", headers = { ["Content-Type"] = "application/json" } }) if res.status == 400 then ngx.say("required field missing") else ngx.say("failed") end } } --- request GET /t --- response_body required field missing --- error_log property "required_payload" is required === TEST 8: required header added in header --- config location /t { content_by_lua_block { local http = require "resty.http" local httpc = http.new() local uri = "http://127.0.0.1:" .. ngx.var.server_port .. "/opentracing" local res, err = httpc:request_uri(uri, { method = "GET", headers = { ["Content-Type"] = "application/json", ["required_payload"] = "test payload" } }) if res.status == 200 then ngx.say("hello1 world") else ngx.say("failed") end } } --- request GET /t --- response_body hello1 world --- no_error_log [error] === TEST 9: add route (test request validation `body_schema`) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "body_schema": { "type": "object", "required": ["required_payload"], "properties": { "required_payload": {"type": "string"}, "boolean_payload": {"type": "boolean"}, "timeouts": { "type": "integer", "minimum": 1, "maximum": 254, "default": 3 }, "req_headers": { "type": "array", "minItems": 1, "items": { "type": "string" } } } } } },]] .. [[ "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 10: add route (test request validation `body_schema.type` is object) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "body_schema": { "type": "object" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 11: add route (test request validation `body_schema.type` is array) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "body_schema": { "type": "array" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 12: add route (test request validation `body_schema.type` is string) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "body_schema": { "type": "string" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 13: add route (test request validation `body_schema.type` is number) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "body_schema": { "type": "number" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 14: add route (test request validation `body_schema.type` is integer) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "body_schema": { "type": "integer" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 15: add route (test request validation `body_schema.type` is table) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "body_schema": { "type": "table" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 16: add route (test request validation `body_schema.type` is function) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "body_schema": { "type": "function" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 17: add route (test request validation `body_schema.type` failure) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "body_schema": { "type": "test" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body_like eval qr/invalid JSON type: test/ --- error_code chomp 400 --- no_error_log [error] === TEST 18: add route (test request validation `body_schema.enum` failure) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "body_schema": { "type": "string", "properties": { "test": { "type": "string", "enum": "test-enum" } } } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body_like eval qr/table expected, got string/ --- error_code chomp 400 --- no_error_log [error] === TEST 19: add route (test request validation `body_schema.enum` success) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "body_schema": { "type": "string", "properties": { "test": { "type": "string", "enum": ["a", "b", "c"] } } } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 20: add route (test request validation `body_schema.required` failure) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "body_schema": { "type": "object", "properties": { "test": { "type": "string", "enum": ["a", "b", "c"] } }, "required": "test-required" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body_like eval qr/table expected, got string/ --- error_code chomp 400 --- no_error_log [error] === TEST 21: add route (test request validation `body_schema.required` success) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "body_schema": { "type": "object", "properties": { "test": { "type": "string", "enum": ["a", "b", "c"] } }, "required": ["test"] } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 22: add route (test request validation `header_schema`) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "header_schema": { "type": "object", "required": ["required_payload"], "properties": { "required_payload": {"type": "string"}, "boolean_payload": {"type": "boolean"}, "timeouts": { "type": "integer", "minimum": 1, "maximum": 254, "default": 3 }, "req_headers": { "type": "array", "minItems": 1, "items": { "type": "string" } } } } } },]] .. [[ "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 23: add route (test request validation `header_schema.type` is object) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "header_schema": { "type": "object" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 24: add route (test request validation `header_schema.type` is array) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "header_schema": { "type": "array" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 25: add route (test request validation `header_schema.type` is string) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "header_schema": { "type": "string" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 26: add route (test request validation `header_schema.type` is number) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "header_schema": { "type": "number" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 27: add route (test request validation `header_schema.type` is integer) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "header_schema": { "type": "integer" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 28: add route (test request validation `header_schema.type` is table) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "header_schema": { "type": "table" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 29: add route (test request validation `header_schema.type` is function) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "header_schema": { "type": "function" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 30: add route (test request validation `header_schema.type` failure) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "header_schema": { "type": "test" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body_like eval qr/invalid JSON type: test/ --- error_code chomp 400 --- no_error_log [error] === TEST 31: add route (test request validation `header_schema.enum` failure) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "header_schema": { "type": "string", "properties": { "test": { "type": "string", "enum": "test-enum" } } } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body_like eval qr/table expected, got string/ --- error_code chomp 400 --- no_error_log [error] === TEST 32: add route (test request validation `header_schema.enum` success) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "header_schema": { "type": "string", "properties": { "test": { "type": "string", "enum": ["a", "b", "c"] } } } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 33: add route (test request validation `header_schema.required` failure) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "header_schema": { "type": "object", "properties": { "test": { "type": "string", "enum": ["a", "b", "c"] } }, "required": "test-required" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body_like eval qr/table expected, got string/ --- error_code chomp 400 --- no_error_log [error] === TEST 34: add route (test request validation `header_schema.required` success) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "header_schema": { "type": "object", "properties": { "test": { "type": "string", "enum": ["a", "b", "c"] } }, "required": ["test"] } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 35: add route (test request validation `header_schema.required` success with custom reject message) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "header_schema": { "type": "object", "properties": { "test": { "type": "string", "enum": ["a", "b", "c"] } }, "required": ["test"] }, "rejected_msg": "customize reject message for header_schema.required" } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/opentracing" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 36: use empty header to hit `header_schema.required with custom reject message` rule --- request GET /opentracing --- error_code: 400 --- response_body chomp customize reject message for header_schema.required --- error_log eval qr/schema validation failed/ === TEST 37: use bad header value to hit `header_schema.required with custom reject message` rule --- request GET /opentracing --- more_headers test: abc --- error_code: 400 --- response_body chomp customize reject message for header_schema.required --- error_log eval qr/schema validation failed/ === TEST 38: pass `header_schema.required with custom reject message` rule --- request GET /opentracing --- more_headers test: a --- error_code: 200 --- response_body eval qr/opentracing/ --- no_error_log [error] === TEST 39: add route (test request validation `body_schema.required` success with custom reject message) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "body_schema": { "type": "object", "properties": { "test": { "type": "string", "enum": ["a", "b", "c"] } }, "required": ["test"] }, "rejected_msg": "customize reject message for body_schema.required" } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/opentracing" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 40: use empty body to hit `body_schema.required with custom reject message` rule --- request GET /opentracing --- error_code: 400 --- response_body chomp customize reject message for body_schema.required --- no_error_log [error] === TEST 41: use bad body value to hit `body_schema.required with custom reject message` rule --- request POST /opentracing {"test":"abc"} --- error_code: 400 --- response_body chomp customize reject message for body_schema.required --- error_log eval qr/schema validation failed/ === TEST 42: pass `body_schema.required with custom reject message` rule --- request POST /opentracing {"test":"a"} --- error_code: 200 --- response_body eval qr/opentracing/ --- no_error_log [error] === TEST 43: add route (test request validation `header_schema.required` failure with custom reject message) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "header_schema": { "type": "object", "properties": { "test": { "type": "string", "enum": ["a", "b", "c"] } }, "required": ["test"] }, "rejected_msg": "customize reject message customize reject message customize reject message customize reject message customize reject message customize reject message customize reject message customize reject message customize reject message customize reject message customize reject message" } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body_like eval qr/string too long/ --- error_code: 400 --- no_error_log [error] === TEST 44: add route (test request validation schema with custom reject message only) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "rejected_msg": "customize reject message" } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body_like eval qr/object matches none of the requireds/ --- error_code: 400 --- no_error_log [error] === TEST 45: add route (test request validation `body_schema.required` success with custom reject code) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "body_schema": { "type": "object", "properties": { "test": { "type": "string", "enum": ["a", "b", "c"] } }, "required": ["test"] }, "rejected_code": 505 } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/opentracing" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body passed --- no_error_log [error] === TEST 46: use empty body to hit custom rejected code rule --- request GET /opentracing --- error_code: 505 --- no_error_log [error] === TEST 47: use bad body value to hit custom rejected code rule --- request POST /opentracing {"test":"abc"} --- error_code: 505 --- error_log eval qr/schema validation failed/ === TEST 48: pass custom rejected code rule --- request POST /opentracing {"test":"a"} --- error_code: 200 --- response_body eval qr/opentracing/ --- no_error_log [error] === TEST 49: add route (test request validation `header_schema.required` failure with custom reject code) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "header_schema": { "type": "object", "properties": { "test": { "type": "string", "enum": ["a", "b", "c"] } }, "required": ["test"] }, "rejected_code": 10000 } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body_like eval qr/expected 10000 to be smaller than 599/ --- error_code: 400 --- no_error_log [error] === TEST 50: add route (test request validation schema with custom reject code only) --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "request-validation": { "rejected_code": 505 } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/plugin/request/validation" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- request GET /t --- response_body_like eval qr/object matches none of the requireds/ --- error_code: 400 --- no_error_log [error]