gohttpsrequestip-addressresolve

golang force http request to specific ip (similar to curl --resolve)


How can I force a golang https get request to use a specific IP address. I want to skip DNS resolution and provide the IP myself. The equivalent in curl would be a --resolve as illustrated below.

curl https://domain.com/dir/filename --resolve "domain.com:443:10.10.10.10"

Since this is ssl I want to avoid substituting in the IP for the domain as in the following example.

curl https://10.10.10.10/dir/filename --header "Host: domain.com"


Solution

  • You can provide a custom Transport.DialContext function.

    func main() {
        dialer := &net.Dialer{
            Timeout:   30 * time.Second,
            KeepAlive: 30 * time.Second,
            // DualStack: true, // this is deprecated as of go 1.16
        }
        // or create your own transport, there's an example on godoc.
        http.DefaultTransport.(*http.Transport).DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
            if addr == "google.com:443" {
                addr = "216.58.198.206:443"
            }
            return dialer.DialContext(ctx, network, addr)
        }
        resp, err := http.Get("https://google.com")
        log.Println(resp.Header, err)
    }