2014/12/02

Recent entries from same category

  1. Go 言語プログラミングエッセンスという本を書きました。
  2. errors.Join が入った。
  3. unsafe.StringData、unsafe.String、unsafe.SliceData が入った。
  4. Re: Go言語で画像ファイルか確認してみる
  5. net/url に JoinPath が入った。

通常、golang のデフォルトの HTTP クライアントは環境変数 HTTP_PROXY もしくは HTTPS_PROXY を参照してプロキシに接続し、環境変数 NO_PROXY で指定されたホストが無視される仕組みになっています。しかし一般ユーザにとって環境変数の設定は、難易度の高い作業だったりします。

使用例

たとえばこういうコードに…

package main

import (
    "fmt"
    "io"
    "net/http"
    "os"
)

func main() {
    res, err := http.Get("http://www.google.com")
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
    defer res.Body.Close()
    io.Copy(os.Stdout, res.Body)
}

一行追加すると:

package main

import (
    "fmt"
    "io"
    "net/http"
    "os"

    _ "github.com/mattn/go-ieproxy/global" // ← この行
)

func main() {
    os.Setenv("HTTP_PROXY""")
    os.Setenv("HTTPS_PROXY""")
    res, err := http.Get("http://www.google.com")
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
    defer res.Body.Close()
    io.Copy(os.Stdout, res.Body)
}

たったこれだけで、IE のプロキシ設定が引き継がれます。無ければデフォルトと同じ様に、環境変数で動作します。

仕組み

ieproxy は ieproxy.ProxyFromIE という関数を提供していて、これが http.Transport.Proxy を実装しています。この関数は http クライアントのプロキシ仲介有無を行っているのでつまりは http.Client の Proxy を設定できます。http.Cilent が HTTP リクエストを実行する際にはこの Proxy が呼び出されて判定処理が行われますが、ieproxy.ProxyFromIE はレジストリから IE のプロキシ設定を取得しつつプロキシの判定を行うような実装になっているので、このように HTTP 通信に引っかけてプロキシをすげかえることができるわけです。

さらに github.com/mattn/go-ieproxy/global パッケージでは http.DefaultTransport.Proxy を ieproxy.ProxyFromIE に書き換え(!)しているので、インポートするだけですべての HTTP 通信が(標準の http パッケージを利用していれば)勝手に IE のプロキシ設定になります。

注意: Windows でしかビルド出来ません。

参考資料: ソースに一行追加するだけですべての HTTP 通信をロギングするモジュールを書いた #golang - 詩と創作・思索のひろば

mattn/go-ieproxy - GitHub
https://github.com/mattn/go-ieproxy
Posted at by