- Per-listener `retries` overrides global default (0 = inherit) - Pool-level `allowed_protos` filters proxies during merge - Connection pooling documented in CHEATSHEET.md - Both features exposed in /config and /status API responses - 12 new tests (config parsing, API exposure, merge filtering) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
3.9 KiB
s5p -- Tasks
Current
-
Scaffold project structure
-
Implement SOCKS5 server
-
Implement protocol handshakes (SOCKS5, SOCKS4/4a, HTTP CONNECT)
-
Implement chain builder
-
CLI and config loading
-
Unit tests (config, proto)
-
Documentation
-
Smoke test with Tor
-
Containerfile + compose.yaml (Alpine)
-
Graceful SIGTERM shutdown
-
cProfile support (
--cprofile) -
Config split (example.yaml tracked, s5p.yaml gitignored)
-
Dynamic proxy source API integration
-
Connection retry with proxy rotation
-
Connection metrics (periodic + shutdown logging)
-
Managed proxy pool (multi-source, health-tested, persistent)
-
Weighted proxy selection (prefer recently-tested proxies)
-
Per-proxy backoff (60s cooldown after connection failure)
-
Stale proxy expiry (evict dead proxies not seen for 3 refresh cycles)
-
Pool stats in periodic metrics log (
pool=alive/total) -
Fast warm start (trust cached state, defer all health tests)
-
Static chain health check (skip pool tests if chain unreachable)
-
SIGHUP hot config reload (timeout, retries, log_level, pool config)
-
Dead proxy reporting (
report_urlPOST evicted proxies to API) -
Concurrent connection semaphore (
max_connections, CLI-m) -
Async HTTP client (replace blocking urllib, parallel source fetch)
-
First-hop TCP connection pool (
pool_size,pool_max_idle) -
Codebase consolidation (refactor/codebase-consolidation)
- Extract shared proxy parsing and constants to config.py
- Consolidate health-check HTTP logic in pool
- Remove threading from metrics (pure asyncio, no lock needed)
- Replace
ensure_futurewithcreate_task - Rename ambiguous variables in config loader
- Remove legacy ProxySource layer (source.py deleted)
- Add tests for extracted
parse_api_proxies
-
Instant warm start (trust cached state, defer all health tests)
-
Register signal handlers before startup (fix SIGKILL on stop)
-
Use k8s-file logging driver with rotation
-
Built-in control API (
api.py,--api,api_listen) -
Tor control port integration (NEWNYM signaling, periodic rotation)
-
Replace HTTP health check with TLS handshake (round-robin targets, no httpbin dependency)
-
Multi-listener with configurable proxy chaining (per-port chain depth)
-
Connection rate and chain latency metrics (rate/s, p50/p95/p99)
-
Per-listener latency tracking
-
Dynamic health test concurrency
-
Multi-Tor round-robin via
tor_nodesconfig -
Named proxy pools with per-listener assignment (
proxy_pools:,pool:)mitmsource filter (?mitm=0/?mitm=1API query param)- Per-pool state files (
pool-{name}.json) - Per-pool log prefixes (
pool[name]: ...) - API: merged
/poolwith per-pool breakdown,/statuspools summary - Backward compat: singular
proxy_pool:registers as"default"
-
Integration tests with mock SOCKS5 proxy (end-to-end)
-
Per-destination bypass rules (CIDR, suffix, exact match)
-
Weighted multi-candidate pool selection
-
Onion chain-only routing (.onion skips pool hops)
-
Graceful shutdown timeout (fixes cProfile data dump)
-
Gitea CI workflow (lint + test + Harbor image push)
v0.3.0 Stabilization
- Version bump to 0.3.0
- Systemd service unit (
config/s5p.service,make install-service) - CLI argument parsing tests (
tests/test_cli.py) - Protocol handshake tests (
tests/test_proto.py-- SOCKS5/4/HTTP) - API reference documentation (
docs/USAGE.md) - Prometheus
/metricsendpoint (OpenMetrics format)
Quick Wins
- Listener-level retry override (
retriesper listener) - Pool-level proxy protocol filter (
allowed_protoson proxy pool) - Document connection pooling (
pool_size/pool_max_idlein CHEATSHEET.md)
Next
- UDP ASSOCIATE support
- BIND support
- Chain randomization