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))
}