In het standaard-HTTP-transport van Go 1.27.3 behandelen socks5 en socks5h bestemmingsnamen hetzelfde. Een doel met hostnaam wordt als hostnaam naar de proxy gestuurd. Wisselen tussen deze schema’s schakelt niet tussen lokale en externe DNS zoals bij curl.

package main

import (
    "fmt"
    "log"
    "net/http"
    "net/url"
    "time"
)

func main() {
    proxyURL, err := url.Parse("socks5://203.0.113.10:1080")
    if err != nil {
        log.Fatal(err)
    }

    transport := http.DefaultTransport.(*http.Transport).Clone()
    transport.Proxy = http.ProxyURL(proxyURL)
    defer transport.CloseIdleConnections()

    client := &http.Client{
        Transport: transport,
        Timeout: 15 * time.Second,
    }
    response, err := client.Get("https://example.com/")
    if err != nil {
        log.Fatal(err)
    }
    defer response.Body.Close()
    fmt.Println(response.StatusCode)
}

Vervang het documentatieadres door je SOCKS5-endpoint; kandidaten vind je in de lijst met SOCKS5-proxy’s. Het voorbeeld gebruikt het eigen transport van net/http; een andere Go-bibliotheek kan zich anders gedragen.

Twee namen moeten nog wel worden onderscheiden. Een numeriek proxyadres heeft geen proxyhostlookup nodig; een proxy met naam moet lokaal worden gevonden voordat een SOCKS-request kan worden verstuurd. Een numerieke bestemming heeft geen doelnaam om om te zetten en toont de hostnaamverwerking niet aan. Controleer voor de daadwerkelijke SOCKS-keuze of het bestemmingsveld een naam of een adres bevat.

Het standaardtransport ondersteunt de proxyschema’s http, https, socks5 en socks5h. Een algemeen SOCKS-label bewijst geen SOCKS5-ondersteuning op een endpoint. Dit voorbeeld verstuurt HTTP over TCP en test geen andere SOCKS-opdrachten of UDP-relay.

Gerelateerde artikelen