I standard-HTTP-transporten i Go 1.27.3 behandler socks5 og socks5h destinationsnavne ens. Et mål angivet med værtsnavn sendes som værtsnavn til proxyen. Skift af disse skemaer skifter ikke mellem lokal og fjern DNS som i 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)
}

Erstat dokumentationsadressen med dit SOCKS5-endepunkt; kandidater kan findes på listen over SOCKS5-proxyer. Eksemplet bruger net/http’s egen transport; et andet Go-bibliotek kan implementere anden adfærd.

Der er stadig to navne at skelne mellem. En numerisk proxyadresse kræver intet opslag af proxyværten; en navngiven proxy skal findes lokalt, før en SOCKS-forespørgsel kan sendes. En numerisk destination har intet målnavn at slå op og kan ikke demonstrere værtsnavnehåndtering. Se på, om destinationsfeltet indeholder et navn eller en adresse, for at undersøge det faktiske SOCKS-valg.

Standardtransporten understøtter proxyskemaerne http, https, socks5 og socks5h. Et generisk SOCKS-mærke fastslår ikke SOCKS5-understøttelse på et endepunkt. Eksemplet sender HTTP over TCP og tester hverken andre SOCKS-kommandoer eller UDP-videresendelse.

Relaterede artikler