使用mitmproxy返回自定义响应

时间:2016-01-08 12:22:29

标签: mitmproxy

我在尝试使用带有以下代码的mitmproxy时返回自定义响应

from libmproxy.models import HTTPResponse
from netlib.http import Headers

def request(context, flow):
    if flow.request.pretty_url.endswith("example.com/index.php"):
        resp = HTTPResponse(
            [1, 1], 200, "OK",
            Headers(Content_Type="text/html"),
            "<html><body>hello world</body></html>")
        flow.reply(resp)

但结果并不像预期的那样,在浏览器中显示的是http状态代码,标题为och body为明文

[1,1] 200 OK
Content-Type: text/html

<html><body>hello world</body></html>

如何将其作为实际的“http”响应返回,以便chrome将其呈现为html?

3 个答案:

答案 0 :(得分:1)

请勿将http版本设置为示例。将[1,1]替换为&#34; HTTP / 1.1&#34;

from libmproxy.models import HTTPResponse
from netlib.http import Headers

def request(context, flow):
    if flow.request.pretty_url.endswith("example.com/index.php"):
        resp = HTTPResponse(
            "HTTP/1.1", 200, "OK",
            Headers(Content_Type="text/html"),
            "<html><body>hello world</body></html>")
        flow.reply(resp)

答案 1 :(得分:0)

您也可以捕获响应并编辑/替换它。

使用BeautifulSoup也会让事情变得更轻松。

我的解决方案是创建一个html文件replace.html并将其替换为原始响应:

import mitmproxy
from bs4 import BeautifulSoup

def response(flow):
    if flow.request.pretty_host.endswith("example.com/index.php"):
        soup.BeautifulSoup(open("replace.html"))
        flow.response.content = str(soup).encode("utf8")

答案 2 :(得分:0)

代码段应如下所示

mitmproxy

适用于async的较新版本。