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>
This commit is contained in:
116
CloudronPackages/APISIX/apisix-source/apisix/api_router.lua
Normal file
116
CloudronPackages/APISIX/apisix-source/apisix/api_router.lua
Normal file
@@ -0,0 +1,116 @@
|
||||
--
|
||||
-- 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.
|
||||
--
|
||||
local require = require
|
||||
local router = require("apisix.utils.router")
|
||||
local plugin_mod = require("apisix.plugin")
|
||||
local core = require("apisix.core")
|
||||
local ipairs = ipairs
|
||||
local ngx_header = ngx.header
|
||||
local type = type
|
||||
|
||||
|
||||
local _M = {}
|
||||
local match_opts = {}
|
||||
local has_route_not_under_apisix
|
||||
|
||||
|
||||
local fetch_api_router
|
||||
do
|
||||
local routes = {}
|
||||
function fetch_api_router()
|
||||
core.table.clear(routes)
|
||||
|
||||
has_route_not_under_apisix = false
|
||||
|
||||
for _, plugin in ipairs(plugin_mod.plugins) do
|
||||
local api_fun = plugin.api
|
||||
if api_fun then
|
||||
local api_routes = api_fun()
|
||||
core.log.debug("fetched api routes: ",
|
||||
core.json.delay_encode(api_routes, true))
|
||||
for _, route in ipairs(api_routes) do
|
||||
if route.uri == nil then
|
||||
core.log.error("got nil uri in api route: ",
|
||||
core.json.delay_encode(route, true))
|
||||
break
|
||||
end
|
||||
|
||||
local typ_uri = type(route.uri)
|
||||
if not has_route_not_under_apisix then
|
||||
if typ_uri == "string" then
|
||||
if not core.string.has_prefix(route.uri, "/apisix/") then
|
||||
has_route_not_under_apisix = true
|
||||
end
|
||||
else
|
||||
for _, uri in ipairs(route.uri) do
|
||||
if not core.string.has_prefix(uri, "/apisix/") then
|
||||
has_route_not_under_apisix = true
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
core.table.insert(routes, {
|
||||
methods = route.methods,
|
||||
paths = route.uri,
|
||||
handler = function (api_ctx)
|
||||
local code, body = route.handler(api_ctx)
|
||||
if code or body then
|
||||
if type(body) == "table" and ngx_header["Content-Type"] == nil then
|
||||
core.response.set_header("Content-Type", "application/json")
|
||||
end
|
||||
|
||||
core.response.exit(code, body)
|
||||
end
|
||||
end
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return router.new(routes)
|
||||
end
|
||||
|
||||
end -- do
|
||||
|
||||
|
||||
function _M.has_route_not_under_apisix()
|
||||
if has_route_not_under_apisix == nil then
|
||||
return true
|
||||
end
|
||||
|
||||
return has_route_not_under_apisix
|
||||
end
|
||||
|
||||
|
||||
function _M.match(api_ctx)
|
||||
local api_router = core.lrucache.global("api_router", plugin_mod.load_times, fetch_api_router)
|
||||
if not api_router then
|
||||
core.log.error("failed to fetch valid api router")
|
||||
return false
|
||||
end
|
||||
|
||||
core.table.clear(match_opts)
|
||||
match_opts.method = api_ctx.var.request_method
|
||||
|
||||
local ok = api_router:dispatch(api_ctx.var.uri, match_opts, api_ctx)
|
||||
return ok
|
||||
end
|
||||
|
||||
|
||||
return _M
|
Reference in New Issue
Block a user