Rod Hynes ba905f65b3 Fix: missing assignment in 4931fea 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 ba905f65b3 Fix: missing assignment in 4931fea 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:[email protected]: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:[email protected]: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:[email protected]: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))
}