aboutsummaryrefslogtreecommitdiffstats
path: root/mitmproxy/libmproxy/flow_format_compat.py
blob: a7a95af3abb68d39c341e74cc8d71377d43ab5b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
"""
This module handles the import of mitmproxy flows generated by old versions.
"""
from __future__ import absolute_import, print_function, division
from . import version


def convert_013_014(data):
    data["request"]["first_line_format"] = data["request"].pop("form_in")
    data["request"]["http_version"] = "HTTP/" + ".".join(str(x) for x in data["request"].pop("httpversion"))
    data["response"]["status_code"] = data["response"].pop("code")
    data["response"]["body"] = data["response"].pop("content")
    data["server_conn"].pop("state")
    data["server_conn"]["via"] = None
    data["version"] = (0, 14)
    return data


def convert_014_015(data):
    data["version"] = (0, 15)
    return data


def convert_015_016(data):
    for m in ("request", "response"):
        if "body" in data[m]:
            data[m]["content"] = data[m].pop("body")
        if "httpversion" in data[m]:
            data[m]["http_version"] = data[m].pop("httpversion")
    if "msg" in data["response"]:
        data["response"]["reason"] = data["response"].pop("msg")
    data["request"].pop("form_out", None)
    data["version"] = (0, 16)
    return data


def convert_016_017(data):
    data["version"] = (0, 17)
    return data


converters = {
    (0, 13): convert_013_014,
    (0, 14): convert_014_015,
    (0, 15): convert_015_016,
    (0, 16): convert_016_017,
}


def migrate_flow(flow_data):
    while True:
        flow_version = tuple(flow_data["version"][:2])
        if flow_version == version.IVERSION[:2]:
            break
        elif flow_version in converters:
            flow_data = converters[flow_version](flow_data)
        else:
            v = ".".join(str(i) for i in flow_data["version"])
            raise ValueError("Incompatible serialized data version: {}".format(v))
    return flow_data