ການແກ້ໄຂຊື່ໂຮສ SOCKS5 ໃນ HTTP client ຂອງ Go
ເຂົ້າໃຈວ່າເປັນຫຍັງ socks5 ແລະ socks5h ຈຶ່ງບໍ່ເລືອກໂໝດ DNS ຕ່າງກັນໃນ HTTP transport ມາດຕະຖານຂອງ Go.
ໃນ HTTP transport ມາດຕະຖານຂອງ Go 1.27.3, socks5 ແລະ socks5h ຈັດການຊື່ປາຍທາງແບບດຽວກັນ. ເປົ້າໝາຍທີ່ລະບຸເປັນຊື່ໂຮສຈະຖືກສົ່ງໄປຫາພຣັອກຊີເປັນຊື່ໂຮສ. ການປ່ຽນ scheme ເຫຼົ່ານີ້ບໍ່ໄດ້ສະຫຼັບ ລະຫວ່າງ DNS ພາຍໃນເຄື່ອງ ແລະ 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.