Return 使用 mitmproxy 的自定义响应

Return custom response with mitmproxy

我正在尝试 return 使用带有以下代码的 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 状态代码,headers och body 明文

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

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

我如何 return 将其作为实际 "http" 响应,以便 chrome 将其呈现为 html?

不要以http版本为例。将 [1, 1] 替换为 "HTTP/1.1"

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)

您还可以捕获响应并 edit/replace 它。

使用 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")

代码段应如下所示

from mitmproxy import http


def request(flow):
    if flow.request.pretty_url.endswith("example.com/index.php"):
        flow.response = http.HTTPResponse.make(
            200,
            "<html><body>hello world</body></html>",
            {"content-type":"text/html"},
        )

对于 mitmproxy 的较新版本。