get proxy working
This commit is contained in:
47
proxy/proxy.go
Normal file
47
proxy/proxy.go
Normal file
@ -0,0 +1,47 @@
|
||||
package proxy
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/url"
|
||||
|
||||
"golang.org/x/net/proxy"
|
||||
)
|
||||
|
||||
func GetClient(proxy string) (*http.Client, error) {
|
||||
proxyUrl, err := url.Parse(proxy)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to parse proxyUrl, url:%s, err: %w", proxy, err)
|
||||
}
|
||||
if proxyUrl.Host == "unix" && proxyUrl.Scheme == "socks5" &&
|
||||
len(proxyUrl.Path) > 1 /* Path cannot be empty or just / */ {
|
||||
return unixSocks5Proxy(proxyUrl.Path)
|
||||
}
|
||||
return proxyHttp(proxyUrl)
|
||||
}
|
||||
|
||||
func unixSocks5Proxy(path string) (*http.Client, error) {
|
||||
// TODO: Auth?
|
||||
dialer, err := proxy.SOCKS5("unix", path, nil /*auth*/, nil)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to make socks proxy, path: %s, err: %w", path, err)
|
||||
}
|
||||
ctxDialer, ok := dialer.(proxy.ContextDialer)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("proxy.SOCKS5 did not return a ContextDialer") // This should never happen
|
||||
}
|
||||
|
||||
return &http.Client{
|
||||
Transport: &http.Transport{
|
||||
DialContext: ctxDialer.DialContext,
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
func proxyHttp(proxyUrl *url.URL) (*http.Client, error) {
|
||||
return &http.Client{
|
||||
Transport: &http.Transport{
|
||||
Proxy: http.ProxyURL(proxyUrl),
|
||||
},
|
||||
}, nil
|
||||
}
|
Reference in New Issue
Block a user