Skip to content

Commit

Permalink
feat: mock plugin support adding headers (apache#9720)
Browse files Browse the repository at this point in the history
  • Loading branch information
shreemaan-abhishek authored Jul 13, 2023
1 parent 99debad commit 1be5d2c
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 1 deletion.
20 changes: 19 additions & 1 deletion apisix/plugins/mocking.lua
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,19 @@ local schema = {
-- specify response json schema, if response_example is not nil, this conf will be ignore.
-- generate random response by json schema.
response_schema = { type = "object" },
with_mock_header = { type = "boolean", default = true }
with_mock_header = { type = "boolean", default = true },
response_headers = {
type = "object",
minProperties = 1,
patternProperties = {
["^[^:]+$"] = {
oneOf = {
{ type = "string" },
{ type = "number" }
}
}
},
}
},
anyOf = {
{ required = { "response_example" } },
Expand Down Expand Up @@ -215,6 +227,12 @@ function _M.access(conf, ctx)
ngx.header["x-mock-by"] = "APISIX/" .. core.version.VERSION
end

if conf.response_headers then
for key, value in pairs(conf.response_headers) do
core.response.add_header(key, value)
end
end

if conf.delay > 0 then
ngx.sleep(conf.delay)
end
Expand Down
1 change: 1 addition & 0 deletions docs/en/latest/plugins/mocking.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ The `mocking` Plugin is used for mocking an API. When executed, it returns rando
| response_example | string | False | | Body of the response, support use variables, like `$remote_addr $consumer_name`. |
| response_schema | object | False | | The JSON schema object for the response. Works when `response_example` is unspecified. |
| with_mock_header | boolean | False | true | When set to `true`, adds a response header `x-mock-by: APISIX/{version}`. |
| response_headers | object | false | | Headers to be added in the mocked response. Example: `{"X-Foo": "bar", "X-Few": "baz"}`|

The JSON schema supports the following types in their fields:

Expand Down
1 change: 1 addition & 0 deletions docs/zh/latest/plugins/mocking.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ description: 本文介绍了关于 Apache APISIX `mocking` 插件的基本信息
| response_example| string || | 返回响应的 Body,支持使用变量,例如 `$remote_addr $consumer_name`,与 `response_schema` 字段二选一。 |
| response_schema | object || | 指定响应的 `jsonschema` 对象,未指定 `response_example` 字段时生效。 |
| with_mock_header| boolean|| true | 当设置为 `true` 时,将添加响应头 `x-mock-by: APISIX/{version}`。设置为 `false` 时则不添加该响应头。 |
| response_headers| object || | 要在模拟响应中添加的标头。示例:`{"X-Foo": "bar", "X-Few": "baz"}` |

JSON Schema 在其字段中支持以下类型:

Expand Down
41 changes: 41 additions & 0 deletions t/plugin/mocking.t
Original file line number Diff line number Diff line change
Expand Up @@ -424,3 +424,44 @@ passed
GET /hello
--- response_body chomp
empty_var:
=== TEST 19: set route (return headers)
--- 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": {
"mocking": {
"response_example": "hello world",
"response_headers": {
"X-Apisix": "is, cool",
"X-Really": "yes"
}
}
},
"uri": "/hello"
}]]
)
if code >= 300 then
ngx.status = code
end
ngx.say(body)
}
}
--- response_body
passed
=== TEST 20: hit route
--- request
GET /hello
--- response_headers
X-Apisix: is, cool
X-Really: yes

0 comments on commit 1be5d2c

Please sign in to comment.