Skip to content

feat(gateway): unified proxy support with SOCKS, DISCORD_PROXY, and multi-platform coverage#6814

Merged
teknium1 merged 2 commits into
mainfrom
hermes/hermes-25b83dfd
Apr 9, 2026
Merged

feat(gateway): unified proxy support with SOCKS, DISCORD_PROXY, and multi-platform coverage#6814
teknium1 merged 2 commits into
mainfrom
hermes/hermes-25b83dfd

Conversation

@teknium1

@teknium1 teknium1 commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Unified proxy support for Discord gateway connections, including SOCKS5 proxy support critical for users behind the GFW. Salvaged from PR #6562 by @nocoo with additional improvements from #2208 by @jhbarnett.

What this PR does:

  • Shared resolve_proxy_url() in base.py — unified resolver for all platform adapters
  • macOS system proxy auto-detection via scutil --proxy (zero-config fallback)
  • DISCORD_PROXY env var override (highest priority, then HTTPS_PROXY/ALL_PROXY)
  • SOCKS5 proxy support via aiohttp_socks.ProxyConnector with rdns=True — required by Shadowrocket, Clash, and most SOCKS implementations for DNS-through-proxy
  • Proxy support for Discord image/document downloads
  • Proxy support for send_message_tool.py (Discord REST, Slack, SMS) for cron delivery
  • Telegram refactored to use the shared resolver (DRY)

Proxy resolution order:

  1. Platform-specific env var (e.g. DISCORD_PROXY)
  2. Generic env vars: HTTPS_PROXY, HTTP_PROXY, ALL_PROXY (+ lowercase)
  3. macOS system proxy via scutil --proxy

SOCKS handling:

  • HTTP proxy → proxy=url kwarg (native aiohttp)
  • SOCKS proxy → connector=ProxyConnector(url, rdns=True) (requires pip install aiohttp-socks)
  • Missing aiohttp_socks → graceful fallback with warning log

Files Changed

  • gateway/platforms/base.py — shared resolver + SOCKS connector helpers
  • gateway/platforms/discord.py — proxy for Bot, image download, document download
  • gateway/platforms/telegram_network.py — delegate to shared resolver
  • tools/send_message_tool.py — proxy for Discord REST, Slack, SMS
  • tests/gateway/test_discord_connect.py — updated mocks for proxy kwarg

Test Results

  • 49/49 discord + telegram network tests pass
  • 45/45 send_message tests pass
  • 2350/2350 gateway tests pass (12 pre-existing failures unrelated)
  • E2E: 10/10 proxy resolution + kwargs tests pass

Credits

Cherry-picked from PR #6562 by @nocoo (shared resolver, macOS detect, DRY Telegram). Additional proxy coverage for send_message_tool inspired by PR #2208 by @jhbarnett. SOCKS support addresses #6649 by @Microstronggo.

Fixes #6649
Supersedes #6562, #6052, #6184, #2208

Zheng Li and others added 2 commits April 9, 2026 14:08
…cOS auto-detection

- Add resolve_proxy_url() to base.py — shared by all platform adapters
- Check HTTPS_PROXY / HTTP_PROXY / ALL_PROXY env vars first
- Fall back to macOS system proxy via scutil --proxy (zero-config)
- Pass proxy= to discord.py commands.Bot() for gateway connectivity
- Refactor telegram_network.py to use shared resolver
- Update test fixtures to accept proxy kwarg
… proxy coverage

Follow-up improvements on top of the shared resolver from PR #6562:

- Add platform_env_var parameter to resolve_proxy_url() so DISCORD_PROXY
  takes priority over generic HTTPS_PROXY/ALL_PROXY env vars
- Add SOCKS proxy support via aiohttp_socks.ProxyConnector with rdns=True
  (critical for GFW/Shadowrocket/Clash users — issue #6649)
- proxy_kwargs_for_bot() returns connector= for SOCKS, proxy= for HTTP
- proxy_kwargs_for_aiohttp() returns split (session_kw, request_kw) for
  standalone aiohttp sessions
- Add proxy support to send_message_tool.py (Discord REST, Slack, SMS)
  for cron job delivery behind proxies (from PR #2208)
- Add proxy support to Discord image/document downloads
- Fix duplicate import sys in base.py
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Discord gateway fails to connect through SOCKS proxy -- missing proxy support

1 participant