diff options
-rw-r--r-- | libmproxy/console/flowview.py | 21 | ||||
-rw-r--r-- | libmproxy/contentview.py | 48 | ||||
-rw-r--r-- | libmproxy/exceptions.py | 4 |
3 files changed, 32 insertions, 41 deletions
diff --git a/libmproxy/console/flowview.py b/libmproxy/console/flowview.py index e33d4c43..4946ed9c 100644 --- a/libmproxy/console/flowview.py +++ b/libmproxy/console/flowview.py @@ -1,6 +1,7 @@ from __future__ import absolute_import import os import sys +import traceback import urwid from netlib import odict @@ -10,6 +11,7 @@ from . import common, grideditor, signals, searchable, tabs from . import flowdetailview from .. import utils, controller, contentview from ..models import HTTPRequest, HTTPResponse, decoded +from ..exceptions import ContentViewException class SearchError(Exception): @@ -180,16 +182,29 @@ class FlowView(tabs.Tabs): else: limit = contentview.VIEW_CUTOFF description, text_objects = cache.get( - contentview.get_content_view, + self._get_content_view, viewmode, conn.headers, conn.content, limit, - isinstance(conn, HTTPRequest), - signals.add_event + isinstance(conn, HTTPRequest) ) return (description, text_objects) + def _get_content_view(self, viewmode, headers, content, limit, is_request): + try: + return contentview.get_content_view( + viewmode, headers, content, limit, is_request + ) + except ContentViewException: + s = "Content viewer failed: \n" + traceback.format_exc() + signals.add_event(s, "error") + msg, view = contentview.get_content_view( + viewmode, headers, content, limit, is_request + ) + msg = msg.replace("Raw", "Couldn't parse: falling back to Raw") + return msg, view + def viewmode_get(self): override = self.state.get_flow_setting( self.flow, diff --git a/libmproxy/contentview.py b/libmproxy/contentview.py index a9b6cf95..1b41066b 100644 --- a/libmproxy/contentview.py +++ b/libmproxy/contentview.py @@ -3,13 +3,15 @@ import cStringIO import json import logging import subprocess -import traceback import lxml.html import lxml.etree from PIL import Image from PIL.ExifTags import TAGS import html2text +import six +import sys +from libmproxy.exceptions import ContentViewException import netlib.utils from . import utils @@ -79,36 +81,6 @@ def trailer(content, limit): ) -""" -def _view_text(content, total, limit): - "" - Generates a body for a chunk of text. - "" - txt = [] - for i in netlib.utils.cleanBin(content).splitlines(): - txt.append( - urwid.Text(("text", i), wrap="any") - ) - trailer(total, txt, limit) - return txt - - -def trailer(clen, txt, limit): - rem = clen - limit - if rem > 0: - txt.append(urwid.Text("")) - txt.append( - urwid.Text( - [ - ("highlight", "... %s of data not shown. Press " % netlib.utils.pretty_size(rem)), - ("key", "f"), - ("highlight", " to load all data.") - ] - ) - ) -""" - - class View(object): name = None prompt = () @@ -535,7 +507,7 @@ def get(name): return i -def get_content_view(viewmode, headers, content, limit, is_request, log=None): +def get_content_view(viewmode, headers, content, limit, is_request): """ Returns: A (msg, body) tuple. @@ -559,12 +531,12 @@ def get_content_view(viewmode, headers, content, limit, is_request, log=None): try: ret = viewmode(headers, content, limit) # Third-party viewers can fail in unexpected ways... - except Exception: - if log: - s = traceback.format_exc() - s = "Content viewer failed: \n" + s - log(s, "error") - ret = None + except Exception as e: + six.reraise( + ContentViewException, + ContentViewException(str(e)), + sys.exc_info()[2] + ) if not ret: ret = get("Raw")(headers, content, limit) msg.append("Couldn't parse: falling back to Raw") diff --git a/libmproxy/exceptions.py b/libmproxy/exceptions.py index 0e11c136..03ddcb3d 100644 --- a/libmproxy/exceptions.py +++ b/libmproxy/exceptions.py @@ -51,3 +51,7 @@ class InvalidCredentials(HttpException): class ServerException(ProxyException): pass + + +class ContentViewException(ProxyException): + pass |