0

特定の Web サイトの HTTP リクエストをオンザフライで変更するために、HTTP 用の Python 中間者 (MITM) プロキシであるmitmproxyを使用しています。

ゴール:

テスト目的で、HTTP 要求を受信すると、それを保存する必要があり ( HTTPFlowオブジェクトを受信します)、次に同じ要求が行われるときに、まったく同じdata/html/header/resourses/ecc を再送信する必要があります。ブラウザに。

問題:

明らかな解決策は、オブジェクトをシリアライズすることですが、シリアライズ可能ではありません!

テスト中にプロキシを再起動する必要があるため、単純にメモリに保持することはできません

目標を達成するために何ができますか?

詳細:

私はすでにpicklecPickle、およびmarshalを次のエラーで試しました:

  • __getstate__ を定義せずに __slots__ を定義するクラスはピクルできません

  • CDataGCP オブジェクトをピクルできません

  • ValueError: 整列化できないオブジェクト

アイデア:

  • 1) 元のオブジェクトを変更してシリアライズ可能にするのは、どのくらい悪い考えですか? どうすればそれを行うことができますか?
  • 2) メイン プロセスが、単にオブジェクトをメモリに保持する 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 に答える