我正在开发一个双向HTTP代理,它将来自Web浏览器的请求转发给随机选择的第三方代理,然后将响应返回给Web浏览器。
客户 - >代理 - > ([第三方代理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()
答案 0 :(得分:0)
我找到了更好的解决方案。我将twisted.web.proxy的代码复制到Twisted模块中并对其进行了修改以符合我的目的。它与上面的代码没有相同的问题,效果很好。