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)
}