aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mitmproxy/addons/script.py20
-rw-r--r--test/mitmproxy/addons/test_script.py12
2 files changed, 32 insertions, 0 deletions
diff --git a/mitmproxy/addons/script.py b/mitmproxy/addons/script.py
index 6f0d1e28..a1e632db 100644
--- a/mitmproxy/addons/script.py
+++ b/mitmproxy/addons/script.py
@@ -5,6 +5,7 @@ import time
import sys
import types
import typing
+import traceback
from mitmproxy import addonmanager
from mitmproxy import exceptions
@@ -36,6 +37,25 @@ def load_script(path: str) -> types.ModuleType:
sys.path[:] = oldpath
+def script_error_handler(path, exc, msg="", tb=False):
+ """
+ Handles all the user's script errors with
+ an optional traceback
+ """
+ exception = type(exc).__name__
+ if msg:
+ exception = msg
+ lineno = ""
+ if hasattr(exc, "lineno"):
+ lineno = str(exc.lineno)
+ log_msg = "Error in Script {}:{} {}".format(path, lineno, exception)
+ if tb:
+ etype, value, tback = sys.exc_info()
+ tback = addonmanager.cut_traceback(tback, "invoke_addon")
+ log_msg = log_msg.join(["\n"] + traceback.format_exception(etype, value, tback))
+ ctx.log.error(log_msg)
+
+
class Script:
"""
An addon that manages a single script.
diff --git a/test/mitmproxy/addons/test_script.py b/test/mitmproxy/addons/test_script.py
index dc21e6fd..623ed9a1 100644
--- a/test/mitmproxy/addons/test_script.py
+++ b/test/mitmproxy/addons/test_script.py
@@ -243,6 +243,18 @@ class TestScriptLoader:
tctx.invoke(sc, "tick")
assert len(tctx.master.addons) == 1
+ def test_script_error_handler(self):
+ path = "/sample/path/example.py"
+ exc = SyntaxError
+ msg = "Error raised"
+ tb = True
+ with taddons.context() as tctx:
+ script.script_error_handler(path, exc, msg, tb)
+ assert tctx.master.has_log("/sample/path/example.py")
+ assert tctx.master.has_log("Error raised")
+ assert tctx.master.has_log("lineno")
+ assert tctx.master.has_log("NoneType")
+
def test_order(self):
rec = tutils.test_data.path("mitmproxy/data/addonscripts/recorder")
sc = script.ScriptLoader()