aboutsummaryrefslogtreecommitdiffstats
path: root/mitmproxy/contentviews/image/view.py
blob: 08a70795531818072c3d0e4bb6e523e2d1d70f10 (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
import io
import imghdr

from PIL import ExifTags
from PIL import Image

from mitmproxy.types import multidict
from . import image_parser

from mitmproxy.contentviews import base


class ViewImage(base.View):
    name = "Image"
    prompt = ("image", "i")
    content_types = [
        "image/png",
        "image/jpeg",
        "image/gif",
        "image/vnd.microsoft.icon",
        "image/x-icon",
    ]

    def __call__(self, data, **metadata):
        if imghdr.what('', h=data) == 'png':
            f = "PNG"
            parts = image_parser.parse_png(data)
            fmt = base.format_dict(multidict.MultiDict(parts))
            return "%s image" % f, fmt
        try:
            img = Image.open(io.BytesIO(data))
        except IOError:
            return None
        parts = [
            ("Format", str(img.format_description)),
            ("Size", "%s x %s px" % img.size),
            ("Mode", str(img.mode)),
        ]
        for i in sorted(img.info.keys()):
            if i != "exif":
                parts.append(
                    (str(i), str(img.info[i]))
                )
        if hasattr(img, "_getexif"):
            ex = img._getexif()
            if ex:
                for i in sorted(ex.keys()):
                    tag = ExifTags.TAGS.get(i, i)
                    parts.append(
                        (str(tag), str(ex[i]))
                    )
        fmt = base.format_dict(multidict.MultiDict(parts))
        return "%s image" % img.format, fmt