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}

ProxyConnectHeader is a standard net/http feature. Any Go HTTP client built on net/http (including resty) 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

Scenarionet/httpresty
ADisableKeepAlives: trueNew resty.New() each time
BReuse TransportReuse resty instance
C-HTTPRequest headerSetHeader("Proxy-Tunnel", ...)
C-HTTPSProxyConnectHeaderVia underlying Transport

Need an enterprise proxy plan?

We can tailor architecture to your target domains, concurrency, and reliability goals.