2016-09-25 47 views
0

我正在使用mitmproxy(一種用於HTTP的Python中間人(MITM)代理)即時修改某個網站的HTTP請求。Python序列化HTTPFlow對象(MITM)

目標:

出於測試的目的,當它接收一個HTTP請求,它應該保存它(它接收一個HTTPFlow對象),並在下一次相同的請求將被做出我需要重新發送的確切同樣的data/html/header/resourses/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)