mirror of
https://gitgud.io/fatchan/haproxy-protection.git
synced 2025-05-09 02:05:37 +00:00
Improve backend geo routing to avoid going to further backend for non matching user and proxy cn
This commit is contained in:
@@ -4,11 +4,16 @@ local bot_check = require("bot-check")
|
|||||||
local utils = require("utils")
|
local utils = require("utils")
|
||||||
local server_cn_split_regex = "([^;]+)|(%u%u)$"
|
local server_cn_split_regex = "([^;]+)|(%u%u)$"
|
||||||
local backends_map = Map.new('/etc/haproxy/map/backends.map', Map._str)
|
local backends_map = Map.new('/etc/haproxy/map/backends.map', Map._str)
|
||||||
|
local haproxy_cn = os.getenv("HAPROXY_CONTINENT") or "XX" -- shoult never be XX but avoid typing issue
|
||||||
|
|
||||||
function get_server_names(txn)
|
function Get_server_names(txn)
|
||||||
local key = txn.sf:hdr("Host")
|
local key = txn.sf:hdr("Host")
|
||||||
-- local user_cn = txn:get_var("txn.xcn") or "XX"
|
-- local user_cn = txn:get_var("txn.xcn") or "XX"
|
||||||
local user_cn = txn.sf:hdr("X-Continent-Code") or "XX"
|
local user_cn = txn.sf:hdr("X-Continent-Code") or "XX"
|
||||||
|
if user_cn ~= haproxy_cn then
|
||||||
|
-- dont sent to a further away backend for non-regional servers, until asvc kicks in
|
||||||
|
user_cn = haproxy_cn
|
||||||
|
end
|
||||||
local value = backends_map:lookup(key or "")
|
local value = backends_map:lookup(key or "")
|
||||||
if value ~= nil then
|
if value ~= nil then
|
||||||
local filtered_backends = {}
|
local filtered_backends = {}
|
||||||
@@ -16,10 +21,10 @@ function get_server_names(txn)
|
|||||||
local vals = utils.split(value, ",")
|
local vals = utils.split(value, ",")
|
||||||
-- Single pass to filter and collect backends
|
-- Single pass to filter and collect backends
|
||||||
for _, backend in ipairs(vals) do
|
for _, backend in ipairs(vals) do
|
||||||
local backend_server_name, server_cn = backend:match(server_cn_split_regex)
|
local backend_server_name, backend_cn = backend:match(server_cn_split_regex)
|
||||||
if backend_server_name then
|
if backend_server_name then
|
||||||
table.insert(all_backends, backend_server_name)
|
table.insert(all_backends, backend_server_name)
|
||||||
if server_cn == user_cn or server_cn == "XX" then
|
if backend_cn == user_cn then
|
||||||
table.insert(filtered_backends, backend_server_name)
|
table.insert(filtered_backends, backend_server_name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -37,7 +42,7 @@ function get_server_names(txn)
|
|||||||
return ""
|
return ""
|
||||||
end
|
end
|
||||||
|
|
||||||
core.register_fetches("get_server_names", get_server_names)
|
core.register_fetches("get_server_names", Get_server_names)
|
||||||
core.register_service("bot-check", "http", bot_check.view)
|
core.register_service("bot-check", "http", bot_check.view)
|
||||||
core.register_action("captcha-check", { 'http-req', }, bot_check.check_captcha_status)
|
core.register_action("captcha-check", { 'http-req', }, bot_check.check_captcha_status)
|
||||||
core.register_action("pow-check", { 'http-req', }, bot_check.check_pow_status)
|
core.register_action("pow-check", { 'http-req', }, bot_check.check_pow_status)
|
||||||
|
Reference in New Issue
Block a user