Возврат пользовательского ответа с помощью 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, заголовками и телом в виде открытого текста.

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

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

как я могу вернуть его как фактический ответ «http», чтобы хром отображал его как html?


person Wärting    schedule 08.01.2016    source источник


Ответы (3)


не устанавливайте версию 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)
person Wärting    schedule 08.01.2016
comment
Кто-нибудь может обновить этот пример? Я считаю, что это немного устарело. - person xliiv; 09.06.2019

Фрагмент должен выглядеть так

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.

person xliiv    schedule 08.06.2019
comment
Вот ссылка на пример на Github: github.com/mitmproxy/mitmproxy/blob/master/examples/addons/ - person Alex Sandridge; 23.09.2020

Вы также можете поймать ответ и отредактировать/заменить его.

Использование 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")
person Erol    schedule 08.11.2016