diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..10b731c
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,5 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
diff --git a/.idea/AuthPlatform.iml b/.idea/AuthPlatform.iml
new file mode 100644
index 0000000..c90834f
--- /dev/null
+++ b/.idea/AuthPlatform.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..c4d5ec0
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/conf/nginx.conf b/conf/nginx.conf
index dbe25f2..60e1f13 100644
--- a/conf/nginx.conf
+++ b/conf/nginx.conf
@@ -20,8 +20,13 @@ http {
}
location /api {
- content_by_lua_file '/home/frankly/work/AuthPlatform/src/test.lua';
- #content_by_lua_file 'src/api/api.lua';
+ content_by_lua_file '/home/frankly/work/AuthPlatform/src/api/api.lua';
+ }
+ location /testTree {
+ content_by_lua_file '/home/frankly/work/AuthPlatform/src/testRadixtree.lua';
+ }
+ location /test {
+ content_by_lua_file '/home/frankly/work/AuthPlatform/src/testPostgres.lua';
}
}
}
\ No newline at end of file
diff --git a/src/test.lua b/src/testPostgres.lua
similarity index 100%
rename from src/test.lua
rename to src/testPostgres.lua
diff --git a/src/testRadixtree.lua b/src/testRadixtree.lua
new file mode 100644
index 0000000..bf26548
--- /dev/null
+++ b/src/testRadixtree.lua
@@ -0,0 +1,13 @@
+---
+--- Generated by EmmyLua(https://github.com/EmmyLua)
+--- Created by frankly.
+--- DateTime: 2025/9/28 10:27
+---
+local radix = require("resty.radixtree")
+local rx = radix.new({
+ path = "/api/*",
+ host = "*.example.com",
+ method = "GET",
+ remote_addr = "127.0.0.1"
+})
+ngx.say(rx.match("/api/v1/data", {path = "/api/v1/data"}) == true)
diff --git a/src/util/cookie.lua b/src/util/cookie.lua
new file mode 100644
index 0000000..f4c81ab
--- /dev/null
+++ b/src/util/cookie.lua
@@ -0,0 +1,213 @@
+-- Copyright (C) 2013-2016 Jiale Zhi (calio), CloudFlare Inc.
+-- See RFC6265 http://tools.ietf.org/search/rfc6265
+-- require "luacov"
+
+local type = type
+local byte = string.byte
+local sub = string.sub
+local format = string.format
+local log = ngx.log
+local ERR = ngx.ERR
+local WARN = ngx.WARN
+local ngx_header = ngx.header
+
+local EQUAL = byte("=")
+local SEMICOLON = byte(";")
+local SPACE = byte(" ")
+local HTAB = byte("\t")
+
+-- table.new(narr, nrec)
+local ok, new_tab = pcall(require, "table.new")
+if not ok then
+ new_tab = function () return {} end
+end
+
+local ok, clear_tab = pcall(require, "table.clear")
+if not ok then
+ clear_tab = function(tab) for k, _ in pairs(tab) do tab[k] = nil end end
+end
+
+local _M = new_tab(0, 2)
+
+_M._VERSION = '0.01'
+
+
+local function get_cookie_table(text_cookie)
+ if type(text_cookie) ~= "string" then
+ log(ERR, format("expect text_cookie to be \"string\" but found %s",
+ type(text_cookie)))
+ return {}
+ end
+
+ local EXPECT_KEY = 1
+ local EXPECT_VALUE = 2
+ local EXPECT_SP = 3
+
+ local n = 0
+ local len = #text_cookie
+
+ for i=1, len do
+ if byte(text_cookie, i) == SEMICOLON then
+ n = n + 1
+ end
+ end
+
+ local cookie_table = new_tab(0, n + 1)
+
+ local state = EXPECT_SP
+ local i = 1
+ local j = 1
+ local key, value
+
+ while j <= len do
+ if state == EXPECT_KEY then
+ if byte(text_cookie, j) == EQUAL then
+ key = sub(text_cookie, i, j - 1)
+ state = EXPECT_VALUE
+ i = j + 1
+ end
+ elseif state == EXPECT_VALUE then
+ if byte(text_cookie, j) == SEMICOLON
+ or byte(text_cookie, j) == SPACE
+ or byte(text_cookie, j) == HTAB
+ then
+ value = sub(text_cookie, i, j - 1)
+ cookie_table[key] = value
+
+ key, value = nil, nil
+ state = EXPECT_SP
+ i = j + 1
+ end
+ elseif state == EXPECT_SP then
+ if byte(text_cookie, j) ~= SPACE
+ and byte(text_cookie, j) ~= HTAB
+ then
+ state = EXPECT_KEY
+ i = j
+ j = j - 1
+ end
+ end
+ j = j + 1
+ end
+
+ if key ~= nil and value == nil then
+ cookie_table[key] = sub(text_cookie, i)
+ end
+
+ return cookie_table
+end
+
+function _M.new(self)
+ local _cookie = ngx.var.http_cookie
+ --if not _cookie then
+ --return nil, "no cookie found in current request"
+ --end
+ return setmetatable({ _cookie = _cookie, set_cookie_table = new_tab(4, 0) },
+ { __index = self })
+end
+
+function _M.get(self, key)
+ if not self._cookie then
+ return nil, "no cookie found in the current request"
+ end
+ if self.cookie_table == nil then
+ self.cookie_table = get_cookie_table(self._cookie)
+ end
+
+ return self.cookie_table[key]
+end
+
+function _M.get_all(self)
+ if not self._cookie then
+ return nil, "no cookie found in the current request"
+ end
+
+ if self.cookie_table == nil then
+ self.cookie_table = get_cookie_table(self._cookie)
+ end
+
+ return self.cookie_table
+end
+
+function _M.get_cookie_size(self)
+ if not self._cookie then
+ return 0
+ end
+
+ return string.len(self._cookie)
+end
+
+local function bake(cookie)
+ if not cookie.key or not cookie.value then
+ return nil, 'missing cookie field "key" or "value"'
+ end
+
+ if cookie["max-age"] then
+ cookie.max_age = cookie["max-age"]
+ end
+
+ if (cookie.samesite) then
+ local samesite = cookie.samesite
+
+ -- if we don't have a valid-looking attribute, ignore the attribute
+ if (samesite ~= "Strict" and samesite ~= "Lax" and samesite ~= "None") then
+ log(WARN, "SameSite value must be 'Strict', 'Lax' or 'None'")
+ cookie.samesite = nil
+ end
+ end
+
+ local str = cookie.key .. "=" .. cookie.value
+ .. (cookie.expires and "; Expires=" .. cookie.expires or "")
+ .. (cookie.max_age and "; Max-Age=" .. cookie.max_age or "")
+ .. (cookie.domain and "; Domain=" .. cookie.domain or "")
+ .. (cookie.path and "; Path=" .. cookie.path or "")
+ .. (cookie.secure and "; Secure" or "")
+ .. (cookie.httponly and "; HttpOnly" or "")
+ .. (cookie.samesite and "; SameSite=" .. cookie.samesite or "")
+ .. (cookie.extension and "; " .. cookie.extension or "")
+ return str
+end
+
+function _M.set(self, cookie)
+ local cookie_str, err = bake(cookie)
+ if not cookie_str then
+ return nil, err
+ end
+
+ local set_cookie = ngx_header['Set-Cookie']
+ local set_cookie_type = type(set_cookie)
+ local t = self.set_cookie_table
+ clear_tab(t)
+
+ if set_cookie_type == "string" then
+ -- only one cookie has been setted
+ if set_cookie ~= cookie_str then
+ t[1] = set_cookie
+ t[2] = cookie_str
+ ngx_header['Set-Cookie'] = t
+ end
+ elseif set_cookie_type == "table" then
+ -- more than one cookies has been setted
+ local size = #set_cookie
+
+ -- we can not set cookie like ngx.header['Set-Cookie'][3] = val
+ -- so create a new table, copy all the values, and then set it back
+ for i=1, size do
+ t[i] = ngx_header['Set-Cookie'][i]
+ if t[i] == cookie_str then
+ -- new cookie is duplicated
+ return true
+ end
+ end
+ t[size + 1] = cookie_str
+ ngx_header['Set-Cookie'] = t
+ else
+ -- no cookie has been setted
+ ngx_header['Set-Cookie'] = cookie_str
+ end
+ return true
+end
+
+_M.get_cookie_string = bake
+
+return _M