diff --git a/mitmproxy/master.py b/mitmproxy/master.py index d21a323e1..b17f7e5dd 100644 --- a/mitmproxy/master.py +++ b/mitmproxy/master.py @@ -147,14 +147,14 @@ class Master: raise exceptions.ReplayException( "Can't replay intercepted flow." ) - if f.request.raw_content is None: - raise exceptions.ReplayException( - "Can't replay flow with missing content." - ) if not f.request: raise exceptions.ReplayException( "Can't replay flow with missing request." ) + if f.request.raw_content is None: + raise exceptions.ReplayException( + "Can't replay flow with missing content." + ) f.backup() f.request.is_replay = True diff --git a/test/mitmproxy/test_flow.py b/test/mitmproxy/test_flow.py index 19f0e7d9a..9f6ed585c 100644 --- a/test/mitmproxy/test_flow.py +++ b/test/mitmproxy/test_flow.py @@ -7,7 +7,7 @@ from mitmproxy import flowfilter from mitmproxy import options from mitmproxy.proxy import config from mitmproxy.io import tnetstring -from mitmproxy.exceptions import FlowReadException +from mitmproxy.exceptions import FlowReadException, ReplayException, ControlException from mitmproxy import flow from mitmproxy import http from mitmproxy.proxy.server import DummyServer @@ -102,15 +102,19 @@ class TestFlowMaster: fm = master.Master(None, DummyServer()) f = tflow.tflow(resp=True) f.request.content = None - with pytest.raises(Exception, match="missing"): + with pytest.raises(ReplayException, match="missing"): + fm.replay_request(f) + + f.request = None + with pytest.raises(ReplayException, match="request"): fm.replay_request(f) f.intercepted = True - with pytest.raises(Exception, match="intercepted"): + with pytest.raises(ReplayException, match="intercepted"): fm.replay_request(f) f.live = True - with pytest.raises(Exception, match="live"): + with pytest.raises(ReplayException, match="live"): fm.replay_request(f) def test_all(self): @@ -132,6 +136,10 @@ class TestFlowMaster: f.error = flow.Error("msg") fm.addons.handle_lifecycle("error", f) + fm.tell("foo", f) + with pytest.raises(ControlException): + fm.tick(timeout=1) + fm.shutdown() diff --git a/test/mitmproxy/test_http.py b/test/mitmproxy/test_http.py index aa2835305..4463961ab 100644 --- a/test/mitmproxy/test_http.py +++ b/test/mitmproxy/test_http.py @@ -4,7 +4,7 @@ from mitmproxy.test import tflow from mitmproxy.net.http import Headers import mitmproxy.io from mitmproxy import flowfilter -from mitmproxy.exceptions import Kill +from mitmproxy.exceptions import Kill, ControlException from mitmproxy import flow from mitmproxy import http @@ -170,10 +170,18 @@ class TestHTTPFlow: assert not f == f2 f2.error = flow.Error("e2") assert not f == f2 + f2.backup() + f2.intercept() # to change the state f.set_state(f2.get_state()) assert f.get_state() == f2.get_state() def test_kill(self): + f = tflow.tflow() + with pytest.raises(ControlException): + f.intercept() + f.resume() + f.kill() + f = tflow.tflow() f.intercept() assert f.killable @@ -181,6 +189,13 @@ class TestHTTPFlow: assert not f.killable assert f.reply.value == Kill + def test_intercept(self): + f = tflow.tflow() + f.intercept() + assert f.reply.state == "taken" + f.intercept() + assert f.reply.state == "taken" + def test_resume(self): f = tflow.tflow() f.intercept()