Python序列化HTTPFlow对象(MITM)

时间:2016-09-25 17:21:57

标签: python serialization ipc mitmproxy

我正在使用mitmproxy,一个用于HTTP的python man-in-the-middle(MITM)代理,可以动态修改某个网站的HTTP请求。

目标:

出于测试目的,当它收到HTTP请求时,它应该保存它(它接收一个HTTPFlow对象),下次同一个请求将被发送时我需要重新发送完全相同的数据/ html / header / resourses / ecc .. 到浏览器。

问题:

显而易见的解决方案是序列化对象,但它不可序列化

我不能简单地将其保留在内存中,因为我需要在测试期间重新启动代理

我能做些什么来实现我的目标?

详细信息:

我已经尝试了 pickle cPickle marshal ,但有以下错误:

  
      
  • 定义__slots__但没有定义__getstate__的类无法被腌制

  •   
  • 无法挑选CDataGCP对象

  •   
  • ValueError:unmarshallable object
  •   

  • 1)更改原始对象以使其可序列化是多少钱?我该怎么办?
  • 2)如果主进程与第二个永远存活的python进程通信,它只是将对象保存在内存中会怎么样? 他们仍然需要通知obj序列化吗?

1 个答案:

答案 0 :(得分: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)