在net/http客戶端強制使用IPv4或IPv6
在Go 1.11中,net/http套件提供了一個DialContext函數,允許你攔截並控制傳出的網路連線。此函數可用於強制用戶端使用 IPv4 或 IPv6。
IPv4-Only Connections
若要限制與IPv4 位址的連接,請修改DualStack 欄位將Dialer 設定為false 並定義一個控制函數,該函數會傳回網路類型控制函數,該函數會傳回網路類型控制函數「ipv4」的錯誤:
type MyTransport struct {
http.RoundTripper
}
func (t *MyTransport) RoundTrip(req *http.Request) (*http.Response, error) {
return http.DefaultTransport.RoundTrip(req)
}
func main() {
MyTransport := &MyTransport{
DialContext: (&net.Dialer{
DualStack: false,
Control: func(network, address string, c syscall.RawConn) error {
if network == "ipv4" {
return errors.New("you should not use ipv4")
}
return nil
},
}).DialContext,
}
client := http.Client{Transport: MyTransport}
_, err := client.Get("http://www.github.com")
if err != nil {
fmt.Println(err)
}
}
此修改會攔截網路連接,如果嘗試 IPv4 連接,則傳回錯誤。
注意: 傳遞給 Control 函數的網路值可以是「tcp4」對於 IPv4 和「tcp6」對於 IPv6,即使「tcp」已傳遞給 DialContext 函數。
僅限IPv6連接
要強制僅使用IPv6 連接,請將DualStack 設定為false 並返回網路類型「ipv6」的錯誤:
type MyTransport struct {
http.RoundTripper
}
func (t *MyTransport) RoundTrip(req *http.Request) (*http.Response, error) {
return http.DefaultTransport.RoundTrip(req)
}
func main() {
MyTransport := &MyTransport{
DialContext: (&net.Dialer{
DualStack: false,
Control: func(network, address string, c syscall.RawConn) error {
if network == "ipv6" {
return errors.New("you should not use ipv6")
}
return nil
},
}).DialContext,
}
client := http.Client{Transport: MyTransport}
_, err := client.Get("http://www.github.com")
if err != nil {
fmt.Println(err)
}
}
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3