HTTP フォワードプロキシでは、Gorilla の Dialer.Proxy を設定します。WebSocket URL は引き続き接続先です:

proxyURL, err := url.Parse("http://proxy.example:8080")
if err != nil {
    return err
}
dialer := websocket.Dialer{
    Proxy: http.ProxyURL(proxyURL),
    HandshakeTimeout: 15 * time.Second,
}
conn, response, err := dialer.DialContext(
    ctx, "wss://events.example/stream", nil)

この断片はアプリケーションの接続関数に置き、net/url、net/http、time、github.com/gorilla/websocket が利用可能である必要があります。err と失敗した handshake 応答を処理し、その後は通常のメッセージとクローズのライフサイクルで conn を管理します。許可された公開 WSS エンドポイントでは、HTTP プロキシリスト が proxyURL の候補を提供します。

HTTP プロキシの dialer は中間接続を開き、接続先に対して CONNECT を送信します。wss では、WebSocket handshake の前に、確立されたトンネルを通って接続先の TLS が進みます。

NetDialContext は下位の TCP 接続をカスタマイズします。プロキシポートだけを指しても CONNECT は実装されません。Proxy も設定されている場合、カスタムネットワークコールバックが中間者に接続し、プロキシ層がネゴシエーションを処理します。

接続先のホスト名を wss URL に残し、通常の TLS 識別確認が意図したサーバーに適用されるようにします。

関連記事