feat: support socks5h scheme for proxy settings
This commit is contained in:
@@ -734,7 +734,7 @@ func newProxyAwareWebsocketDialer(cfg *config.Config, auth *cliproxyauth.Auth) *
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch setting.URL.Scheme {
|
switch setting.URL.Scheme {
|
||||||
case "socks5":
|
case "socks5", "socks5h":
|
||||||
var proxyAuth *proxy.Auth
|
var proxyAuth *proxy.Auth
|
||||||
if setting.URL.User != nil {
|
if setting.URL.User != nil {
|
||||||
username := setting.URL.User.Username()
|
username := setting.URL.User.Username()
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ func Parse(raw string) (Setting, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch parsedURL.Scheme {
|
switch parsedURL.Scheme {
|
||||||
case "socks5", "http", "https":
|
case "socks5", "socks5h", "http", "https":
|
||||||
setting.Mode = ModeProxy
|
setting.Mode = ModeProxy
|
||||||
setting.URL = parsedURL
|
setting.URL = parsedURL
|
||||||
return setting, nil
|
return setting, nil
|
||||||
@@ -95,7 +95,7 @@ func BuildHTTPTransport(raw string) (*http.Transport, Mode, error) {
|
|||||||
case ModeDirect:
|
case ModeDirect:
|
||||||
return NewDirectTransport(), setting.Mode, nil
|
return NewDirectTransport(), setting.Mode, nil
|
||||||
case ModeProxy:
|
case ModeProxy:
|
||||||
if setting.URL.Scheme == "socks5" {
|
if setting.URL.Scheme == "socks5" || setting.URL.Scheme == "socks5h" {
|
||||||
var proxyAuth *proxy.Auth
|
var proxyAuth *proxy.Auth
|
||||||
if setting.URL.User != nil {
|
if setting.URL.User != nil {
|
||||||
username := setting.URL.User.Username()
|
username := setting.URL.User.Username()
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ func TestParse(t *testing.T) {
|
|||||||
{name: "http", input: "http://proxy.example.com:8080", want: ModeProxy},
|
{name: "http", input: "http://proxy.example.com:8080", want: ModeProxy},
|
||||||
{name: "https", input: "https://proxy.example.com:8443", want: ModeProxy},
|
{name: "https", input: "https://proxy.example.com:8443", want: ModeProxy},
|
||||||
{name: "socks5", input: "socks5://proxy.example.com:1080", want: ModeProxy},
|
{name: "socks5", input: "socks5://proxy.example.com:1080", want: ModeProxy},
|
||||||
|
{name: "socks5h", input: "socks5h://proxy.example.com:1080", want: ModeProxy},
|
||||||
{name: "invalid", input: "bad-value", want: ModeInvalid, wantErr: true},
|
{name: "invalid", input: "bad-value", want: ModeInvalid, wantErr: true},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,3 +138,24 @@ func TestBuildHTTPTransportSOCKS5ProxyInheritsDefaultTransportSettings(t *testin
|
|||||||
t.Fatalf("TLSHandshakeTimeout = %v, want %v", transport.TLSHandshakeTimeout, defaultTransport.TLSHandshakeTimeout)
|
t.Fatalf("TLSHandshakeTimeout = %v, want %v", transport.TLSHandshakeTimeout, defaultTransport.TLSHandshakeTimeout)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBuildHTTPTransportSOCKS5HProxy(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
transport, mode, errBuild := BuildHTTPTransport("socks5h://proxy.example.com:1080")
|
||||||
|
if errBuild != nil {
|
||||||
|
t.Fatalf("BuildHTTPTransport returned error: %v", errBuild)
|
||||||
|
}
|
||||||
|
if mode != ModeProxy {
|
||||||
|
t.Fatalf("mode = %d, want %d", mode, ModeProxy)
|
||||||
|
}
|
||||||
|
if transport == nil {
|
||||||
|
t.Fatal("expected transport, got nil")
|
||||||
|
}
|
||||||
|
if transport.Proxy != nil {
|
||||||
|
t.Fatal("expected SOCKS5H transport to bypass http proxy function")
|
||||||
|
}
|
||||||
|
if transport.DialContext == nil {
|
||||||
|
t.Fatal("expected SOCKS5H transport to have custom DialContext")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user