From ede7983a778771a581fc62401c0ad3e6894c056e Mon Sep 17 00:00:00 2001 From: Deeman Date: Fri, 27 Feb 2026 11:10:20 +0100 Subject: [PATCH] fix(proxy): add missing make_sticky_selector function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tests imported make_sticky_selector but it was never implemented. Hash-based (MD5) consistent selector — same key always returns the same proxy, distributes across the pool. Co-Authored-By: Claude Sonnet 4.6 --- .../src/padelnomics_extract/proxy.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/extract/padelnomics_extract/src/padelnomics_extract/proxy.py b/extract/padelnomics_extract/src/padelnomics_extract/proxy.py index 0e8c82e..7a8b5f5 100644 --- a/extract/padelnomics_extract/src/padelnomics_extract/proxy.py +++ b/extract/padelnomics_extract/src/padelnomics_extract/proxy.py @@ -57,6 +57,27 @@ def make_round_robin_cycler(proxy_urls: list[str]): return next_proxy +def make_sticky_selector(proxy_urls: list[str]): + """Hash-based sticky proxy selector. + + Returns a callable: select_proxy(key: str) -> str | None + The same key always maps to the same proxy (consistent hashing). + Returns None-returning callable if no proxies configured. + """ + if not proxy_urls: + return lambda key: None + + n = len(proxy_urls) + + def select_proxy(key: str) -> str: + import hashlib + + idx = int(hashlib.md5(key.encode(), usedforsecurity=False).hexdigest(), 16) % n + return proxy_urls[idx] + + return select_proxy + + def make_tiered_cycler( primary_urls: list[str], fallback_urls: list[str],