Python Twisted代理 - 如何拦截数据包

7
我将为您翻译有关IT技术的内容。以下是需要翻译的文本:

我想使用Python打印HTTP响应的正文。

这是我的代码:

from twisted.web import proxy, http
from twisted.internet import reactor
from twisted.python import log
import sys

log.startLogging(sys.stdout)

class ProxyFactory(http.HTTPFactory):
  protocol=proxy.Proxy

reactor.listenTCP(8080, ProxyFactory())
reactor.run()

当我将浏览器连接到localhost:8080时,我可以看到所有的请求都通过本地运行的Python代理进行。但是如何1)打印响应主体和2)在将其发送回浏览器之前编辑响应主体?
我希望有人能指点我正确的方向 - 请注意,我对Python非常陌生!
1个回答

10

覆盖协议(在您的情况下为proxy.Proxy)的dataReceived方法,并在该方法中处理数据修改:

from twisted.web import proxy, http
from twisted.internet import reactor
from twisted.python import log
import sys

log.startLogging(sys.stdout)

class MyProxy(proxy.Proxy):
    def dataReceived(self, data):

      # Modify the data here
      print data

      # perform the default functionality on modified data 
      return proxy.Proxy.dataReceived(self, data)

class ProxyFactory(http.HTTPFactory):
  protocol=MyProxy

factory = ProxyFactory()
reactor.listenTCP(8080, factory)
reactor.run()

嘿,非常感谢您的回复。我遇到了一个异常 - 文件“proxy4.py”,第15行,在dataReceived中 返回super(MyProxy,self).dataReceived(data) exceptions.TypeError:必须是类型,而不是classobj - Eamorr
代码已经修正。你能检查一下它是否仍然引发 TypeError 错误吗? - Mariusz Jamro
1
你可能是想使用 proxy.Proxy.dataReceived(self, data) 而不是 MyProxy.dataReceived(self, data),否则会导致堆栈溢出。 - jfs
1
另外,dataReceived() 只会看到客户端发送到服务器的数据。获取服务器发送到客户端的数据可能会更加复杂。 - jfs
@J.F.Sebastian 用Chrome和Safari尝试过代码,但遇到了未处理的错误。你有同样的问题吗? - Nyxynyx
@Nyxynyx:不是。你是想把代理服务器当做Web服务器来访问吗?你不应该把代理URL放到浏览器地址栏中。应该配置网络设置,将代理作为代理使用。注意:只有简单的HTML页面才能正常工作,如果它们的内容被大写(buffer.upper())。 - jfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接