6

i',编写 mitm 代理 ( http://mitmproxy.org/index.html ) 脚本以根据其 IP 编写 HTTP 和 HTTPS 请求和对文件的响应(然后每个客户端都可以访问它自己的请求\响应)以进行单元测试移动的。

据我现在所见,我不能只使用 str(Flow.request) 或 repr(Flow.request) 来获得响应\请求的“原始”打印,就像我在提琴手中一样,我需要重建它来自 Request 和 Response 对象的内部数据。

有人知道更好的方法吗?我正在使用 :

def response(ScriptContext, Flow):
    Flow.request....
    Flow.response....

要访问被拦截的请求或响应,我没有更改任何内容,只是观察。目前代理在 8080 上,稍后将成为 80 和 443 上的透明代理。如果有人之前做过,如果你能分享一些信息,我会很高兴。

4

2 回答 2

6

对于那些想要将请求/响应数据复制到剪贴板而最终在这里的人:

## export the current request/response as curl/httpie/raw/request/response to clipboard
# press colon : and input one of commands and enter
export.clip curl @focus
export.clip httpie @focus
export.clip raw @focus
export.clip raw_request @focus
export.clip raw_response @focus

Mitmproxy:5.0.1

源代码

于 2020-04-04T10:27:12.097 回答
3

几件事。首先,您可以使用 str(flow.request.headers) 和 request.httpversion 等自己构建原始响应。然而,似乎 _assemble() 和 _assemble_headers() 做得很好。

所以基本上:

def request(context, flow):
req = flow.request;
try:
    print("Request: -----------------");
    print(req._assemble());
    print("--------------------------");
except Exception as ee:
    print(str(ee));

def response(context, flow):
    res = flow.response;
    try:
        print("Response: -----------------");
    print(res._assemble());

    if res.content:
        size = len(res.content);
        size  = min(size, 20);
        if res.content[0:size] != res.get_decoded_content()[0:size]:
            print("\n\n");
            print(res.get_decoded_content());
    print("--------------------------");
except Exception as ee:
    print(str(ee));

如您所见,解码后的正文是否与未解码的正文不同(尽管我可以检查 gzip 内容类型),我也在打印解码后的消息。这应该根据当前日期保存到文件中,并且每个文件都以从 request\response.client_conn 对象获取的客户端 ip 命名。这几乎解决了我的问题。对提琴手的一些检查表明该请求稍后可以重现,这正是我所需要的。

于 2014-02-09T20:26:02.983 回答