2009-07-23 12 views
19

私はいくつかのサードパーティのWeb APIを使用するWebアプリを書いている、と私は広告ホック分析のための低レベルの要求と応答を追跡したいをログに記録するurllib2のを得るのですか。だから私は、HTTP経由で転送されたすべてのバイトを記録するPythonのurllib2を取得するレシピを探しています。多分サブクラス化されたハンドラ?は、どのように私はすべての転送されたバイト

+0

+1 2年前には非常に素敵なpythonの質問がアップノートなしで尋ねられました。それは本当に奇妙です。私は自分自身で答えを探しています。私の場合、私はHTTPヘッダーだけに関心があります。 –

答えて

12

まあ、私はどのようにセットアップ内蔵のライブラリーのメカニズムをデバッグすることが分かってきました:

import logging, urllib2, sys 

hh = urllib2.HTTPHandler() 
hsh = urllib2.HTTPSHandler() 
hh.set_http_debuglevel(1) 
hsh.set_http_debuglevel(1) 
opener = urllib2.build_opener(hh, hsh) 
logger = logging.getLogger() 
logger.addHandler(logging.StreamHandler(sys.stdout)) 
logger.setLevel(logging.NOTSET) 

しかし、私はまだ転送されたすべての情報をダンプする方法を探しています。

2

これはかなり難しいようです。入力または出力データをインターセプトするためのurllib2、urllib、またはhttplib(これが構築されている)にフックはありません。

私には、外部ツール(多くの人がそういったものを使用している)を使用する方法以外に、自分自身で新しいソケットにsocket.socketのサブクラスを書くことがありますモジュール(例えば、 "capture_socket")を作成し、 "import capture_socket; import httplib; httplib.socket = capture_socket"を使用してhttplibに挿入します。必要なすべての参照(httplibで使われている "socket.foo"という形式のもの)を自分のモジュールにコピーしなければならないが、サブクラスでrecv()やsendallあなたがデータで好きなもの。あなたはSSLを使用していた場合

合併症はおそらく生じるであろう、と私はあなたにも同様にあなた自身のsocket._fileobjectを作る必要があるだろうならば、これは十分であるかかどうかはわかりません。しかし、それは可能ですが、httplib.pyのソースを熟読し、標準ライブラリのsocket.pyはもっと詳しく説明します。

関連する問題