2016-09-25 9 views
0

Я использую mitmproxy, прокси-сервер python man-in-the-middle (MITM) для HTTP, для изменения на ходу HTTP-запроса определенного веб-сайта.Python serialize HTTPFlow object (MITM)

Цель:

Для целей тестирования, когда он получает запрос HTTP, он должен сохранить его (он получает HTTPFlow объект) и в следующий раз, то же самое будет сделан запрос я должен обижаться точное то же данные/html/header/ресурсы/ecc .. в браузер.

Проблема:

Очевидное решение для сериализации объекта, но не сериализуемый!

я не могу просто держать его в памяти, потому что мне нужно перезапустить прокси во время испытаний

Что я могу сделать, чтобы достичь своей цели?

Детали:

Я уже пробовал рассол, cPickle и маршалом со следующими ошибками:

  • a class that defines __slots__ without defining __getstate__ cannot be pickled

  • can't pickle CDataGCP objects

  • ValueError: unmarshallable object

Идеи:

  • 1) насколько это плохая идея изменить исходный объект , чтобы сделать его сериализуемым? и как я могу это сделать?
  • 2) что если основной процесс связывается со вторым всегда-живым процессом python, который просто сохраняет объект в памяти? им все еще нужно связывать obj, сериализуя их?

ответ

0

Найдено решения (HTTPFlow OBJ имеет метод, чтобы получить состояние)

Импорт

from mitmproxy.models import HTTPFlow 
from mitmproxy.models import HTTPResponse 

Сохранить состояние:

cached_state = http_flow_response.response.get_state() 

состояние нагрузки:

# create the obj 
http_response = HTTPResponse(
     cached_state['http_version'], # "HTTP/1.1" 
     cached_state['status_code'], # 200 
     cached_state['reason'],  # "Ok" 
     cached_state['headers'],  # Headers(content_type="...") 
     cached_state['content'])  # str 
# send the obj 
http_flow_request.reply(cached_http_response)