SOCKS5 հոսթանունների լուծումը Go-ի HTTP հաճախորդում
Ինչու socks5-ն ու socks5h-ն Go-ի ստանդարտ HTTP տրանսպորտում DNS-ի տարբեր ռեժիմներ չեն ընտրում։
Go 1.27.3-ի ստանդարտ HTTP տրանսպորտում 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-ի փոխանցումը։