func dialViaSOCKS(ctx context.Context, destination string) (net.Conn, error) {
    dialer, err := proxy.SOCKS5(
        "tcp",
        "127.0.0.1:1080",
        nil,
        &net.Dialer{Timeout: 5 * time.Second},
    )
    if err != nil {
        return nil, err
    }
    contextDialer, ok := dialer.(proxy.ContextDialer)
    if !ok {
        return nil, errors.New("SOCKS dialer lacks context support")
    }
    return contextDialer.DialContext(ctx, "tcp", destination)
}

既存の Go ネットワーキングパッケージ内で、context、errors、net、time、x/net/proxy のインポートを使います。nil 引数は SOCKS の資格情報を選択しません。許可された公開プロキシ経路の公開宛先については、SOCKS5 プロキシ一覧が dialer のエンドポイントの候補を提供します。

エクスポートされた proxy.ContextDialer のアサーションにより、未対応の実装は明示的に失敗します。内部の dialer 型を名指ししたり、呼び出し側が管理できないブロッキング goroutine を開始したりせず、デプロイされた依存関係を確認してください。

context は接続の確立を制御します。net.Conn が返された後は、適切な読み取り/書き込みの期限や上位レベルのリクエスト期限を適用します。基底 dialer の接続タイムアウトとアプリケーション全体の予算は別の制限です。

HTTP トランスポート統合では、通常の TLS と HTTP の動作を維持します。返された context 対応の SOCKS ストリームはトランスポートへの引き渡しであり、応答でも、その後のすべてのバイトに対するライフタイム方針でもありません。

関連記事