502 Bad Gateway: net/http GET gagal untuk terowong IPSec

PHPz
Lepaskan: 2024-02-09 13:09:25
ke hadapan
671 orang telah melayarinya

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

Editor PHP Zimo kadangkala menemui gesaan 502 Bad Gateway apabila menggunakan Internet. Mesej ralat ini bermakna terdapat masalah komunikasi antara pelayan get laluan dan pelayan huluan, menyebabkan permintaan tidak dapat diselesaikan. Salah satu punca yang mungkin adalah kegagalan net/http GET untuk terowong IPSec. Walaupun ralat ini boleh mengelirukan, dengan memahami puncanya dan cara membetulkannya, kami boleh menyelesaikan isu tersebut dengan cepat dan terus menikmati kemudahan Internet.

Kandungan soalan

dihantar pada tingkap ipsec 隧道(vpn) 使用 net/http 包发出远程 get 请求时,get 请求失败,响应代码为 502 bad gateway。但是,由 curl 发送的具有相同 headersurimethod 的请求效果很好。 go Kod sumber adalah seperti berikut:

    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
    }
Salin selepas log masuk

Selepas menganalisis tangkapan paket trafik, kami mendapati permintaan yang dihantar oleh vpn接口可以正常抓到curl发送的请求,但是getgo(net/http) telah hilang.

Maka saya rasa mungkin kerana rangka kerja memilih antara muka yang salah untuk menghantar paket.

Jadi saya cuba mencari antara muka rangkaian tempatan yang betul dan nyatakan localaddr 来发送我的 get permintaannya seperti ini:

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
}
Salin selepas log masuk

Permintaan dengan client 函数替换 client 后,get akhirnya berjaya.

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

Jadi soalan saya ialah mengapa golang tidak memilih antara muka rangkaian tempatan yang betul untuk menghantar permintaan secara automatik? golang 没有选择正确的本地网络接口来自动发送请求?

解决方法

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

Penyelesaian

net.dialSelepas menyahpepijat net.dial#DialContext, saya mendapati bahawa alamat telah ditukar kepada alamat proksi dalam tetapan Visual Studio Code saya. Pelayan proksi saya tidak akan dapat mengendalikan permintaan aplikasi saya.

Apabila saya mengalih keluar tetapan proksi,

berfungsi seperti yang diharapkan.

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

🎜Saya menggunakan vscode untuk mengendalikan 🎜Penyahpepijatan projek juga menggunakannya dan ini benar-benar mengelirukan saya. 🎜

Atas ialah kandungan terperinci 502 Bad Gateway: net/http GET gagal untuk terowong IPSec. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!