Golang Tunnel Proxy: net/http and resty Four IP Control Scenarios
Go net/http and resty implement four tunnel proxy scenarios. Transport.ProxyConnectHeader natively supports HTTPS Proxy-Tunnel.
16Yun Engineering TeamMay 29, 20261 min read
Go's Proxy Advantage
Go's net/http standard library supports custom headers at the HTTPS CONNECT stage via Transport.ProxyConnectHeader — a unique advantage over Python's requests.
Setup
export PROXY_HOST=t.16yun.cn
export PROXY_PORT=31111
export PROXY_USERNAME=your-username
export PROXY_PASSWORD=your-password
export PROXY_TUNNEL=golang-demo-12345
net/http Standard Library
Scenario A: Force New IP
tr := &http.Transport{
Proxy: http.ProxyURL(proxyURL),
DisableKeepAlives: true,
}
client := &http.Client{Transport: tr, Timeout: 15 * time.Second}
req, _ := http.NewRequest("GET", target, nil)
req.Header.Set("Connection", "close")
req.SetBasicAuth(user, pass)
resp, _ := client.Do(req)
Scenario B: Keep-Alive Same IP
tr := &http.Transport{
Proxy: http.ProxyURL(proxyURL),
DisableKeepAlives: false,
MaxIdleConns: 10,
IdleConnTimeout: 30 * time.Second,
}
client := &http.Client{Transport: tr, Timeout: 15 * time.Second}
Scenario C-HTTPS: Proxy-Tunnel via ProxyConnectHeader
connectHeaders := http.Header{}
connectHeaders.Set("Proxy-Tunnel", tunnelVal)
tr := &http.Transport{
Proxy: http.ProxyURL(proxyURL),
ProxyConnectHeader: connectHeaders, // Sent during CONNECT
DisableKeepAlives: false,
}
client := &http.Client{Transport: tr, Timeout: 15 * time.Second}
ProxyConnectHeaderis a standardnet/httpfeature. Any Go HTTP client built onnet/http(includingresty) can leverage this.
resty
// Scenario A: Force new
client := resty.New()
client.SetProxy(proxyURL.String())
client.SetTransport(&http.Transport{DisableKeepAlives: true})
resp, _ := client.R().Get("https://httpbin.org/ip")
// Scenario B: Keep-Alive
client := resty.New()
client.SetProxy(proxyURL.String())
client.SetTransport(&http.Transport{DisableKeepAlives: false, MaxIdleConns: 10})
// Scenario C-HTTPS: Proxy-Tunnel
client := resty.New()
client.SetTransport(&http.Transport{
Proxy: http.ProxyURL(proxyURL),
ProxyConnectHeader: http.Header{
"Proxy-Tunnel": []string{tunnelVal},
},
})
Scenario Comparison
| Scenario | net/http | resty |
|---|---|---|
| A | DisableKeepAlives: true | New resty.New() each time |
| B | Reuse Transport | Reuse resty instance |
| C-HTTP | Request header | SetHeader("Proxy-Tunnel", ...) |
| C-HTTPS | ProxyConnectHeader | Via underlying Transport |
Need an enterprise proxy plan?
We can tailor architecture to your target domains, concurrency, and reliability goals.