从MITM代理获取“原始”请求\响应

问题描述 投票:3回答:2

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

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

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

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

要访问被拦截的请求或响应,我没有改变任何东西,只是观察。现在,该代理位于8080上,稍后将成为80和443上的透明代理。如果有人能做到,可以分享一些信息,我会很高兴的。

http python-2.7 httprequest httpresponse mitmproxy
2个回答
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命名。这几乎解决了我的问题。与提琴手的一些检查表明,该请求稍后可重现,这正是我所需要的。


0
投票

对于那些想要将rquest /响应数据复制到剪贴板的人将在这里结束:

## 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

Source code

© www.soinside.com 2019 - 2024. All rights reserved.