# # 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'; no_long_string(); no_root_location(); add_block_preprocessor(sub { my ($block) = @_; if (! $block->request) { $block->set_value("request", "GET /t"); if (!$block->response_body) { $block->set_value("response_body", "passed\n"); } } }); run_tests; __DATA__ === TEST 1: add plugin with 'include_resp_body' setting --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test -- delete plugin metadata for response body format t('/apisix/admin/plugin_metadata/file-logger', ngx.HTTP_DELETE) local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "file-logger": { "path": "file-with-resp-body.log", "include_resp_body": true } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/hello" }]] ) if code >= 300 then ngx.status = code end ngx.say(body) } } === TEST 2: verify plugin for file-logger with response --- config location /t { content_by_lua_block { local core = require("apisix.core") local t = require("lib.test_admin").test local code = t("/hello", ngx.HTTP_GET) local fd, err = io.open("file-with-resp-body.log", 'r') local msg if not fd then core.log.error("failed to open file: file-resp-check.log, error info: ", err) return end -- note only for first line msg = fd:read() local new_msg = core.json.decode(msg) ngx.status = code if new_msg.response ~= nil and new_msg.response.body == "hello world\n" then ngx.status = code ngx.say('contain with target') end } } --- response_body contain with target === TEST 3: check file-logger 'include_resp_body' with 'expr' --- 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": { "file-logger": { "path": "file-with-resp-expr-body.log", "include_resp_body": true, "include_resp_body_expr": [ [ "arg_foo", "==", "bar" ] ] } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/hello" }]] ) if code >= 300 then ngx.status = code end ngx.say(body) } } === TEST 4: verify file-logger resp with expression of concern --- config location /t { content_by_lua_block { local core = require("apisix.core") local t = require("lib.test_admin").test local code = t("/hello?foo=bar", ngx.HTTP_GET) local fd, err = io.open("file-with-resp-expr-body.log", 'r') local msg if not fd then core.log.error("failed to open file: file-with-resp-expr-body.log, error info: ", err) return end -- note only for first line msg = fd:read() local new_msg = core.json.decode(msg) ngx.status = code if new_msg.response ~= nil and new_msg.response.body == "hello world\n" then ngx.status = code ngx.say('contain target body hits with expr') end --- a new request is logged t("/hello?name=pix", ngx.HTTP_GET) msg = fd:read("*l") local new_msg = core.json.decode(msg) if new_msg.response.body == nil then ngx.say('skip unconcern body') end } } --- response_body contain target body hits with expr skip unconcern body === TEST 5: add plugin metadata --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test local code, body = t('/apisix/admin/plugin_metadata/file-logger', ngx.HTTP_PUT, [[{ "log_format": { "host": "$host", "client_ip": "$remote_addr", "resp_body": "$resp_body" } }]] ) if code >= 300 then ngx.status = code end ngx.say(body) } } --- response_body passed === TEST 6: add plugin --- 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": { "file-logger": { "path": "file-with-resp-body2.log", "include_resp_body": true } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/hello" }]] ) if code >= 300 then ngx.status = code end ngx.say(body) } } --- response_body passed === TEST 7: verify plugin --- config location /t { content_by_lua_block { local core = require("apisix.core") local t = require("lib.test_admin").test local code = t("/hello", ngx.HTTP_GET) local fd, err = io.open("file-with-resp-body2.log", 'r') local msg if not fd then core.log.error("failed to open file: file.log, error info: ", err) return end msg = fd:read() local new_msg = core.json.decode(msg) if new_msg.resp_body == 'hello world\n' then msg = "write file log success" ngx.status = code ngx.say(msg) end } } --- response_body write file log success === TEST 8: Add new configuration with match --- 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": { "file-logger": { "path": "file-with-match.log", "match": [ [ [ "arg_name","==","jack" ] ] ], "log_format": { "request": "$request" } } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/hello" }]] ) if code >= 300 then ngx.status = code end ngx.say(body) } } --- response_body passed === TEST 9: Request match --- config location /t { content_by_lua_block { local core = require("apisix.core") local t = require("lib.test_admin").test local code = t("/hello?name=jack", ngx.HTTP_GET) local fd, err = io.open("file-with-match.log", 'r') if not fd then core.log.error("failed to open file: file-with-match.log, error info: ", err) return end local msg = fd:read() local new_msg = core.json.decode(msg) if new_msg.request == 'GET /hello?name=jack HTTP/1.1' and new_msg.route_id == '1' then msg = "write file log success" ngx.status = code ngx.say(msg) end os.remove("file-with-match.log") } } --- response_body write file log success === TEST 10: Request not match --- config location /t { content_by_lua_block { local core = require("apisix.core") local t = require("lib.test_admin").test local code = t("/hello?name=tony", ngx.HTTP_GET) local fd, err = io.open("file-with-match.log", 'r') if not fd then local msg = "not write file log" ngx.say(msg) return end } } --- response_body not write file log === TEST 11: add plugin with 'include_req_body' setting --- config location /t { content_by_lua_block { local t = require("lib.test_admin").test t('/apisix/admin/plugin_metadata/file-logger', ngx.HTTP_DELETE) local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ "plugins": { "file-logger": { "path": "file-with-req-body.log", "include_req_body": true } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/hello" }]] ) if code >= 300 then ngx.status = code end ngx.say(body) } } === TEST 12: verify plugin for file-logger with request --- config location /t { content_by_lua_block { local core = require("apisix.core") local t = require("lib.test_admin").test local code = t("/hello", ngx.HTTP_POST, "body-data") local fd, err = io.open("file-with-req-body.log", 'r') local msg if not fd then core.log.error("failed to open file: file-with-req-body.log, error info: ", err) return end -- note only for first line msg = fd:read() local new_msg = core.json.decode(msg) ngx.status = code if new_msg.request ~= nil and new_msg.request.body == "body-data" then ngx.status = code ngx.say('contain with target') end } } --- response_body contain with target === TEST 13: check file-logger 'include_req_body' with 'expr' --- 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": { "file-logger": { "path": "file-with-req-expr-body.log", "include_req_body": true, "include_req_body_expr": [ [ "arg_log_body", "==", "yes" ] ] } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/hello" }]] ) if code >= 300 then ngx.status = code end ngx.say(body) } } === TEST 14: verify file-logger req with expression of concern --- config location /t { content_by_lua_block { local core = require("apisix.core") local t = require("lib.test_admin").test local code = t("/hello?log_body=yes", ngx.HTTP_POST, [[{"foo": "bar"}]] ) local fd, err = io.open("file-with-req-expr-body.log", 'r') local msg if not fd then core.log.error("failed to open file: file-with-req-expr-body.log, error info: ", err) return end -- note only for first line msg = fd:read() local new_msg = core.json.decode(msg) ngx.status = code if new_msg.request ~= nil and new_msg.request.body ~= nil then ngx.status = code ngx.say('contain target body hits with expr') end --- a new request is logged t("/hello?log_body=no", ngx.HTTP_POST, [[{"foo": "b"}]]) msg = fd:read("*l") local new_msg = core.json.decode(msg) if new_msg.request.body == nil then ngx.say('skip unconcern body') end } } --- response_body contain target body hits with expr skip unconcern body