function string:starts_with(start)
return self:sub(1, #start) == start
end
function string:trim()
return self:match("^%s*(.-)%s*$")
end
function load_from_json(path)
local data = iocaine.file.read_as_json(path)
local keys = {}
for k, _ in pairs(data) do
table.insert(keys, k)
end
return iocaine.matcher.Patterns(table.unpack(keys))
end
function load_from_file(path)
local data = iocaine.file.read_as_string(path):trim()
local keys = {}
for line in string.gmatch(data, "[^\n]+") do
table.insert(keys, line)
end
return iocaine.matcher.Patterns(table.unpack(keys))
end
local Garbage = "Garbage"
local Challenge = "Challenge"
local NotForUs = "NotForUs"
local matchers = {
["patterns.test-1"] = iocaine.matcher.Patterns("ClaudeBot"),
["patterns.data"] = load_from_json("tests/request-handler/data.json"),
["patterns.data-txt"] = load_from_file("tests/request-handler/data.txt"),
["regexes.test-1"] = iocaine.matcher.Regex("Firefox \\d\\.\\d"),
["regexes.capture-groups"] = iocaine.matcher.Regex(
"AppleWebKit/(?<AppleWebKitVersion>(\\d+\\.?)+).*Safari/(?<SafariVersion>(\\d+\\.?)+)"
):as_regex_matcher(),
["regexsets.test-1"] = iocaine.matcher.RegexSet("iocaine.*malicious-agent", "iocaine.*terrible"),
["prefixes.test-1"] = iocaine.matcher.IPPrefixes("207.241.237.0/24")
}
function decide(request)
if request:header("user-agent") == "iocaine-test::bad-agent" then
return Garbage
end
if request.method == "INVALID" then
return Garbage
end
if request.path:starts_with("/cgi-bin/") then
return Garbage
end
if request:query("capitalism") == "good" then
return Garbage
end
if request:query("capitalism") == "bad" then
return NotForUs
end
if request:query("capitalism") ~= nil then
return Challenge
end
if request:cookie("tracking-id") ~= nil then
return Garbage
end
if matchers["patterns.test-1"]:matches(request:header("user-agent")) then
return Garbage
end
if matchers["regexes.test-1"]:matches(request:header("user-agent")) then
return Garbage
end
local xff = request:header("x-forwarded-for")
if xff and matchers["prefixes.test-1"]:matches(xff) then
return Garbage
end
if matchers["patterns.data"]:matches(request:header("user-agent")) then
return Garbage
end
if matchers["patterns.data-txt"]:matches(request:header("user-agent")) then
return Garbage
end
local webkit_version = matchers["regexes.capture-groups"]:capture(request:header("user-agent"), "AppleWebKitVersion")
local safari_version = matchers["regexes.capture-groups"]:capture(request:header("user-agent"), "SafariVersion")
if webkit_version ~= safari_version then
return Garbage
end
if matchers["regexsets.test-1"]:matches(request:header("user-agent")) then
return Garbage
end
local secchua = iocaine.SecCHUA(request:header("sec-ch-ua"))
if secchua and secchua:contains_item("Chromium") then
return Garbage
end
return NotForUs
end