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.
Transmis sur windows ipsec 隧道(vpn)
使用 net/http
包发出远程 get
请求时,get
请求失败,响应代码为 502 bad gateway
。但是,由 curl
发送的具有相同 headers
、uri
、method
的请求效果很好。 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
发送的请求,但是get
从go(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
net.dial
Aprè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.
TypeScript/Java/Golang...
,这是我第一次在 vscode
IDE 中的 开发应用程序
上遇到代理问题。换句话说,我从来没有想过 IDE
代理能够完成它构建的工作。由于扩展或者IDE本身使用这个代理设置是合理的,但是我的golang
Choses importantes
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!