Files
ReachableCEO 54cc5f7308 feat(apisix): add Cloudron package
- Implements Apache APISIX packaging for Cloudron platform.
- Includes Dockerfile, CloudronManifest.json, and start.sh.
- Configured to use Cloudron's etcd addon.

🤖 Generated with Gemini CLI
Co-Authored-By: Gemini <noreply@google.com>
2025-09-04 09:42:47 -05:00

517 lines
15 KiB
Perl

#
# 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