Разрешување имиња преку SOCKS5 во HTTP-клиентот на Go
Зошто socks5 и socks5h не избираат различни DNS-режими во стандардниот HTTP-транспорт на Go.
Во стандардниот HTTP-транспорт на Go 1.27.3, socks5 и socks5h ги обработуваат имињата на одредиштата на ист начин. Одредиште зададено со име на хост се испраќа до проксито како име на хост. Промената на овие шеми не префрла меѓу локален и оддалечен DNS како во 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)
}
Заменете ја адресата за документација со вашата крајна точка SOCKS5; кандидати има во списокот со SOCKS5-проксија. Примерот го користи транспортот на самиот net/http; друга Go-библиотека може да има поинакво однесување.
Сепак треба да се разликуваат две имиња. Нумеричка адреса на прокси не бара пребарување на прокси-хостот; прокси зададено со име мора да се најде локално пред да се испрати барање SOCKS. Нумеричко одредиште нема име за разрешување и не може да ја покаже обработката на имиња на хостови. За да го испитате вистинскиот избор во SOCKS, проверете дали полето за одредиште содржи име или адреса.
Стандардниот транспорт ги поддржува прокси-шемите http, https, socks5 и socks5h. Општа ознака SOCKS не докажува поддршка за SOCKS5 на крајната точка. Овој пример испраќа HTTP преку TCP и не испитува други команди SOCKS ниту пренесување UDP.