Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: mock plugin support adding headers #9720

Merged
merged 9 commits into from
Jul 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. remove the core.log.warn?
  2. use ngx.header[key] = value instead? keep the same as line 227

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using core.response is more efficient.

end
end

if conf.delay > 0 then
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need a blank

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
Loading