SOCKS5 ჰოსტის სახელების ამოხსნა Go-ის HTTP კლიენტში
რატომ არ ირჩევენ socks5 და socks5h სხვადასხვა DNS რეჟიმს Go-ის სტანდარტულ HTTP ტრანსპორტში.
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-ის გადაცემას.