Merge pull request #2610 from mhils/log-threadsafe

Make master.add_log threadsafe
This commit is contained in:
Maximilian Hils 2017-10-26 21:55:06 +02:00 committed by GitHub
commit b32dff7520
2 changed files with 11 additions and 3 deletions

View File

@ -8,6 +8,7 @@ from mitmproxy import exceptions
from mitmproxy import eventsequence
from mitmproxy import controller
from mitmproxy import flow
from mitmproxy import log
from . import ctx
import pprint
@ -54,7 +55,13 @@ class StreamLog:
@contextlib.contextmanager
def safecall():
stdout_replacement = StreamLog(ctx.log.warn)
# resolve ctx.master here.
# we want to be threadsafe, and ctx.master may already be cleared when an addon prints().
tell = ctx.master.tell
# don't use master.add_log (which is not thread-safe). Instead, put on event queue.
stdout_replacement = StreamLog(
lambda message: tell("log", log.LogEntry(message, "warn"))
)
try:
with contextlib.redirect_stdout(stdout_replacement):
yield

View File

@ -7,6 +7,7 @@ import pytest
from mitmproxy import addonmanager
from mitmproxy import exceptions
from mitmproxy import log
from mitmproxy.addons import script
from mitmproxy.test import taddons
from mitmproxy.test import tflow
@ -50,7 +51,7 @@ def test_load_fullname():
def test_script_print_stdout():
with taddons.context() as tctx:
with mock.patch('mitmproxy.ctx.log.warn') as mock_warn:
with mock.patch('mitmproxy.ctx.master.tell') as mock_warn:
with addonmanager.safecall():
ns = script.load_script(
tutils.test_data.path(
@ -58,7 +59,7 @@ def test_script_print_stdout():
)
)
ns.load(addonmanager.Loader(tctx.master))
mock_warn.assert_called_once_with("stdoutprint")
mock_warn.assert_called_once_with("log", log.LogEntry("stdoutprint", "warn"))
class TestScript: