在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