from twisted.web import client as _twc
class HTTPPageGetter(_twc.HTTPPageGetter):
def sendCommand(self, command, path):
if self.factory.proxy:
from twisted.web.http import urlparse
from urlparse import urlunparse
domain = urlparse(self.factory.url)[:2]
path = urlparse(path)[2:]
path = urlunparse(domain + path)
self.transport.write('%s %s HTTP/1.0\r\n'%(command, path))
def handleStatus_301(self):
location = self.headers.get('location')
if not location:
self.handleStatusDefault()
return
url = location[0]
if self.followRedirect:
self.factory.connect(url)
else:
from twisted.python.failure import Failure
from twisted.web.error import PageRedirect
self.handleStatusDefault()
self.factory.noPage(Failure(
PageRedirect(self.status, self.message,
location = url)))
self.quietLoss = 1
self.transport.loseConnection()
class HTTPClientFactory(_twc.HTTPClientFactory):
protocol = HTTPPageGetter
proxy = None
def __init__(self, url, **kwargs):
self.proxy = kwargs.pop('proxy', None)
_twc.HTTPClientFactory.__init__(self, url, **kwargs)
def connect(self, url = None):
if url:
self.setURL(url)
if self.proxy is not None:
try:
host, port = self.proxy.split(':')
host, port = str(host), int(port)
except:
raise Exception(
'Incorrect proxy address "%s"'%self.proxy)
else:
host, port = self.host, self.port
from twisted.internet import reactor
if self.scheme == 'https':
from twisted.internet.ssl import ClientContextFactory
contextFactory = ClientContextFactory()
reactor.connectSSL(host, port, self, contextFactory)
else:
reactor.connectTCP(host, port, self)
Этот код вырван из контекста (моего проекта), так что я его не тестировал, если будут ошибки — обращайтесь, разберемся.Для работы с этой
HTTPClientFactory
теперь не стоит использовать вызов reactor.connectTCP
, для установления соединения вызовите метод connect
этой фабрики, а так же, при создании фабрики, не забудьте указать какой прокси вы хотите использовать:factory = HTTPClientFactory('http://python.su/',
proxy = 'localhost:3128')
factory.connect()
Комментариев нет:
Отправить комментарий