0

我正在使用mitmproxy,一个用于 HTTP 的 python 中间人 (MITM) 代理来动态修改某个网站的 HTTP 请求。

目标:

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

问题:

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

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

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

细节:

我已经尝试过picklecPicklemarshal,但出现以下错误:

  • 定义 __slots__ 而不定义 __getstate__ 的类不能被腌制

  • 不能腌制 CDataGCP 对象

  • ValueError:不可编组的对象

想法

  • 1)改变原始对象以使其可序列化多少是一个坏主意?我该怎么做?
  • 2)如果主进程与第二个永远活动的python进程通信,它只是将对象保存在内存中怎么办?他们还需要通信 obj 序列化它们吗?
4

1 回答 1

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)
于 2016-10-07T13:42:43.950 回答