Как сделать запрос внутри простого скрипта mitmproxy? - PullRequest
0 голосов
/ 31 марта 2020

Добрый день,

В настоящее время я пытаюсь найти способ сделать неблокирующие запросы в простом скрипте mitmproxy, но документация, на первый взгляд, мне не совсем понятна.

Я думаю, что, возможно, проще всего, если я покажу свой текущий код и опишу свою проблему ниже:

from copy import copy
from mitmproxy import http

def request(flow: http.HTTPFlow):
    headers = copy(flow.request.headers)
    headers.update({"Authorization": "<removed>", "Requested-URI": flow.request.pretty_url})
    req = http.HTTPRequest(
        first_line_format="origin_form",
        scheme=flow.request.scheme,
        port=443,
        path="/",
        http_version=flow.request.http_version,
        content=flow.request.content,
        host="my.api.xyz",
        headers=headers,
        method=flow.request.method
    )
    print(req.get_text())
    flow.response = http.HTTPResponse.make(
        200, req.content,
    )

В принципе, я бы хотел перехватить любой выполненный HTTP-запрос и сделать не блокирование запроса к конечной точке API по адресу https://my.api.xyz/, который должен взять все исходные заголовки и вернуть png-снимок экрана оригинального запрошенного URL.

Однако приведенный выше код создает пустой контент и выводит на печать Также ничего не возвращается.

Кажется, моя проблема связана с: mtmproxy http get-запрос в сценарии и Повторная отправка запроса из ответа в mitmproxy , но я все еще не смог ' t выяснить правильный способ отправки запросов внутри mitmproxy.

1 Ответ

0 голосов
/ 31 марта 2020

Следующий фрагмент кода, вероятно, делает то, что вы ищете:

from copy import copy
from mitmproxy import http
from mitmproxy import ctx
from mitmproxy.addons import clientplayback


def request(flow: http.HTTPFlow):
    ctx.log.info("Inside request")

    if hasattr(flow.request, 'is_custom'):
        return

    headers = copy(flow.request.headers)
    headers.update({"Authorization": "<removed>", "Requested-URI": flow.request.pretty_url})

    req = http.HTTPRequest(
        first_line_format="origin_form",
        scheme='http',
        port=8000,
        path="/",
        http_version=flow.request.http_version,
        content=flow.request.content,
        host="localhost",
        headers=headers,
        method=flow.request.method
    )

    req.is_custom = True
    playback = ctx.master.addons.get('clientplayback')
    f = flow.copy()
    f.request = req
    playback.start_replay([f])

Он использует дополнение clientplayback для отправки запроса. Когда этот новый запрос будет отправлен, это сгенерирует еще одно request событие, которое будет бесконечно l oop. По этой причине атрибут is_custom, который я добавил к этому запросу. Если запрос, который сгенерировал это событие, является тем, который мы создали, то мы не хотим создавать новый запрос из него.

...