حل نام میزبان SOCKS5 در کلاینت HTTP زبان Go
چرا socks5 و socks5h در انتقال استاندارد HTTP زبان Go حالتهای متفاوت DNS انتخاب نمیکنند.
در انتقال استاندارد HTTP در Go 1.27.3، socks5 و socks5h نام مقصد را یکسان پردازش میکنند. مقصد دارای نام میزبان، بهصورت نام میزبان برای پراکسی فرستاده میشود. تغییر این طرحها مانند curl بین DNS محلی و راهدور جابهجا نمیکند.
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 را آزمایش میکند.