2016-10-04 12 views
1

私は、http.TransportのProxyフィールドがプロキシサーバーアドレスを生成する関数を要求することを理解します。これが私のroundtripperです:Go RoundTrip/Transport Proxy Address

roundtripper := &http.Transport{ 
    Proxy: proxyrouter.Calculateproxy, 
... 
} 

ので、プロキシのタイプはfunc(*Request) (*url.URL, error)です。これはサーバーにリンクされ、後で呼び出されます。

response := roundtripper.RoundTrip(request) 

これはレスポンスを返します。今、この応答を得るために使用されたプロキシアドレスを知る方法はありますか? (私のCalculateproxy機能は、単にランダムなアドレスを要するため)

+0

への参照を持っていますヘッダーを確認する必要があります。しかし、トランスポート層が非公開の[余分なヘッダーセクション](https://golang.org/src/net/http/transport.go#L289)に追加しているかどうかはわかりません。とにかくreq respヘッダをダンプしますか?彼らはあなたに手がかりを与えるかもしれません。 – algrebe

答えて

0

プロキシ機能が使用されるプロキシサーバーを記録するためにヘッダを追加しまし:

Transport{ 
    Proxy: func(req *Request) (*url.URL, error) { 
     p, err := proxyrouter.Calculateproxy(req) 
     if err != nil { 
      return err 
     } 
     req.Header.Set("X-Proxy-Addr", p.String()) 
     return req, nil 
    }, 
} 

http.Responseは元の要求

proxy := resp.Request.Header.Get("X-Proxy-Addr") 
+0

そうです、私はそれが唯一の方法だと思っています。私はここでのセキュリティ問題にかなり関心があります。 –

+0

@PieterjanLambein:セキュリティ上の問題はありません。プロキシは、 "転送"ヘッダーの "by"フィールド、または "Via"ヘッダーの、または接続先アドレスを記録しているホストによって、そのアドレスによって既に認識されています。それでも問題がある場合は、プログラムの実行以外のものと相関のない不透明な識別子を使用してください。 – JimB

+0

さて、ありがとう、@ JimB! –