【发布时间】:2013-12-06 21:28:05
【问题描述】:
我正在开发一个双向 HTTP 代理,它将来自网络浏览器的请求转发到随机选择的第三方代理,然后将响应返回给网络浏览器。
客户端->代理->([第三方代理1]或[第三方代理2])->代理->客户端
最终,我希望能够检查和更改来自第三方代理的响应的标头、正文和状态代码,然后将更改后的响应发送回 Web 浏览器。
这是我目前所拥有的。它改编自an implementation by Sujit Pal。作者声称它有一些错误,但没有提供太多细节或如何修复它们。它适用于非常小的网页,例如 www.example.com,但对于任何较大的网页,它会通过页面资源下载的一部分然后停止。它似乎与一个或两个连接过早关闭有关,但我看不出这是如何发生的。这是我第一次体验twisted,我不知道如何调试它。我做错了什么?
from twisted.internet import reactor, protocol
from twisted.web import http
class HttpClientProtocol(http.HTTPChannel):
def __init__(self, serverTransport):
self.serverTransport = serverTransport
def sendMessage(self, data):
self.transport.write(data)
def dataReceived(self, data):
self.data = data
self.transport.loseConnection()
def connectionLost(self, reason):
self.serverTransport.write(self.data)
self.serverTransport.loseConnection()
class HttpServerProtocol(http.HTTPChannel):
def dataReceived(self, data):
third_party_proxy_host, third_party_proxy_port = random.choice([
('127.0.0.1', 8080),
('127.0.0.1', 8081)
client = protocol.ClientCreator(reactor, HttpClientProtocol, self.transport)
d = client.connectTCP(third_party_proxy_host, third_party_proxy_port)
d.addCallback(self.forwardToClient, data)
def forwardToClient(self, client, data):
client.sendMessage(data)
class MyHTTPFactory(http.HTTPFactory):
protocol = HttpServerProtocol
reactor.listenTCP(8000, MyHTTPFactory())
reactor.run()
【问题讨论】: