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