remove json require from crypto lib
This commit is contained in:
parent
52fe63df39
commit
78b38ee544
@ -1,4 +1,3 @@
|
|||||||
local json = require("json")
|
|
||||||
local crypto = {}
|
local crypto = {}
|
||||||
|
|
||||||
-- ======================================================================
|
-- ======================================================================
|
||||||
|
@ -83,7 +83,7 @@ function Session:_ensure_loaded()
|
|||||||
if self._loaded then return end
|
if self._loaded then return end
|
||||||
|
|
||||||
ensure_session_store()
|
ensure_session_store()
|
||||||
|
|
||||||
local config = _G._http_session_config
|
local config = _G._http_session_config
|
||||||
local session_id = self._cookies[config.cookie_name]
|
local session_id = self._cookies[config.cookie_name]
|
||||||
local session_data = nil
|
local session_data = nil
|
||||||
@ -157,22 +157,22 @@ function Session:save()
|
|||||||
local config = _G._http_session_config
|
local config = _G._http_session_config
|
||||||
local session_json = json.encode(self._data)
|
local session_json = json.encode(self._data)
|
||||||
local success = kv.set(config.store_name, "session:" .. self.id, session_json)
|
local success = kv.set(config.store_name, "session:" .. self.id, session_json)
|
||||||
|
|
||||||
return success
|
return success
|
||||||
end
|
end
|
||||||
|
|
||||||
function Session:destroy()
|
function Session:destroy()
|
||||||
self:_ensure_loaded()
|
self:_ensure_loaded()
|
||||||
|
|
||||||
local config = _G._http_session_config
|
local config = _G._http_session_config
|
||||||
kv.delete(config.store_name, "session:" .. self.id)
|
kv.delete(config.store_name, "session:" .. self.id)
|
||||||
|
|
||||||
-- Clear session cookie
|
-- Clear session cookie
|
||||||
self._response:cookie(config.cookie_name, "", {
|
self._response:cookie(config.cookie_name, "", {
|
||||||
expires = "Thu, 01 Jan 1970 00:00:00 GMT",
|
expires = "Thu, 01 Jan 1970 00:00:00 GMT",
|
||||||
path = config.cookie_options.path or "/"
|
path = config.cookie_options.path or "/"
|
||||||
})
|
})
|
||||||
|
|
||||||
self.id = nil
|
self.id = nil
|
||||||
self._data = {}
|
self._data = {}
|
||||||
return self
|
return self
|
||||||
@ -180,18 +180,118 @@ end
|
|||||||
|
|
||||||
function Session:regenerate()
|
function Session:regenerate()
|
||||||
self:_ensure_loaded()
|
self:_ensure_loaded()
|
||||||
|
|
||||||
local config = _G._http_session_config
|
local config = _G._http_session_config
|
||||||
|
|
||||||
-- Delete old session
|
-- Delete old session
|
||||||
if self.id then
|
if self.id then
|
||||||
kv.delete(config.store_name, "session:" .. self.id)
|
kv.delete(config.store_name, "session:" .. self.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Generate new ID and set cookie
|
-- Generate new ID and set cookie
|
||||||
self.id = generate_session_id()
|
self.id = generate_session_id()
|
||||||
self._response:cookie(config.cookie_name, self.id, config.cookie_options)
|
self._response:cookie(config.cookie_name, self.id, config.cookie_options)
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ======================================================================
|
||||||
|
-- ROUTER CLASS
|
||||||
|
-- ======================================================================
|
||||||
|
|
||||||
|
local Router = {}
|
||||||
|
Router.__index = Router
|
||||||
|
|
||||||
|
function Router.new()
|
||||||
|
return setmetatable({
|
||||||
|
_middleware = {},
|
||||||
|
_prefix = ""
|
||||||
|
}, Router)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Router:use(...)
|
||||||
|
local args = {...}
|
||||||
|
if #args == 1 and type(args[1]) == "function" then
|
||||||
|
table.insert(self._middleware, args[1])
|
||||||
|
elseif #args == 2 and type(args[1]) == "string" and type(args[2]) == "function" then
|
||||||
|
-- Path-specific middleware for this router
|
||||||
|
table.insert(self._middleware, {path = args[1], handler = args[2]})
|
||||||
|
else
|
||||||
|
error("Invalid arguments to use()")
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function Router:group(path_prefix, callback)
|
||||||
|
local group_router = Router.new()
|
||||||
|
group_router._prefix = self._prefix .. path_prefix
|
||||||
|
|
||||||
|
-- Inherit parent middleware
|
||||||
|
for _, mw in ipairs(self._middleware) do
|
||||||
|
table.insert(group_router._middleware, mw)
|
||||||
|
end
|
||||||
|
|
||||||
|
if callback then
|
||||||
|
callback(group_router)
|
||||||
|
end
|
||||||
|
return group_router
|
||||||
|
end
|
||||||
|
|
||||||
|
function Router:_add_route(method, path, handler)
|
||||||
|
if not string.starts_with(path, "/") then
|
||||||
|
path = "/" .. path
|
||||||
|
end
|
||||||
|
|
||||||
|
local full_path = self._prefix .. path
|
||||||
|
local segments = split_path(full_path)
|
||||||
|
|
||||||
|
-- Create middleware chain for this specific route
|
||||||
|
local route_middleware = {}
|
||||||
|
|
||||||
|
-- Add global middleware first
|
||||||
|
for _, mw in ipairs(_G._http_middleware) do
|
||||||
|
if mw.path == nil or string.starts_with(full_path, mw.path) then
|
||||||
|
table.insert(route_middleware, mw.handler)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Add router middleware
|
||||||
|
for _, mw in ipairs(self._middleware) do
|
||||||
|
if type(mw) == "function" then
|
||||||
|
table.insert(route_middleware, mw)
|
||||||
|
elseif type(mw) == "table" and mw.path then
|
||||||
|
-- Check if path-specific middleware applies
|
||||||
|
if string.starts_with(full_path, mw.path) then
|
||||||
|
table.insert(route_middleware, mw.handler)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(_G._http_routes, {
|
||||||
|
method = method,
|
||||||
|
path = full_path,
|
||||||
|
segments = segments,
|
||||||
|
handler = handler,
|
||||||
|
middleware = route_middleware -- Store middleware per route
|
||||||
|
})
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
-- HTTP method helpers for Router
|
||||||
|
function Router:get(path, handler) return self:_add_route("GET", path, handler) end
|
||||||
|
function Router:post(path, handler) return self:_add_route("POST", path, handler) end
|
||||||
|
function Router:put(path, handler) return self:_add_route("PUT", path, handler) end
|
||||||
|
function Router:delete(path, handler) return self:_add_route("DELETE", path, handler) end
|
||||||
|
function Router:patch(path, handler) return self:_add_route("PATCH", path, handler) end
|
||||||
|
function Router:head(path, handler) return self:_add_route("HEAD", path, handler) end
|
||||||
|
function Router:options(path, handler) return self:_add_route("OPTIONS", path, handler) end
|
||||||
|
|
||||||
|
function Router:all(path, handler)
|
||||||
|
local methods = {"GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"}
|
||||||
|
for _, method in ipairs(methods) do
|
||||||
|
self:_add_route(method, path, handler)
|
||||||
|
end
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -491,32 +591,44 @@ local function match_route(method, path)
|
|||||||
return nil, {}
|
return nil, {}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- ======================================================================
|
||||||
|
-- OPTIMIZED REQUEST HANDLING
|
||||||
|
-- ======================================================================
|
||||||
|
|
||||||
function _http_handle_request(req_table, res_table)
|
function _http_handle_request(req_table, res_table)
|
||||||
local res = Response.new(res_table)
|
local res = Response.new(res_table)
|
||||||
local req = Request.new(req_table, res)
|
local req = Request.new(req_table, res)
|
||||||
|
|
||||||
|
-- Fast route lookup
|
||||||
|
local route, params = match_route(req.method, req.path)
|
||||||
|
req.params = params
|
||||||
|
|
||||||
|
if not route then
|
||||||
|
res:send(404)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Fast path: no middleware
|
||||||
|
if not route.middleware or #route.middleware == 0 then
|
||||||
|
route.handler(req, res)
|
||||||
|
|
||||||
|
-- Auto-save dirty sessions
|
||||||
|
if req.session._loaded and req.session._dirty then
|
||||||
|
req.session:save()
|
||||||
|
end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Run route-specific middleware chain
|
||||||
local function run_middleware(index)
|
local function run_middleware(index)
|
||||||
if index > #_G._http_middleware then
|
if index > #route.middleware then
|
||||||
local route, params = match_route(req.method, req.path)
|
|
||||||
req.params = params
|
|
||||||
|
|
||||||
if not route then
|
|
||||||
res:send(404)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
route.handler(req, res)
|
route.handler(req, res)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local mw = _G._http_middleware[index]
|
route.middleware[index](req, res, function()
|
||||||
if mw.path == nil or string.starts_with(req.path, mw.path) then
|
|
||||||
mw.handler(req, res, function()
|
|
||||||
run_middleware(index + 1)
|
|
||||||
end)
|
|
||||||
else
|
|
||||||
run_middleware(index + 1)
|
run_middleware(index + 1)
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
run_middleware(1)
|
run_middleware(1)
|
||||||
@ -569,23 +681,34 @@ end
|
|||||||
|
|
||||||
function Server:configure_sessions(options)
|
function Server:configure_sessions(options)
|
||||||
options = options or {}
|
options = options or {}
|
||||||
|
|
||||||
local config = _G._http_session_config
|
local config = _G._http_session_config
|
||||||
config.store_name = options.store_name or config.store_name
|
config.store_name = options.store_name or config.store_name
|
||||||
config.filename = options.filename or config.filename
|
config.filename = options.filename or config.filename
|
||||||
config.cookie_name = options.cookie_name or config.cookie_name
|
config.cookie_name = options.cookie_name or config.cookie_name
|
||||||
|
|
||||||
if options.cookie_options then
|
if options.cookie_options then
|
||||||
for k, v in pairs(options.cookie_options) do
|
for k, v in pairs(options.cookie_options) do
|
||||||
config.cookie_options[k] = v
|
config.cookie_options[k] = v
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
ensure_session_store()
|
ensure_session_store()
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function Server:group(path_prefix, callback)
|
||||||
|
local router = Router.new()
|
||||||
|
router._prefix = path_prefix
|
||||||
|
|
||||||
|
if callback then
|
||||||
|
callback(router)
|
||||||
|
end
|
||||||
|
return router
|
||||||
|
end
|
||||||
|
|
||||||
function Server:use(...)
|
function Server:use(...)
|
||||||
|
-- Global middleware - stored per route during registration
|
||||||
local args = {...}
|
local args = {...}
|
||||||
if #args == 1 and type(args[1]) == "function" then
|
if #args == 1 and type(args[1]) == "function" then
|
||||||
table.insert(_G._http_middleware, {path = nil, handler = args[1]})
|
table.insert(_G._http_middleware, {path = nil, handler = args[1]})
|
||||||
@ -594,7 +717,6 @@ function Server:use(...)
|
|||||||
else
|
else
|
||||||
error("Invalid arguments to use()")
|
error("Invalid arguments to use()")
|
||||||
end
|
end
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -605,11 +727,20 @@ function Server:_add_route(method, path, handler)
|
|||||||
|
|
||||||
local segments = split_path(path)
|
local segments = split_path(path)
|
||||||
|
|
||||||
|
-- Apply global middleware to this route
|
||||||
|
local route_middleware = {}
|
||||||
|
for _, mw in ipairs(_G._http_middleware) do
|
||||||
|
if mw.path == nil or string.starts_with(path, mw.path) then
|
||||||
|
table.insert(route_middleware, mw.handler)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
table.insert(_G._http_routes, {
|
table.insert(_G._http_routes, {
|
||||||
method = method,
|
method = method,
|
||||||
path = path,
|
path = path,
|
||||||
segments = segments,
|
segments = segments,
|
||||||
handler = handler
|
handler = handler,
|
||||||
|
middleware = route_middleware
|
||||||
})
|
})
|
||||||
|
|
||||||
return self
|
return self
|
||||||
@ -671,6 +802,10 @@ end
|
|||||||
-- MIDDLEWARE HELPERS
|
-- MIDDLEWARE HELPERS
|
||||||
-- ======================================================================
|
-- ======================================================================
|
||||||
|
|
||||||
|
function http.router()
|
||||||
|
return Router.new()
|
||||||
|
end
|
||||||
|
|
||||||
function http.cors(options)
|
function http.cors(options)
|
||||||
options = options or {}
|
options = options or {}
|
||||||
local origin = options.origin or "*"
|
local origin = options.origin or "*"
|
||||||
@ -770,12 +905,12 @@ end
|
|||||||
function http.cleanup_expired_sessions(max_age)
|
function http.cleanup_expired_sessions(max_age)
|
||||||
max_age = max_age or 86400
|
max_age = max_age or 86400
|
||||||
ensure_session_store()
|
ensure_session_store()
|
||||||
|
|
||||||
local config = _G._http_session_config
|
local config = _G._http_session_config
|
||||||
local keys = kv.keys(config.store_name)
|
local keys = kv.keys(config.store_name)
|
||||||
local current_time = os.time()
|
local current_time = os.time()
|
||||||
local deleted = 0
|
local deleted = 0
|
||||||
|
|
||||||
for _, key in ipairs(keys) do
|
for _, key in ipairs(keys) do
|
||||||
if string.starts_with(key, "session:") then
|
if string.starts_with(key, "session:") then
|
||||||
local json_str = kv.get(config.store_name, key)
|
local json_str = kv.get(config.store_name, key)
|
||||||
@ -790,7 +925,7 @@ function http.cleanup_expired_sessions(max_age)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return deleted
|
return deleted
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -799,14 +934,14 @@ function http.get_session_count()
|
|||||||
local config = _G._http_session_config
|
local config = _G._http_session_config
|
||||||
local keys = kv.keys(config.store_name)
|
local keys = kv.keys(config.store_name)
|
||||||
local count = 0
|
local count = 0
|
||||||
|
|
||||||
for _, key in ipairs(keys) do
|
for _, key in ipairs(keys) do
|
||||||
if string.starts_with(key, "session:") then
|
if string.starts_with(key, "session:") then
|
||||||
count = count + 1
|
count = count + 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return count
|
return count
|
||||||
end
|
end
|
||||||
|
|
||||||
return http
|
return http
|
||||||
|
Loading…
x
Reference in New Issue
Block a user