fix: name the proxy schemes that work, and stop panicking on the rest

"Which proxy does this support?" has a narrower answer than the docs
gave. `golang.org/x/net/proxy.FromURL` resolves `socks5` and `socks5h`
and nothing else, yet the README and `Proxy`'s doc comment both offered
"socks5, socks4 and socks4a". A `socks4://` URI fails every dial with
`proxy: unknown scheme: socks4`, which is what taking the docs at their
word looks like from the caller's side.

Corrected both, and pointed at `proxy.RegisterDialerType` -- the way
x/net/proxy expects a caller to add a scheme it does not carry.

That escape hatch had a second problem waiting. `establishProxyConnection`
asserted the dialer to `proxy.ContextDialer` unconditionally, but a
registered dialer need only implement `Dial`, and the assertion panicked
on those:

    interface conversion: T is not proxy.ContextDialer: missing method
    DialContext

It now falls back to dialing on a goroutine and abandoning the attempt
when the context expires, which is what x/net/proxy itself does for the
same case.

Closes: #95
This commit is contained in:
dualfroz committed 2026-09-13 15:47:32 +02:00
1 parent 74c6cde98a
commit 87744aa7c1
4 files changed
+80 -3

No files matched your search

+4 -1
View File
@@ -135,7 +135,10 @@ If you want to disable catchAll checking, use the `DisableCatchAllCheck()` switc
Support setting a SOCKS5 proxy to verify the email, proxyURI should be in the format: `socks5://user:password@127.0.0.1:1080`
The protocol could be socks5, socks4 and socks4a.
The scheme must be `socks5` or `socks5h`, the only two `golang.org/x/net/proxy` resolves.
Anything else, `socks4` and `socks4a` included, fails the dial with `proxy: unknown scheme`;
add it with [`proxy.RegisterDialerType`](https://pkg.go.dev/golang.org/x/net/proxy#RegisterDialerType)
before calling `Proxy()`.
```go
var (