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 3 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
19 changes: 18 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,11 @@ 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
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"
Copy link
Contributor

Choose a reason for hiding this comment

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

What happens if you set 2 identical response headers? Add a test case

Copy link
Contributor Author

Choose a reason for hiding this comment

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

What do you mean by "identical response headers"?

Copy link
Contributor

Choose a reason for hiding this comment

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

                                   "response_headers": {
                                        "X-Apisix": "is-cool",
                                        "X-Apisix": "yes"
                                    }
                               }

Copy link
Contributor Author

Choose a reason for hiding this comment

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

  1. Only the last one is retained, the first one is lost. However, if someone needs multiple values for a header they can do "header-name": "val1, val2".

  2. Why is this test case needed?

Copy link
Contributor

Choose a reason for hiding this comment

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

You could test, I don't think you are right.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I don't think you are right.

Well, you can give it a try on your local machine 😀

P.S.: I pushed a new commit that would demonstrate the addition of multiple values for a header.

Copy link
Contributor

@monkeyDluffy6017 monkeyDluffy6017 Jul 10, 2023

Choose a reason for hiding this comment

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

I said this because you use the function core.response.add_header to add the response header, the function will append the value to the same header name, but i tested locally, and found that the conf.response_headers won't pass the duplicated headers.
If we pass

                                   "response_headers": {
                                        "X-Apisix": "is-cool",
                                        "X-Apisix": "yes"
                                    }

we will get

                                   "response_headers": {
                                        "X-Apisix": "yes"
                                    }

So it's ok for this.
But i don't see you example

}
}
},
"uri": "/hello"
}]]
)

if code >= 300 then
ngx.status = code
end
ngx.say(body)
}
}
--- response_body
passed



=== TEST 20: hit route(return response example:"hello world")
--- request
GET /hello
--- response_headers
X-Apisix: is-cool
X-Really: yes