Python Twisted proxy — как перехватывать пакеты

Я пытаюсь распечатать тело ответа HTTP с помощью Python.

Вот мой код:

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!


person Eamorr    schedule 30.01.2012    source источник


Ответы (1)


Переопределить метод dataReceived протокола (прокси .Proxy в вашем случае) и обработайте модификацию данных в этом методе:

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()
person Mariusz Jamro    schedule 30.01.2012
comment
Эй, большое спасибо за этот ответ. У меня есть исключение - файл proxy4.py, строка 15, в dataReceived возвращает super(MyProxy,self).dataReceived(data) исключения.TypeError: должен быть тип, а не classobj - person Eamorr; 30.01.2012
comment
Исправил код. Можете ли вы проверить, вызывает ли он все еще TypeError? - person Mariusz Jamro; 02.02.2012
comment
вы можете иметь в виду: proxy.Proxy.dataReceived(self, data) вместо MyProxy.dataReceived(self, data) иначе это приведет к переполнению стека. - person jfs; 27.02.2012
comment
Также dataReceived() видит только данные, отправляемые клиентом на сервер. Получение данных, отправляемых сервером клиенту, может быть более сложным - person jfs; 27.02.2012
comment
@ J.F.Sebastian Попробовал код с помощью Chrome и Safari и получил Unhandled Error. У вас возникает такая же проблема? - person Nyxynyx; 16.07.2014
comment
@Nyxynyx: Нет. Вы пытаетесь использовать прокси-сервер как веб-сервер? Вы не должны помещать URL-адрес прокси в адресную строку браузера. Настройте параметры сети, чтобы вместо этого использовать прокси-сервер в качестве прокси-сервера. Примечание: только простые html-страницы будут работать, если их содержимое будет в верхнем регистре (buffer.upper()). - person jfs; 25.06.2015