目錄
問題內容
解決方法
重要的事情
首頁 後端開發 Golang 502 錯誤閘道:IPSec 隧道的 net/http GET 失敗

502 錯誤閘道:IPSec 隧道的 net/http GET 失敗

Feb 09, 2024 pm 01:09 PM

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

php小編子墨在使用網路時,有時候會遇到502錯誤網關的提示。這個錯誤提示意味著網關伺服器和上游伺服器之間的通訊出現了問題,導致請求無法完成。其中一個可能的原因是IPSec隧道的net/http GET失敗。雖然這個錯誤可能會讓人感到困惑,但是透過了解錯誤的原因和解決方法,我們可以很快地解決這個問題,繼續享受網路的便利性。

問題內容

在windows 上透過ipsec 隧道(vpn) 使用net/http 套件發出遠端get 請求時,get 請求失敗,回應碼為502 bad gateway。但是,由 curl 發送的具有相同 headersurimethod 的請求效果很好。 go 原始碼如下所示:

    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
    }
登入後複製

對流量進行抓包分析後,發現vpn介面可以正常抓到curl發送的請求,但是getgo(net /http)發送的請求遺失了。

那麼我猜可能是因為框架選擇了錯誤的介面來傳送封包。

因此,我嘗試找到正確的本機網路介面並指定其 localaddr 來發送我的 get 請求,如下所示:

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
}
登入後複製

client 函數取代 client 後,get 請求最終有效。

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

#那麼我的問題是為什麼 golang 沒有選擇正確的本地網路介面來自動發送請求?

解決方法

偵錯net.dial#DialContext後,發現該位址已變更為我在Visual Studio Code設定中的代理地址。我的代理伺服器將無法處理我的應用程式請求。

當我刪除代理設定時,net.dial 按預期工作。

重要的事情

我正在使用vscode 來處理TypeScript/Java/Golang...,這是我第一次在vscode IDE 中的 開發應用程式上遇到代理問題。換句話說,我從來沒有想過 IDE 代理程式能夠完成它所建構的工作。由於擴充功能或IDE本身使用這個代理設定是合理的,但是我的golang專案偵錯也使用它,這真的讓我很困惑。

以上是502 錯誤閘道:IPSec 隧道的 net/http GET 失敗的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Go語言包導入:帶下劃線和不帶下劃線的區別是什麼? Go語言包導入:帶下劃線和不帶下劃線的區別是什麼? Mar 03, 2025 pm 05:17 PM

Go語言包導入:帶下劃線和不帶下劃線的區別是什麼?

Beego框架中NewFlash()函數如何實現頁面間短暫信息傳遞? Beego框架中NewFlash()函數如何實現頁面間短暫信息傳遞? Mar 03, 2025 pm 05:22 PM

Beego框架中NewFlash()函數如何實現頁面間短暫信息傳遞?

Go語言中如何將MySQL查詢結果List轉換為自定義結構體切片? Go語言中如何將MySQL查詢結果List轉換為自定義結構體切片? Mar 03, 2025 pm 05:18 PM

Go語言中如何將MySQL查詢結果List轉換為自定義結構體切片?

如何定義GO中仿製藥的自定義類型約束? 如何定義GO中仿製藥的自定義類型約束? Mar 10, 2025 pm 03:20 PM

如何定義GO中仿製藥的自定義類型約束?

如何編寫模擬對象和存根以進行測試? 如何編寫模擬對象和存根以進行測試? Mar 10, 2025 pm 05:38 PM

如何編寫模擬對象和存根以進行測試?

您如何在GO中編寫單元測試? 您如何在GO中編寫單元測試? Mar 21, 2025 pm 06:34 PM

您如何在GO中編寫單元測試?

Go語言如何便捷地寫入文件? Go語言如何便捷地寫入文件? Mar 03, 2025 pm 05:15 PM

Go語言如何便捷地寫入文件?

如何使用跟踪工具了解GO應用程序的執行流? 如何使用跟踪工具了解GO應用程序的執行流? Mar 10, 2025 pm 05:36 PM

如何使用跟踪工具了解GO應用程序的執行流?

See all articles