ការដោះស្រាយឈ្មោះម៉ាស៊ីន SOCKS5 ក្នុង HTTP client របស់ Go
យល់ពីមូលហេតុដែល socks5 និង socks5h មិនជ្រើសរើសរបៀប DNS ខុសគ្នានៅក្នុង HTTP transport ស្តង់ដាររបស់ Go។
នៅក្នុង HTTP transport ស្តង់ដាររបស់ Go 1.27.3, socks5 និង socks5h ដំណើរការឈ្មោះគោលដៅដូចគ្នា។ គោលដៅដែលកំណត់ជាឈ្មោះម៉ាស៊ីនត្រូវបានផ្ញើទៅប្រូកស៊ីជាឈ្មោះម៉ាស៊ីន។ ការប្ដូរ scheme ទាំងនេះមិនប្ដូរ រវាង 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 endpoint របស់អ្នក; អ្នកអាចរកមើលជម្រើសក្នុង បញ្ជីប្រូកស៊ី SOCKS5។ ឧទាហរណ៍ប្រើ transport ផ្ទាល់របស់ net/http; បណ្ណាល័យ Go ផ្សេងអាចអនុវត្តឥរិយាបថខុសគ្នា។
នៅតែមានឈ្មោះពីរដែលត្រូវបែងចែក។ អាសយដ្ឋានប្រូកស៊ីជាលេខមិនត្រូវការស្វែងរកឈ្មោះម៉ាស៊ីនប្រូកស៊ីទេ; ប្រូកស៊ីដែលកំណត់ជាឈ្មោះត្រូវរកឃើញនៅមូលដ្ឋាន មុនពេលអាចផ្ញើសំណើ SOCKS។ គោលដៅជាលេខគ្មានឈ្មោះគោលដៅដែលត្រូវដោះស្រាយ ហើយមិនអាចបង្ហាញការដំណើរការឈ្មោះម៉ាស៊ីនបានទេ។ ដើម្បីពិនិត្យជម្រើសពិតប្រាកដរបស់ SOCKS សូមមើលថាវាលគោលដៅមានឈ្មោះ ឬអាសយដ្ឋាន។
transport ស្តង់ដារគាំទ្រ proxy scheme http, https, socks5 និង socks5h។ ស្លាក SOCKS ទូទៅមិនបញ្ជាក់ថា endpoint គាំទ្រ SOCKS5 ទេ។ ឧទាហរណ៍នេះផ្ញើ HTTP តាម TCP ហើយមិនសាកល្បងពាក្យបញ្ជា SOCKS ផ្សេង ឬការបញ្ជូនបន្ត UDP ទេ។