【问题标题】:HTTP two-way proxy using Twisted使用 Twisted 的 HTTP 双向代理
【发布时间】: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()

【问题讨论】:

标签: proxy twisted


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多