Eugene Fryntov 4931feafa7 SOCKS4a implementation in upstreamproxy for supporting domain names, meek upstream proxy fix for supporting non-HTTP proxy schemes 10 лет назад
..
go-ntlm 396c4ed2fe Deleted broken utils from go-ntlm 10 лет назад
README.md c7903e112d Code review items addressed, documentation pending 10 лет назад
auth_basic.go cea14a2cbe HTTP Transport auth improvement in progress, Basic and NTLM working, Digest pending 10 лет назад
auth_digest.go 9baaa5b8dc HTTP auth improvements complete 10 лет назад
auth_ntlm.go cea14a2cbe HTTP Transport auth improvement in progress, Basic and NTLM working, Digest pending 10 лет назад
http_authenticator.go cea14a2cbe HTTP Transport auth improvement in progress, Basic and NTLM working, Digest pending 10 лет назад
proxy_http.go 42b9564a54 More meaningful proxy 'CONNECT' handshake error message 10 лет назад
proxy_socks4.go 4931feafa7 SOCKS4a implementation in upstreamproxy for supporting domain names, meek upstream proxy fix for supporting non-HTTP proxy schemes 10 лет назад
transport_proxy_auth.go 610406b7e0 Fix for null pointer dereference if proxy.User is nil 10 лет назад
upstreamproxy.go a296ec01e1 Fix upstreamproxy integration bugs 10 лет назад

README.md

upstreamproxy Package

This provides upstream proxy support by extending golang.org/x/net/proxy package.

Currently supported protocols:

  • SOCKS4 via socks4a URI scheme
  • SOCKS5 via socks5 URI scheme
  • HTTP 'CONNECT' with Basic, Digest and NTLM Authentication via http URI scheme

Usage

Note: NewProxyDialFunc returns ForwardDialFunc if ProxyURIString is empty

/* 
   Proxy URI examples:
   "http://proxyhost:8080"
   "socks5://user:password@proxyhost:1080"
   "http://NTDOMAIN\NTUser:password@proxyhost:3375"
*/

//Plain HTTP transport via HTTP proxy
func doAuthenticatedHTTP() {
	proxyUrl, err := url.Parse("http://user:password@172.16.1.1:8080")
	transport := &http.Transport{Proxy: http.ProxyURL(proxyUrl)}

	authHttpTransport, err := upstreamproxy.NewProxyAuthTransport(transport)
	if err != nil {
		fmt.Println("Error: ", err)
		return
	}
	r, err := http.NewRequest("GET", "http://www.reddit.com", bytes.NewReader(data))
	if err != nil {
		fmt.Println("Error: ", err)
		return
	}
	resp, err := authHttpTransport.RoundTrip(r)
	if err != nil {
		fmt.Println("RoundTrip Error: ", err)
		return
	}
	ioutil.ReadAll(resp.Body)
	fmt.Println(string(resp.Status))
}

//HTTPS transport via HTTP proxy
func doAuthenticatedHTTPS() {
	dialTlsFn := func(netw, addr string) (net.Conn, error) {
		config := &upstreamproxy.UpstreamProxyConfig{
			ForwardDialFunc: net.Dial,
			ProxyURIString:  "http://user:password@172.16.1.1:8080",
		}

		proxyDialFunc := upstreamproxy.NewProxyDialFunc(config)

		conn, err := proxyDialFunc(netw, addr)
		if err != nil {
			return nil, err
		}
		tlsconfig := &tls.Config{InsecureSkipVerify: false}
		tlsConn := tls.Client(conn, tlsconfig)

		return tlsConn, tlsConn.Handshake()
	}

	r, err := http.NewRequest("GET", "https://www.reddit.com", bytes.NewReader(data))
	transport = &http.Transport{DialTLS: dialTlsFn}
	resp, err := transport.RoundTrip(r)
	if err != nil {
		log.Println("RoundTrip Error: ", err)
		return
	}
	ioutil.ReadAll(resp.Body)
	fmt.Println(string(resp.Status))
}

//HTTP transport via SOCKS5 proxy
func doAuthenticatedHttpSocks() {
	dialFn := func(netw, addr string) (net.Conn, error) {
		config := &upstreamproxy.UpstreamProxyConfig{
			ForwardDialFunc: net.Dial,
			ProxyURIString:  "socks5://user:password@172.16.1.1:5555",
		}

		proxyDialFunc := upstreamproxy.NewProxyDialFunc(config)

		return proxyDialFunc(netw, addr)
	}

	r, err := http.NewRequest("GET", "https://www.reddit.com", bytes.NewReader(data))
	transport = &http.Transport{Dial: dialFn}
	resp, err := transport.RoundTrip(r)
	if err != nil {
		log.Println("RoundTrip Error: ", err)
		return
	}
	ioutil.ReadAll(resp.Body)
	fmt.Println(string(resp.Status))
}