Maison  >  Article  >  développement back-end  >  502 Mauvaise passerelle : échec de net/http GET pour le tunnel IPSec

502 Mauvaise passerelle : échec de net/http GET pour le tunnel IPSec

PHPz
PHPzavant
2024-02-09 13:09:25671parcourir

502 错误网关:IPSec 隧道的 net/http GET 失败

L'éditeur PHP Zimo rencontre parfois une invite 502 Bad Gateway lors de l'utilisation d'Internet. Ce message d'erreur signifie qu'il y a un problème de communication entre le serveur de passerelle et le serveur en amont, entraînant l'échec de la requête. L'une des causes possibles est un échec net/http GET pour le tunnel IPSec. Bien que cette erreur puisse prêter à confusion, en comprenant sa cause et ses solutions, nous pouvons résoudre rapidement le problème et continuer à profiter de la commodité d'Internet.

Contenu de la question

Transmis sur windows ipsec 隧道(vpn) 使用 net/http 包发出远程 get 请求时,get 请求失败,响应代码为 502 bad gateway。但是,由 curl 发送的具有相同 headersurimethod 的请求效果很好。 go Le code source est le suivant :

    var req *http.request
    req, err = http.newrequest('get', *uri, reader)
    if nil != err {
        level.warn(log).log("msg", "unable to create request", "err", err, "uri", uri)
        return nil, err
    }
    if nil != req.body {
        defer req.body.close()
    }
    for h, v := range opts.headers {
        req.header.add(h, *v)
    }

    client := http.client{}
    if nil != err {
        return nil, err
    }
    res, err := client.do(req)
    if nil != err {
        level.warn(log).log("msg", "unable to send request", "err", err, "uri", uri)
        return nil, err
    }
    defer res.body.close()

    buf, err := io.readall(res.body)
    if nil != err {
        level.warn(log).log("msg", "unable to read response", "err", err, "uri", uri, "status", res.status, "status_code", res.statuscode)
        return nil, err
    }

Après avoir analysé la capture de paquets du trafic, nous avons constaté que la requête envoyée par vpn接口可以正常抓到curl发送的请求,但是getgo(net/http) était perdue.

Ensuite, je suppose que cela pourrait être dû au fait que le framework choisit la mauvaise interface pour envoyer le paquet.

J'essaie donc de trouver la bonne interface réseau local et précise sa localaddr 来发送我的 get requête comme ceci :

func Client(u string) (*http.Client, error) {
    uri, err := url.Parse(u)
    if nil != err {
        return nil, err
    }
    host := uri.Host
    port := uri.Port()
    if Empty == port {
        if uri.Scheme == "http" {
            host = host + ":80"
        } else if uri.Scheme == "https" {
            host = host + ":443"
        }
    }
    conn, err := net.Dial("tcp", host)
    if nil != err {
        return nil, err
    }
    addr := conn.LocalAddr().(*net.TCPAddr)
    // **make sure using random port as local port**
    addr.Port = 0

    dialer := &net.Dialer{LocalAddr: addr}
    dialContext := func(ctx context.Context, network, addr string) (net.Conn, error) {
        conn, err := dialer.Dial(network, addr)
        return conn, err
    }

    transport := &http.Transport{DialContext: dialContext}
    client := &http.Client{
        Transport: transport,
    }
    return client, nil
}

Les requêtes avec client 函数替换 client 后,get fonctionnent enfin.

client := &http.client{} => client, err := client(uri)

Ma question est donc la suivante : pourquoi golang ne sélectionne pas la bonne interface réseau locale pour envoyer automatiquement la demande ? golang 没有选择正确的本地网络接口来自动发送请求?

解决方法

调试net.dial#DialContext后,发现该地址已更改为我在Visual Studio Code

Solution de contournement

net.dialAprès le débogage de net.dial#DialContext, j'ai constaté que l'adresse avait été remplacée par l'adresse proxy dans mes paramètres Visual Studio Code. Mon serveur proxy ne pourra pas gérer mes demandes d'application.

Lorsque je supprime les paramètres proxy,

fonctionne comme prévu.

TypeScript/Java/Golang...,这是我第一次在 vscode IDE 中的 开发应用程序 上遇到代理问题。换句话说,我从来没有想过 IDE 代理能够完成它构建的工作。由于扩展或者IDE本身使用这个代理设置是合理的,但是我的golangChoses importantes

🎜J'utilise vscode pour gérer 🎜Le débogage du projet l'utilise également et cela me déroute vraiment. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer