2013-03-01 13 views
5

Python用の優れたリクエストライブラリを使用して、残りのAPI用の非常に単純なクライアントを作成しました。すべてがうまく動作します。私は、負荷分散装置を介してクライアントを実行します。負荷分散装置は、アイドル状態のTCP接続を検出し、それらを強制終了します。私のクライアントは、私のプラットフォーム(Linux)のデフォルトよりもいくつかの異なるtcp keep aliveオプションを使用したいと思います。しかし、私は新しいソケットのためのいくつかのデフォルトオプションを選択したいとソケットライブラリに伝える簡単な方法はありません。要求のデフォルトのソケットオプションを上書きすることはできますか?

socket.create_connectionを直接使用するとデコレータでは簡単ですが、実際の呼び出しがサードパーティ製のライブラリに埋め込まれているとリクエストあり。事前に

おかげ

+0

私は推測できますか? – Dacav

答えて

3

requestsは物事をフックするために、すべての任意の場所をせずに、socket.create_connectionを呼び出す、(2.xのために、またはhttplib)標準ライブラリのhttp.clientを使用する、urllib3を使用しています。

だから、それらのライブラリのうちの1つをフォークするか、それをオンザフライで実行する必要があります。

それが簡単にスワップアウトすることができsocket.create_connection周りの些細なラッパーだから、それを行うための最も簡単な場所は、http.client.connectにおそらくある:

orig_connect = http.client.HTTPConnection.connect 
def monkey_connect(self): 
    orig_connect(self) 
    self.sock.setsockopt(…) 
http.client.HTTPConnection.connect = monkey_connect 

あなたは2.xのにしている場合、それはおそらく同じくらい簡単です上記のhttp.clientの代わりにhttplibを使用するだけですが、確認することができます。

+0

恐ろしい解決策、私はモジュールの有効範囲がこのように働いていることを認識していませんでした。 –

+1

これは、 'urllib3'から' HTTPConnection.socket_options'または 'HTTPConnection.default_socket_options'を介して行うことができます。 – univerio

5

urllib3(1.8.3以降、2014-06-23リリース)の新しいバージョンでは、設定ソケットオプションがサポートされています。

カスタムアダプタを作成することによって、(2.4.0以降、2014年8月29日リリース)requestsからこれらのオプションを設定できます。

class HTTPAdapterWithSocketOptions(requests.adapters.HTTPAdapter): 
    def __init__(self, *args, **kwargs): 
     self.socket_options = kwargs.pop("socket_options", None) 
     super(HTTPAdapterWithSocketOptions, self).__init__(*args, **kwargs) 

    def init_poolmanager(self, *args, **kwargs): 
     if self.socket_options is not None: 
      kwargs["socket_options"] = self.socket_options 
     super(HTTPAdapterWithSocketOptions, self).init_poolmanager(*args, **kwargs) 

その後、カスタムソケットを必要とするセッションにこのアダプタを取り付けることができますオプション(例:SO_KEEPALIVEを設定):

adapter = HTTPAdapterWithSocketOptions(socket_options=[(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)]) 
s = requests.session() 
s.mount("http://", adapter) 
s.mount("https://", adapter) 
+0

それはrequests.Session()ですか? –

+0

@JasonHeissこれらは互換性があります。 – univerio

関連する問題