Go-CONNECT-Status in OnProxyConnectResponse beobachten
Installieren Sie den Hook vor den Anfragen am Transport; die Rückgabe von nil erhält die normale Tunnelstatus-Prüfung.
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.Proxy = http.ProxyURL(proxyURL)
transport.OnProxyConnectResponse = func(
_ context.Context,
_ *url.URL,
_ *http.Request,
response *http.Response,
) error {
observeConnect(response.StatusCode, response.Header.Get("X-Proxy-Region"))
return nil
}
client := &http.Client{Transport: transport}Verwenden Sie context, net/http und net/url; die Standard-Typzusicherung geht davon aus, dass dieser Transport installiert bleibt. proxyURL wird geparst, und observeConnect muss nebenläufigkeitssicher sein. Für erlaubte öffentliche HTTPS-Prüfungen liefert HTTP-Proxy-Liste Kandidaten für diese Proxy-URL.
Der Callback läuft vor der CONNECT-Prüfung auf ein erfolgreiches 200 und kann daher auch 407 beobachten. Nil setzt die normale Prüfung fort und akzeptiert keinen abgelehnten Tunnel; ein Fehler lässt die Anfrage scheitern.
X-Proxy-Region ist ein anbieterdefiniertes Beispiel. Lesen Sie hier Status und Header und überlassen Sie den Besitz von Body und Socket dem Transport, der dann das TLS des Ziels übernimmt.
Dies beobachtet den Aufbau eines neuen Tunnels, nicht jede Anfrage. Eine wiederverwendete Verbindung hat keine neue CONNECT-Antwort, und die Antwort der Website hat eigene Header.