3

你好!我有这个代码:

from twisted.web import proxy, http
from twisted.internet import reactor

class akaProxy(proxy.Proxy):
    """
    Local proxy = bridge between browser and web application
    """

    def dataReceived(self, data):

        print "Received data..."

        headers = data.split("\n")
        request = headers[0].split(" ")

        method = request[0].lower()
        action = request[1]
        print action
        print "ended content manipulation"  
        return proxy.Proxy.dataReceived(self, data)

class ProxyFactory(http.HTTPFactory):
    protocol = akaProxy

def intercept(port):
    print "Intercept"
    try:                
        factory = ProxyFactory()
        reactor.listenTCP(port, factory)
        reactor.run()
    except Exception as excp:
        print str(excp)

intercept(1337)

我使用上面的代码来拦截浏览器和网站之间的所有内容。在上面使用时,我将浏览器设置配置为:IP:127.0.0.1 和端口:1337。我将此脚本放在远程服务器中,以将我的远程服务器作为代理服务器。但是当我将浏览器代理 IP 设置更改为我的服务器时,它不起作用。我做错了什么?我还需要配置什么?

4

2 回答 2

2

大概您dataReceived在尝试解析传递给它的数据期间引发了异常。尝试启用日志记录,这样您就可以看到更多正在发生的事情:

from twisted.python.log import startLogging
from sys import stdout
startLogging(stdout)

您的解析器可能引发异常的原因是它dataReceived不会仅在完整请求时调用。使用从 TCP 连接读取的任何字节调用它。这可能是一个完整的请求、一个部分的请求,甚至是两个请求(如果正在使用流水线)。

于 2012-08-03T18:31:36.413 回答
0

dataReceived在代理上下文中正在处理“将 rawData 转换为行”,因此尝试您的操作代码可能为时过早。您可以尝试覆盖allContentReceived,您将可以访问完整的标题和内容。这是一个我相信你所追求的例子:

#!/usr/bin/env python
from twisted.web import proxy, http

class SnifferProxy(proxy.Proxy):
    """
    Local proxy = bridge between browser and web application
    """

    def allContentReceived(self):
        print "Received data..."
        print "method = %s" % self._command
        print "action = %s" % self._path
        print "ended content manipulation\n\n"
        return proxy.Proxy.allContentReceived(self)


class ProxyFactory(http.HTTPFactory):

    protocol = SnifferProxy

if __name__ == "__main__":
    from twisted.internet import reactor
    reactor.listenTCP(8080, ProxyFactory())
    reactor.run()
于 2012-08-30T13:11:24.770 回答