ヘッダ 'asdf:asdf' がなければ 400 をレスポンスするプラグインを書いてみた。
- ヘッダ を参照するには
- 400をレスポンスするには
ソース
/kong-plugin/kong/plugins/myplugin/handler.lua
local plugin_name = ({...})[1]:match("^kong%.plugins%.([^%.]+)")
local plugin = require("kong.plugins.base_plugin"):extend()
local kong = kong
plugin.PRIORITY = 1000
function plugin:new()
plugin.super.new(self, plugin_name)
end
function plugin:access(plugin_conf)
plugin.super.access(self)
-- your custom code here
local v = kong.request.get_header("asdf")
if not v then
return kong.response.exit(400, { message = "asdf is empty" })
end
if v ~= "asdf" then
return kong.response.exit(401, { message = "asdf is not asdf" })
end
end
return plugin
/kong-plugin/spec/myplugin/01-access_spec.lua
:
describe("request", function()
it("gets 200", function()
local r = assert(client:send {
method = "GET",
path = "/request", -- makes mockbin return the entire request
headers = {
host = "test1.com",
asdf = "asdf"
}
})
assert.response(r).has.status(200)
end)
end)
describe("request", function()
it("gets 400", function()
local r = assert(client:send {
method = "GET",
path = "/request", -- makes mockbin return the entire request
headers = {
host = "test1.com"
}
})
assert.response(r).has.status(400)
end)
end)
describe("request", function()
it("gets 401", function()
local r = assert(client:send {
method = "GET",
path = "/request", -- makes mockbin return the entire request
headers = {
host = "test1.com",
asdf = "qwer"
}
})
assert.response(r).has.status(409) <--- Failure
end)
end)
:
lint
lint は luacheckで。typo してみた。
vagrant@ubuntu-bionic:/kong-plugin$ luacheck .
Checking kong/plugins/myplugin/handler.lua 1 error
kong/plugins/myplugin/handler.lua:66:12: expected 'then' near 'theeeen'
Checking kong/plugins/myplugin/schema.lua OK
Checking spec/myplugin/01-access_spec.lua 2 warnings
spec/myplugin/01-access_spec.lua:21:13: unused variable bp
spec/myplugin/01-access_spec.lua:21:17: unused variable route1
Total: 2 warnings / 1 error in 3 files
typo 修正後
vagrant@ubuntu-bionic:/kong-plugin$ luacheck .
Checking kong/plugins/myplugin/handler.lua OK
Checking kong/plugins/myplugin/schema.lua OK
Checking spec/myplugin/01-access_spec.lua 2 warnings
spec/myplugin/01-access_spec.lua:21:13: unused variable bp
spec/myplugin/01-access_spec.lua:21:17: unused variable route1
Total: 2 warnings / 0 errors in 3 files
テスト
テストは bin/busted 。
$ cd /kong
$ bin/busted /kong-plugin/spec
●●◼●●◼
4 successes / 2 failures / 0 errors / 0 pending : 13.785849 seconds
Failure → /kong-plugin/spec/myplugin/01-access_spec.lua @ 109
myplugin: (access) [#postgres] request gets 401
/kong-plugin/spec/myplugin/01-access_spec.lua:118: Invalid response status code.
Status expected:
(number) 409
Status received:
(number) 401
Body:
(string) '{"message":"asdf is not asdf"}'
409
Failure → /kong-plugin/spec/myplugin/01-access_spec.lua @ 109
myplugin: (access) [#cassandra] request gets 401
/kong-plugin/spec/myplugin/01-access_spec.lua:118: Invalid response status code.
Status expected:
(number) 409
Status received:
(number) 401
Body:
(string) '{"message":"asdf is not asdf"}'
409
動かしてみる
make し kong 起動
$ cd /kong $ make dev $ bin/kong start
ヘッダ asdf なし
$ curl -i http://localhost:8000
HTTP/1.1 400 Bad Request
Date: Fri, 04 Oct 2019 12:05:11 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Content-Length: 27
Server: kong/1.3.0
{"message":"asdf is empty"}
ヘッダ asdf:zxcv
$ curl -i -H "asdf:zxvc" http://localhost:8000
HTTP/1.1 401 Unauthorized
Date: Fri, 04 Oct 2019 12:07:34 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Content-Length: 30
Server: kong/1.3.0
{"message":"asdf is not asdf"}
$ curl -i -H "asdf:asdf" http://localhost:8000 HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Content-Length: 967 Connection: keep-alive Server: openresty/1.15.8.2 Date: Fri, 04 Oct 2019 12:08:12 GMT :
kong、なんとかなるものだな。