使用Twisted的HTTP双向代理

时间:2013-12-06 21:28:06

标签: proxy twisted

我正在开发一个双向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()

1 个答案:

答案 0 :(得分:0)

我找到了更好的解决方案。我将twisted.web.proxy的代码复制到Twisted模块中并对其进行了修改以符合我的目的。它与上面的代码没有相同的问题,效果很好。