t/plugin/http-logger2.t (130 lines of code) (raw):

# # 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'; log_level('debug'); repeat_each(1); no_long_string(); no_root_location(); add_block_preprocessor(sub { my ($block) = @_; if (!$block->request) { $block->set_value("request", "GET /t"); } my $http_config = $block->http_config // <<_EOC_; server { listen 12001; location /http-logger/test { content_by_lua_block { ngx.say("test-http-logger-response") } } location /http-logger/Authorization { content_by_lua_block { ngx.log(ngx.WARN, "received Authorization header: [", ngx.var.http_authorization, "]") ngx.say("OK") } } location /http-logger/center { content_by_lua_block { local function str_split(str, reps) local str_list = {} string.gsub(str, '[^' .. reps .. ']+', function(w) table.insert(str_list, w) end) return str_list end local args = ngx.req.get_uri_args() local query = args.query or nil ngx.req.read_body() local body = ngx.req.get_body_data() if query then if type(query) == "string" then query = {query} end local data, err = require("cjson").decode(body) if err then ngx.log(ngx.WARN, "logs:", body) end for i = 1, #query do local fields = str_split(query[i], ".") local val for j = 1, #fields do local key = fields[j] if j == 1 then val = data[key] else val = val[key] end end ngx.log(ngx.WARN ,query[i], ":", val) end else ngx.log(ngx.WARN, "logs:", body) end } } location / { content_by_lua_block { ngx.log(ngx.WARN, "test http logger for root path") } } } server { listen 11451; gzip on; gzip_types *; gzip_min_length 1; location /gzip_hello { content_by_lua_block { ngx.req.read_body() local s = "gzip hello world" ngx.header['Content-Length'] = #s + 1 ngx.say(s) } } } server { listen 11452; location /brotli_hello { content_by_lua_block { ngx.req.read_body() local s = "brotli hello world" ngx.header['Content-Length'] = #s + 1 ngx.say(s) } header_filter_by_lua_block { local conf = { comp_level = 6, http_version = 1.1, lgblock = 0, lgwin = 19, min_length = 1, mode = 0, types = "*", } local brotli = require("apisix.plugins.brotli") brotli.header_filter(conf, ngx.ctx) } body_filter_by_lua_block { local conf = { comp_level = 6, http_version = 1.1, lgblock = 0, lgwin = 19, min_length = 1, mode = 0, types = "*", } local brotli = require("apisix.plugins.brotli") brotli.body_filter(conf, ngx.ctx) } } } _EOC_ $block->set_value("http_config", $http_config); my $extra_init_by_lua = <<_EOC_; local bpm = require("apisix.utils.batch-processor-manager") bpm.set_check_stale_interval(1) _EOC_ $block->set_value("extra_init_by_lua", $extra_init_by_lua); }); run_tests; __DATA__ === TEST 1: check stale batch processor --- 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": { "http-logger": { "uri": "http://127.0.0.1:1982/hello", "batch_max_size": 1 } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/opentracing" }]] ) if code >= 300 then ngx.status = code end ngx.say(body) } } --- response_body passed === TEST 2: don't remove current processor --- request GET /opentracing --- error_log Batch Processor[http logger] successfully processed the entries --- no_error_log removing batch processor stale object --- wait: 0.5 === TEST 3: remove stale processor --- request GET /opentracing --- error_log Batch Processor[http logger] successfully processed the entries removing batch processor stale object --- wait: 1.5 === TEST 4: don't remove batch processor which is in used --- 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": { "http-logger": { "uri": "http://127.0.0.1:1982/hello", "batch_max_size": 2 } }, "upstream": { "nodes": { "127.0.0.1:1982": 1 }, "type": "roundrobin" }, "uri": "/opentracing" }]] ) if code >= 300 then ngx.status = code end ngx.say(body) } } --- response_body passed === TEST 5: don't remove --- request GET /opentracing --- no_error_log removing batch processor stale object --- wait: 1.5 === TEST 6: set fetch request body and response body route --- 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, [[{ "methods": ["POST"], "plugins": { "http-logger": { "uri": "http://127.0.0.1:12001/http-logger/center?query[]=request.body&query[]=response.body", "batch_max_size": 1, "max_retry_count": 1, "retry_delay": 2, "buffer_duration": 2, "inactive_timeout": 2, "include_req_body": true, "include_resp_body": true } }, "upstream": { "nodes": { "127.0.0.1:12001": 1 }, "type": "roundrobin" }, "uri": "/http-logger/test" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- response_body passed === TEST 7: test fetch request body and response body route --- request POST /http-logger/test test-http-logger-request --- response_body test-http-logger-response --- error_log request.body:test-http-logger-request response.body:test-http-logger-response --- wait: 1.5 === TEST 8: set fetch request body and response body route - gzip --- 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, [[{ "methods": ["GET"], "plugins": { "http-logger": { "uri": "http://127.0.0.1:12001/http-logger/center?query[]=response.body", "batch_max_size": 1, "max_retry_count": 1, "retry_delay": 2, "buffer_duration": 2, "inactive_timeout": 2, "include_resp_body": true } }, "upstream": { "nodes": { "127.0.0.1:11451": 1 }, "type": "roundrobin" }, "uri": "/gzip_hello" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- response_body passed === TEST 9: test fetch request body and response body route --- request GET /gzip_hello --- more_headers Accept-Encoding: gzip --- error_log response.body:gzip hello world --- wait: 1.5 === TEST 10: set fetch request body and response body route - brotli --- 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, [[{ "methods": ["GET"], "plugins": { "http-logger": { "uri": "http://127.0.0.1:12001/http-logger/center?query[]=response.body", "batch_max_size": 1, "max_retry_count": 1, "retry_delay": 2, "buffer_duration": 2, "inactive_timeout": 2, "include_resp_body": true } }, "upstream": { "nodes": { "127.0.0.1:11452": 1 }, "type": "roundrobin" }, "uri": "/brotli_hello" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- response_body passed === TEST 11: test fetch request body and response body route --- request GET /brotli_hello --- more_headers Accept-Encoding: br --- error_log response.body:brotli hello world --- wait: 1.5 === TEST 12: test default Authorization header sent to the log server --- 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, [[{ "methods": ["POST"], "plugins": { "http-logger": { "uri": "http://127.0.0.1:12001/http-logger/Authorization", "batch_max_size": 1, "max_retry_count": 1, "retry_delay": 2, "buffer_duration": 2, "inactive_timeout": 2 } }, "upstream": { "nodes": { "127.0.0.1:12001": 1 }, "type": "roundrobin" }, "uri": "/http-logger/test" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- response_body passed === TEST 13: hit --- request POST /http-logger/test test-http-logger-request --- error_log received Authorization header: [nil] --- wait: 1.5 === TEST 14: add default path --- 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": { "http-logger": { "uri": "http://127.0.0.1:12001", "batch_max_size": 1, "max_retry_count": 1, "retry_delay": 2, "buffer_duration": 2, "inactive_timeout": 2 } }, "upstream": { "nodes": { "127.0.0.1:12001": 1 }, "type": "roundrobin" }, "uri": "/http-logger/test" }]]) if code >= 300 then ngx.status = code end ngx.say(body) } } --- response_body passed === TEST 15: hit --- request GET /http-logger/test --- error_log test http logger for root path