"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como forçar conexões IPv4 ou IPv6 no cliente net/http do Go?

Como forçar conexões IPv4 ou IPv6 no cliente net/http do Go?

Publicado em 2024-11-12
Navegar:876

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

Forçar IPv4 ou IPv6 no cliente net/http

No Go 1.11, o pacote net/http fornece uma função DialContext que permite que você interceptar e controlar a conexão de rede de saída. Esta função pode ser usada para forçar o cliente a usar IPv4 ou IPv6.

Conexões somente IPv4

Para restringir conexões a endereços IPv4, modifique o campo DualStack de o Dialer para false e defina uma função de controle que retorne um erro para o tipo de rede "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)
    }
}

Esta modificação intercepta conexões de rede e retorna um erro se uma conexão IPv4 for tentada.

Nota: O valor de rede passado para a função de controle pode ser "tcp4" para IPv4 e "tcp6" para IPv6, mesmo que "tcp" tenha sido passado para a função DialContext.

Conexões somente IPv6

Para forçar conexões somente IPv6, defina DualStack como falso e retorne um erro para o tipo de rede "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)
    }
}
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3