Найти - Пользователи
Полная версия: proxy client Twisted
Начало » Web » proxy client Twisted
1
cybergrind
собственно как сделать веб-клиента, который бы лазил через прокси по тру-твистедовски?
курение гугля просветления не принесло
bw
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from twisted.internet import reactor
from twisted.python import log
from twisted.web.http import HTTPFactory
from twisted.web.proxy import Proxy


if __name__ == '__main__':
fileObserver = log.FileLogObserver(sys.stdout)
fileObserver.timeFormat = '%H:%M:%S'
log.startLoggingWithObserver(fileObserver.emit)

factory = HTTPFactory()
factory.protocol = Proxy
reactor.listenTCP(8080, factory)

reactor.run()
..bw
bw
А, ты же клиента просил :-).

Похоже в Twisted нет для этого решения. Почитай протокол HTTP, сделаю свою фабрику (или как то иначе) для работы с прокси. По идее это тот же клиент + несколько своеобразных заголовков. Я с этой частью протокола не знаком, поэтому помочь не могу.

..bw
cybergrind
вот и я тоже удивился, когда обнаружил что клиента для прокси в твистеде найти немогу…….
ofigetitelno
:)
Фрагмент творчества…

from urllib import urlencode
from StringIO import StringIO
from twisted.web2 import stream as stream_mod, http_headers
from twisted.web2.client.http import HTTPClientProtocol, ClientRequest
from twisted.internet import reactor, protocol, defer

def err(reason, defered):
if not defered.called:
defered.errback(reason)

def geturl_proxy(host, path, proxy_host, proxy_port, **kwargs):
d = protocol.ClientCreator(reactor, HTTPClientProtocol).connectTCP(proxy_host, proxy_port)
path = 'http://%s%s' % (host, path)
ret = defer.Deferred()
def gotResp(resp, defered):
def done(n, res, defered):
defered.callback(res.getvalue())
res = StringIO()
stream_mod.readStream(resp.stream, res.write).addCallback(done, res, defered).addErrback(err, defered)
def sendReq(proto):
q = '?'+urlencode(kwargs) if kwargs else ''
headers = http_headers.Headers({'Host': host})
proto.submitRequest(ClientRequest("GET", path+q, headers, None)).addCallback(gotResp, ret).addErrback(err, ret)
d.addCallback(sendReq).addErrback(err, ret)
return ret

if __name__=="__main__":
def f(*args):
for arg in args: print arg
reactor.stop()
geturl_proxy('ya.ru', '/', 'proxy.zzz', 3128).addBoth(f)
reactor.run()
Слегка работает…
Gos
только что столкнулся с такой же задачей. но оказалось все просто: нужно делать reactor.connectTCP на прокси, а всё остальное - стандартно.

пример:

hcf = HTTPClientFactory('http://mts.ru', method='GET') # нужно считать mts.ru
hcf.deferred.addCallbacks(on_suc, on_err)

proxy_host, proxy_port = ‘118.98.195.42’, 3128 # я лазил через этот прокси
reactor.connectTCP(proxy_host, proxy_port, hcf) # коннект к прокси !
Gos
если будут проблемы с CoDeen-проксями - пишите ;-)
bw
Со Squid 2.6 такое не работает. В GET (или другом методе) требуется передавать не только путь, а полный адрес. Squid, видимо, игнорирует заголовок Host. Еще возникнет проблема при редиректе, так как у тебя не будет возможности сделать connectTCP.

p.s. Накалякал вот тут, может кому пригодится: http://blog.handsdriver.net/2008/10/twisted.html

..bw
cybergrind
+1. как только появится время - протестим в боевых условиях =)
bw
Доложи о результатах, доработаю для наследников :-).

..bw
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB