"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment forcer les connexions IPv4 ou IPv6 dans le client net/http de Go ?

Comment forcer les connexions IPv4 ou IPv6 dans le client net/http de Go ?

Publié le 2024-11-12
Parcourir:413

How to force IPv4 or IPv6 connections in Go\'s net/http client?

Forcer IPv4 ou IPv6 dans le client net/http

Dans Go 1.11, le package net/http fournit une fonction DialContext qui vous permet de intercepter et contrôler la connexion réseau sortante. Cette fonction peut être utilisée pour forcer le client à utiliser IPv4 ou IPv6.

Connexions IPv4 uniquement

Pour restreindre les connexions aux adresses IPv4, modifiez le champ DualStack de le numéroteur sur false et définissez une fonction de contrôle qui renvoie une erreur pour le type de réseau "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)
    }
}

Cette modification intercepte les connexions réseau et renvoie une erreur si une connexion IPv4 est tentée.

Remarque : La valeur réseau transmise à la fonction Contrôle peut être "tcp4" pour IPv4 et "tcp6" pour IPv6, même si "tcp" a été transmis à la fonction DialContext.

IPv6-Only Connexions

Pour forcer les connexions IPv6 uniquement, définissez DualStack sur false et renvoyez une erreur pour le type de réseau "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)
    }
}
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3