github.com/Psiphon-Labs/psiphon-tunnel-core@v2.0.28+incompatible/psiphon/upstreamproxy/README.md (about)

     1  `upstreamproxy` Package
     2  =======================
     3  
     4  This provides upstream proxy support by extending golang.org/x/net/proxy package.
     5  
     6  Currently supported protocols:
     7  * SOCKS4 via `socks4a` URI scheme
     8  * SOCKS5 via `socks5` URI scheme
     9  * HTTP 'CONNECT' with Basic, Digest and NTLM Authentication via `http` URI scheme
    10  
    11  # Usage
    12  
    13  Note: `NewProxyDialFunc` returns `ForwardDialFunc` if `ProxyURIString` is empty
    14  
    15  ```
    16  /* 
    17     Proxy URI examples:
    18     "http://proxyhost:8080"
    19     "socks5://user:password@proxyhost:1080"
    20     "http://NTDOMAIN\NTUser:password@proxyhost:3375"
    21  */
    22  
    23  //Plain HTTP transport via HTTP proxy
    24  func doAuthenticatedHTTP() {
    25  	proxyUrl, err := url.Parse("http://user:password@172.16.1.1:8080")
    26  	transport := &http.Transport{Proxy: http.ProxyURL(proxyUrl)}
    27  	customHeader := http.Header{"Test" :{"test"}}
    28  
    29  	authHttpTransport, err := upstreamproxy.NewProxyAuthTransport(transport, customHeader)
    30  	if err != nil {
    31  		fmt.Println("Error: ", err)
    32  		return
    33  	}
    34  	r, err := http.NewRequest("GET", "http://www.reddit.com", bytes.NewReader(data))
    35  	if err != nil {
    36  		fmt.Println("Error: ", err)
    37  		return
    38  	}
    39  	resp, err := authHttpTransport.RoundTrip(r)
    40  	if err != nil {
    41  		fmt.Println("RoundTrip Error: ", err)
    42  		return
    43  	}
    44  	ioutil.ReadAll(resp.Body)
    45  	fmt.Println(string(resp.Status))
    46  }
    47  
    48  //HTTPS transport via HTTP proxy
    49  func doAuthenticatedHTTPS() {
    50  	dialTlsFn := func(netw, addr string) (net.Conn, error) {
    51  		config := &upstreamproxy.UpstreamProxyConfig{
    52  			ForwardDialFunc: net.Dial,
    53  			ProxyURIString:  "http://user:password@172.16.1.1:8080",
    54  		}
    55  
    56  		proxyDialFunc := upstreamproxy.NewProxyDialFunc(config)
    57  
    58  		conn, err := proxyDialFunc(netw, addr)
    59  		if err != nil {
    60  			return nil, err
    61  		}
    62  		tlsconfig := &tls.Config{InsecureSkipVerify: false}
    63  		tlsConn := tls.Client(conn, tlsconfig)
    64  
    65  		return tlsConn, tlsConn.Handshake()
    66  	}
    67  
    68  	r, err := http.NewRequest("GET", "https://www.reddit.com", bytes.NewReader(data))
    69  	transport = &http.Transport{DialTLS: dialTlsFn}
    70  	resp, err := transport.RoundTrip(r)
    71  	if err != nil {
    72  		log.Println("RoundTrip Error: ", err)
    73  		return
    74  	}
    75  	ioutil.ReadAll(resp.Body)
    76  	fmt.Println(string(resp.Status))
    77  }
    78  
    79  //HTTP transport via SOCKS5 proxy
    80  func doAuthenticatedHttpSocks() {
    81  	dialFn := func(netw, addr string) (net.Conn, error) {
    82  		config := &upstreamproxy.UpstreamProxyConfig{
    83  			ForwardDialFunc: net.Dial,
    84  			ProxyURIString:  "socks5://user:password@172.16.1.1:5555",
    85  		}
    86  
    87  		proxyDialFunc := upstreamproxy.NewProxyDialFunc(config)
    88  
    89  		return proxyDialFunc(netw, addr)
    90  	}
    91  
    92  	r, err := http.NewRequest("GET", "https://www.reddit.com", bytes.NewReader(data))
    93  	transport = &http.Transport{Dial: dialFn}
    94  	resp, err := transport.RoundTrip(r)
    95  	if err != nil {
    96  		log.Println("RoundTrip Error: ", err)
    97  		return
    98  	}
    99  	ioutil.ReadAll(resp.Body)
   100  	fmt.Println(string(resp.Status))
   101  }
   102  ```
   103