Полное руководство по сохранению HTTP-потоков с помощью mitmproxy

При веб-разработке и отладке часто необходимо захватывать и сохранять потоки HTTP для дальнейшего анализа. Mitmproxy — мощный инструмент, который позволяет перехватывать и изменять сетевой трафик, что делает его отличным выбором для захвата HTTP-потоков. В этой статье мы рассмотрим различные методы сохранения HTTP-потоков с помощью mitmproxy, а также приведем примеры кода.

Метод 1: сохранение потоков в файлы
Один простой подход — сохранить перехваченные потоки HTTP в отдельные файлы. Следующий фрагмент кода демонстрирует, как этого добиться:

from mitmproxy import flow
from mitmproxy import io
def save_stream(flow: flow.Flow):
    with open(f"stream_{flow.id}.txt", "w") as f:
        f.write(flow.request.content.decode())
def save_streams(filename: str, flows: flow.State):
    with open(filename, "wb") as f:
        writer = io.FlowWriter(f)
        writer.add(*flows)
        writer.commit()
def request(flow: flow.Flow):
    save_stream(flow)
def done(context: flow.Context):
    save_streams("saved_streams.mitm", context.state.flow)

Метод 2: сохранение потоков в базе данных
Если вы предпочитаете хранить захваченные потоки HTTP в базе данных, вы можете изменить приведенный выше код, чтобы сохранять потоки в базу данных по вашему выбору. Вот пример использования SQLite:

import sqlite3
from mitmproxy import flow
conn = sqlite3.connect("streams.db")
c = conn.cursor()
def save_stream(flow: flow.Flow):
    c.execute("INSERT INTO streams (id, content) VALUES (?, ?)", (flow.id, flow.request.content.decode()))
    conn.commit()
def request(flow: flow.Flow):
    save_stream(flow)
def done(context: flow.Context):
    conn.close()

Метод 3: сохранение потоков в формате HAR
HAR (HTTP-архив) — это широко поддерживаемый формат хранения информации, связанной с HTTP. Mitmproxy позволяет экспортировать захваченные потоки в формате HAR, используя следующий код:

from mitmproxy import flow
def request(flow: flow.Flow):
    pass
def response(flow: flow.Flow):
    pass
def done(context: flow.Context):
    context.save("streams.har", "har")

Сохранение HTTP-потоков может иметь решающее значение для отладки и анализа сетевого трафика. Mitmproxy предоставляет гибкие возможности для захвата и сохранения HTTP-потоков, независимо от того, записывает ли он их в файлы, сохраняет в базах данных или экспортирует в формат HAR. Используя эти методы, вы можете эффективно захватывать и анализировать потоки HTTP для различных сценариев веб-разработки и отладки.

Не забудьте изучить официальную документацию mitmproxy для получения более расширенных функций и возможностей настройки.