urllib2.urlopenでHTTPコネクションのデバッグ情報を表示する方法
urllibなら以下の手順でOKなんだが、urllib2の場合は上手く行かない。
import httplib httplib.HTTPConnection.debuglevel = 10 import urllib urllib.urlopen(...)
urllib2の場合は以下のようにする。これで、HTTPコネクションのデバッグ情報が表示されるようになる。
opener = urllib2.build_opener() opener.handlers[2].set_http_debuglevel( 10 ) urllib2.install_opener( opener ) urllib2.urlopen(...)
上の方法はhandlersから決め打ちで取ってきている(デバッグ時だけだし良いかなとw)が、正攻法は以下のようになると思われる。
http_handler = opener.process_request.get('http',[]) http_handler.set_http_debuglevel( 10 )
ちなみにset_http_debuglevel()はAbstractHTTPHandlerクラスのメソッド。
urllib2.urlopen()を呼び出すとHttpHandlerクラスに処理が渡され、その内部でAbstractHttpHandler.do_open()にhttplib.HTTPConnectionを渡して通信を行う。これだけならhttplib.HttpConnection.debuglevelの値を変更しておけば、デバッグ情報が表示されると思われるのだがAbstractHttpHandler.do_open()内でAbstractHttpHandler._debuglevelの値をhttplib.HTTPConnection.debuglevelに設定し直しているため表示されなくなるのでした。
AbstractHttpHandler._debuglevelはハンドラインスタンス作成時に設定できるので、一番の正攻法はHttpHanderクラスから自前のインスタンスを作成して登録する方法のような気がする。けど、デバッグのためだけにそこまでしたくはないよね。