Принудительное использование IPv4 или IPv6 в клиенте net/http
В Go 1.11 пакет net/http предоставляет функцию DialContext, которая позволяет вам перехватывать и контролировать исходящее сетевое соединение. Эту функцию можно использовать, чтобы заставить клиента использовать IPv4 или IPv6.
Подключения только для IPv4
Чтобы ограничить подключения адресами IPv4, измените поле DualStack в Присвойте номеронабирателю значение 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.
Примечание: Сетевое значение, передаваемое в функцию управления, может быть «tcp4» для IPv4 и «tcp6» для IPv6, даже если «tcp» был передан в DialContext function.
Подключения только для 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