aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@corte.si>2017-03-24 14:58:33 +1300
committerGitHub <noreply@github.com>2017-03-24 14:58:33 +1300
commit335861f490d7717c5b1bcc570a23d7fcf82520bc (patch)
tree623fe7bcc31c0e596e49a75f4736b1757ec9c430
parent439c113989feb193972b83ffcd0823ea4d2218df (diff)
parentabf291b0f943e0755b2e7fb0be5c429a50324881 (diff)
downloadmitmproxy-335861f490d7717c5b1bcc570a23d7fcf82520bc.tar.gz
mitmproxy-335861f490d7717c5b1bcc570a23d7fcf82520bc.tar.bz2
mitmproxy-335861f490d7717c5b1bcc570a23d7fcf82520bc.zip
Merge pull request #2207 from nikofil/scripts-redirect-stdout
scripts: redirect stdout to ctx.log.warn
-rw-r--r--mitmproxy/addons/script.py16
-rw-r--r--test/mitmproxy/addons/test_script.py27
-rw-r--r--test/mitmproxy/data/addonscripts/print.py2
3 files changed, 38 insertions, 7 deletions
diff --git a/mitmproxy/addons/script.py b/mitmproxy/addons/script.py
index 4d893f1c..3b7a4f79 100644
--- a/mitmproxy/addons/script.py
+++ b/mitmproxy/addons/script.py
@@ -65,14 +65,28 @@ def cut_traceback(tb, func_name):
return tb
+class StreamLog:
+ """
+ A class for redirecting output using contextlib.
+ """
+ def __init__(self, log):
+ self.log = log
+
+ def write(self, buf):
+ if buf.strip():
+ self.log(buf)
+
+
@contextlib.contextmanager
def scriptenv(path, args):
oldargs = sys.argv
sys.argv = [path] + args
script_dir = os.path.dirname(os.path.abspath(path))
sys.path.append(script_dir)
+ stdout_replacement = StreamLog(ctx.log.warn)
try:
- yield
+ with contextlib.redirect_stdout(stdout_replacement):
+ yield
except SystemExit as v:
ctx.log.error("Script exited with code %s" % v.code)
except Exception:
diff --git a/test/mitmproxy/addons/test_script.py b/test/mitmproxy/addons/test_script.py
index 16827488..84d36e2a 100644
--- a/test/mitmproxy/addons/test_script.py
+++ b/test/mitmproxy/addons/test_script.py
@@ -5,6 +5,7 @@ import re
import watchdog.events
import pytest
+from unittest import mock
from mitmproxy.test import tflow
from mitmproxy.test import tutils
from mitmproxy.test import taddons
@@ -97,12 +98,26 @@ class TestParseCommand:
def test_load_script():
- ns = script.load_script(
- tutils.test_data.path(
- "mitmproxy/data/addonscripts/recorder.py"
- ), []
- )
- assert ns.start
+ with taddons.context():
+ ns = script.load_script(
+ tutils.test_data.path(
+ "mitmproxy/data/addonscripts/recorder.py"
+ ), []
+ )
+ assert ns.start
+
+
+def test_script_print_stdout():
+ with taddons.context() as tctx:
+ with mock.patch('mitmproxy.ctx.log.warn') as mock_warn:
+ with script.scriptenv("path", []):
+ ns = script.load_script(
+ tutils.test_data.path(
+ "mitmproxy/data/addonscripts/print.py"
+ ), []
+ )
+ ns.start(tctx.options)
+ mock_warn.assert_called_once_with("stdoutprint")
class TestScript:
diff --git a/test/mitmproxy/data/addonscripts/print.py b/test/mitmproxy/data/addonscripts/print.py
new file mode 100644
index 00000000..fdfcc3d9
--- /dev/null
+++ b/test/mitmproxy/data/addonscripts/print.py
@@ -0,0 +1,2 @@
+def start(opts):
+ print("stdoutprint")