Rezoluția numelor SOCKS5 în clientul HTTP Go
De ce socks5 și socks5h nu aleg moduri DNS diferite în transportul HTTP standard Go.
În transportul HTTP standard din Go 1.27.3, socks5 și socks5h tratează numele destinației la fel. O țintă cu nume de gazdă este trimisă proxy-ului ca nume de gazdă. Schimbarea acestor scheme nu comută între DNS local și la distanță ca în 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)
}
Înlocuiți adresa de documentație cu punctul final SOCKS5 propriu; candidați se găsesc în lista de proxy-uri SOCKS5. Exemplul folosește transportul propriu net/http; altă bibliotecă Go poate implementa alt comportament.
Tot trebuie distinse două nume. O adresă numerică de proxy nu necesită căutarea gazdei proxy-ului; un proxy indicat prin nume trebuie găsit local înainte de trimiterea unei cereri SOCKS. O destinație numerică nu are nume de rezolvat și nu demonstrează tratarea numelor de gazdă. Pentru alegerea SOCKS efectivă, verificați dacă câmpul destinației poartă un nume sau o adresă.
Transportul standard acceptă schemele proxy http, https, socks5 și socks5h. O etichetă generică SOCKS nu dovedește suport SOCKS5 la punctul final. Exemplul trimite HTTP peste TCP și nu testează alte comenzi SOCKS sau retransmisie UDP.