From f9714fbf3e595ba4c93ef036bfe63e3b63e256ab Mon Sep 17 00:00:00 2001 From: Matthew Shao Date: Tue, 21 Feb 2017 11:59:50 +0800 Subject: Fix #1928, @concurrent decorator now works for class methods. --- mitmproxy/script/concurrent.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mitmproxy/script/concurrent.py b/mitmproxy/script/concurrent.py index 366929a5..87cdca96 100644 --- a/mitmproxy/script/concurrent.py +++ b/mitmproxy/script/concurrent.py @@ -29,4 +29,7 @@ def concurrent(fn): "script.concurrent (%s)" % fn.__name__, target=run ).start() - return _concurrent + if "." in fn.__qualname__: + return staticmethod(_concurrent) + else: + return _concurrent -- cgit v1.2.3 From 5fc4fc28b682dda8ad2d3fd5b5ddf91938da5258 Mon Sep 17 00:00:00 2001 From: Matthew Shao Date: Tue, 21 Feb 2017 16:56:48 +0800 Subject: Add test for @concurrent decorator in class. --- .../data/addonscripts/concurrent_decorator_class.py | 13 +++++++++++++ test/mitmproxy/script/test_concurrent.py | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 test/mitmproxy/data/addonscripts/concurrent_decorator_class.py diff --git a/test/mitmproxy/data/addonscripts/concurrent_decorator_class.py b/test/mitmproxy/data/addonscripts/concurrent_decorator_class.py new file mode 100644 index 00000000..bd047c99 --- /dev/null +++ b/test/mitmproxy/data/addonscripts/concurrent_decorator_class.py @@ -0,0 +1,13 @@ +import time +from mitmproxy.script import concurrent + + +class ConcurrentClass: + + @concurrent + def request(flow): + time.sleep(0.1) + + +def start(): + return ConcurrentClass() diff --git a/test/mitmproxy/script/test_concurrent.py b/test/mitmproxy/script/test_concurrent.py index fb932d9a..e81c023d 100644 --- a/test/mitmproxy/script/test_concurrent.py +++ b/test/mitmproxy/script/test_concurrent.py @@ -44,3 +44,21 @@ class TestConcurrent(tservers.MasterTest): ) sc.start() assert "decorator not supported" in tctx.master.event_log[0][1] + + def test_concurrent_class(self): + with taddons.context() as tctx: + sc = script.Script( + tutils.test_data.path( + "mitmproxy/data/addonscripts/concurrent_decorator_class.py" + ) + ) + sc.start() + + f1, f2 = tflow.tflow(), tflow.tflow() + tctx.cycle(sc, f1) + tctx.cycle(sc, f2) + start = time.time() + while time.time() - start < 5: + if f1.reply.state == f2.reply.state == "committed": + return + raise ValueError("Script never acked") -- cgit v1.2.3 From 29c4a43e50dac92373a27a936f4c2a39d0b44989 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Tue, 21 Feb 2017 15:38:20 +0100 Subject: docs++ --- mitmproxy/script/concurrent.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mitmproxy/script/concurrent.py b/mitmproxy/script/concurrent.py index 87cdca96..7573f2a5 100644 --- a/mitmproxy/script/concurrent.py +++ b/mitmproxy/script/concurrent.py @@ -29,6 +29,7 @@ def concurrent(fn): "script.concurrent (%s)" % fn.__name__, target=run ).start() + # Support @concurrent for class-based addons if "." in fn.__qualname__: return staticmethod(_concurrent) else: -- cgit v1.2.3