source - Golang Force http Anfrage an spezifische IP(ähnlich wie Curl-Resolve)




curlopt_resolve (2)

OneOfOne's obige Antwort ist ausgezeichnet. Ich poste hier den vollen Arbeitspaketcode, um es Noobs wie mir zu erleichtern. Ich fügte ein paar println hinzu, so dass Sie den Addr-Wert vor und nach der Änderung sehen konnten.

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

Wie kann ich eine Golfang-HTTPS-Anfrage erzwingen, eine bestimmte IP-Adresse zu verwenden. Ich möchte die DNS-Auflösung überspringen und die IP selbst bereitstellen. Das Äquivalent in der Krümmung wäre eine - Auflösung wie unten dargestellt.

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

Da dies ssl ist, möchte ich vermeiden, die IP für die Domäne wie im folgenden Beispiel zu ersetzen.

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


Sie können eine benutzerdefinierte Transport.DialContext Funktion bereitstellen.

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




resolve