socksipy プロジェクトのプロキシとして、いくつかの urllib2.HTTPHandler サブクラスを使用しています。
ハングする URL にヒットした場合を除いて、すべて正常に動作します。グローバルと OpenDirector.open() メソッドの両方でタイムアウトを設定しても、何も起こりません。
urllib2.HTTPHandlers は次のとおりです。
# get the socksipy project code
import socks
class SocksiPyConnection(httplib.HTTPConnection):
def __init__(self, proxytype, proxyaddr, proxyport = None, rdns = False, username = None, password = None, *args, **kwargs):
self.proxyargs = (proxytype, proxyaddr, proxyport, rdns, username, password)
httplib.HTTPConnection.__init__(self, *args, **kwargs)
def connect(self):
self.sock = socks.socksocket()
self.sock.setproxy(*self.proxyargs)
if isinstance(self.timeout, float):
self.sock.settimeout(self.timeout)
self.sock.connect((self.host, self.port))
class SocksiPyHandler(urllib2.HTTPHandler):
def __init__(self, *args, **kwargs):
self.args = args
self.kw = kwargs
urllib2.HTTPHandler.__init__(self)
def http_open(self, req):
def build(host, port=None, strict=None, timeout=0):
conn = SocksiPyConnection(*self.args, host=host, port=port, strict=strict, timeout=timeout, **self.kw)
return conn
return self.do_open(build, req)
タイムアウトをsocket.setdefaulttimeout(30)としてグローバルに設定しようとしましたが、成功しませんでした。上記のSocksiPyConnectionをインスタンス化するときにタイムアウトを設定しようとしました 。そして最後に、OpenDirector.openメソッドを使用してタイムアウトを設定しようとしましたが、API は成功せずにタイムアウトを取ると言っています。
ハングするテスト コード:
import sys
# import socksipy base code
sys.path.append( "/parent/path/to/socks.py" )
import socks
import urllib2
import socket
socket.setdefaulttimeout(30)
proxyhost = "responder.w2"
proxyport = 1050
sys.path.append( "/home/gcorradini" )
from sock_classes import SocksiPyHandler
opener = urllib2.build_opener(SocksiPyHandler(socks.PROXY_TYPE_SOCKS5, proxyhost, int(proxyport)) )
resp = opener.open("http://erma.orr.noaa.gov/cgi-bin/mapserver/charts?version=1.1.1&service=wms&request=GetCapabilities", timeout=30.0)
# i just hang here forever