aboutsummaryrefslogtreecommitdiffstats
path: root/mitmproxy/contentviews/image/view.py
diff options
context:
space:
mode:
Diffstat (limited to 'mitmproxy/contentviews/image/view.py')
-rw-r--r--mitmproxy/contentviews/image/view.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/mitmproxy/contentviews/image/view.py b/mitmproxy/contentviews/image/view.py
new file mode 100644
index 00000000..4d13c917
--- /dev/null
+++ b/mitmproxy/contentviews/image/view.py
@@ -0,0 +1,53 @@
+import io, imghdr
+
+from PIL import ExifTags
+from PIL import Image
+
+from mitmproxy.types import multidict
+from . import image_parser
+
+from mitmproxy.contentviews import base
+from kaitaistruct import KaitaiStream
+
+
+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(io.BytesIO(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