あるエンドポイントへのリクエストはプロキシーさせたい (Golang)

小ネタです。

net/http を使っているならば基本的には以下の環境変数を使えばソースコードをいじらずともプロキシーされるようになっています*1。今回はあるエンドポイントの時のみプロキシーさせたいので、NO_PROXYでプロキシさせたくないものを全てリストアップさせる必要があります。

HTTP_PROXY, HTTPS_PROXY and NO_PROXY

http - The Go Programming Language

これらの環境変数Unix系のOSで慣習的に使われる環境変数です(例えばcurlなど)。これがGolangのnet/httpでも実装されていました。もし使っているツールでプロキシーさせたいものがGo製な時はこの環境変数でプロキシーさせることができるかもしれませんね。Golangに限らずだいたいの言語のhttp系のライブラリでも実装されているのでしょうか?

背景

GitHubクライアントを使っていて、プライベートなネットワークにあるGitHub EnterpriseのAPIを叩く時はプロキシーが必要でした。どうやるかなと調べたところこの環境変数に気づいた次第です。

NO_PROXY

プロキシさせたくない時はNO_PROXY環境変数に全て列挙をしなくてはいけないブラックリスト形式なのかが気になりました。そうなると、net/httpを使っている何か列挙し忘れがあればProxyされますし影響範囲が見づらい気がします。

プロキシ関連のソースコードgolang.org/x/net/http/httpproxyにまとまっているのですが、疑問に思ったことらへんがドキュメントに書いていました。* という指定があります。ソースコードも確認しましたが、これは単純にプロキシーを使わない設定にするようです。今回のケースでは*を使った場合はホワイトリスト形式にできればありがたいのですがそうではないようです。ちゃんと動作確認してリリースしようと思います。

その他

*1:Transport構造体のProxyにProxyFromEnvironmentが設定されている必要があります