source change go https request ip-address resolve

go - change - curl https php



golang fuerza la solicitud http a ip especĂ­fica(similar a curl--resolver) (2)

La respuesta anterior de OneOfOne es excelente. Estoy publicando el código completo del paquete de trabajo aquí para que sea más fácil para noobs como yo. Agregué un par de println para que pueda ver el valor addr antes y después de la modificación.

package main import ( "context" "fmt" "log" "net" "net/http" "time" ) func main() { dialer := &net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, DualStack: true, } // 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) { fmt.Println("address original =", addr) if addr == "google.com:443" { addr = "216.58.198.206:443" fmt.Println("address modified =", addr) } return dialer.DialContext(ctx, network, addr) } resp, err := http.Get("https://google.com") log.Println(resp.Header, err) }

¿Cómo puedo forzar una solicitud de obtención de https de golang para usar una dirección IP específica? Quiero omitir la resolución DNS y proporcionar la IP yo mismo. El equivalente en curl sería un --resolver como se ilustra a continuación.

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

Como esto es SSL, quiero evitar sustituir en el IP por el dominio como en el siguiente ejemplo.

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


Puede proporcionar una función Transport.DialContext personalizada.

func main() { dialer := &net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, DualStack: true, } // 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) }