diff --git a/libmproxy/flow.py b/libmproxy/flow.py index 58e4eea46..c4bf35a5a 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -1096,11 +1096,8 @@ class State(object): Add an error response to the state. Returns the matching flow, or None if there isn't one. """ - if err.request: - f = self._flow_map.get(err.request) - if not f: - return None - else: + f = self._flow_map.get(err.request) + if not f: return None f.error = err if f.match(self._limit) and not f in self.view: diff --git a/test/scripts/duplicate_flow.py b/test/scripts/duplicate_flow.py new file mode 100644 index 000000000..f1b923095 --- /dev/null +++ b/test/scripts/duplicate_flow.py @@ -0,0 +1,5 @@ + +def request(ctx, f): + f = ctx.duplicate_flow(f) + ctx.replay_request(f) + diff --git a/test/test_flow.py b/test/test_flow.py index ffcb6e25b..67dfe3c2a 100644 --- a/test/test_flow.py +++ b/test/test_flow.py @@ -143,6 +143,17 @@ class uFlow(libpry.AutoTree): assert not f.request is f2.request assert f.request.headers == f2.request.headers assert not f.request.headers is f2.request.headers + assert f.response == f2.response + assert not f.response is f2.response + + f = tutils.tflow_err() + f2 = f.copy() + assert not f is f2 + assert not f.request is f2.request + assert f.request.headers == f2.request.headers + assert not f.request.headers is f2.request.headers + assert f.error == f2.error + assert not f.error is f2.error def test_match(self): f = tutils.tflow() @@ -301,7 +312,6 @@ class uState(libpry.AutoTree): assert c.add_response(resp) assert c.active_flow_count() == 0 - def test_err(self): c = flow.State() req = tutils.treq() @@ -322,7 +332,6 @@ class uState(libpry.AutoTree): assert c.add_error(e) assert c.view - def test_set_limit(self): c = flow.State() diff --git a/test/test_proxy.py b/test/test_proxy.py index 22bcb6d4b..fccef9771 100644 --- a/test/test_proxy.py +++ b/test/test_proxy.py @@ -24,6 +24,7 @@ class u_read_chunked(libpry.AutoTree): class Dummy: pass + class u_read_http_body(libpry.AutoTree): def test_all(self): @@ -42,7 +43,6 @@ class u_read_http_body(libpry.AutoTree): s = cStringIO.StringIO("testing") libpry.raises(proxy.ProxyError, proxy.read_http_body, s, d, h, False, 4) - h = flow.ODict() s = cStringIO.StringIO("testing") assert len(proxy.read_http_body(s, d, h, True, 4)) == 4 diff --git a/test/test_script.py b/test/test_script.py index 32ee2d956..94f036d9a 100644 --- a/test/test_script.py +++ b/test/test_script.py @@ -1,6 +1,7 @@ import os from libmproxy import script, flow import libpry +import tutils class uScript(libpry.AutoTree): def test_simple(self): @@ -13,15 +14,25 @@ class uScript(libpry.AutoTree): assert "here" in p.ns assert p.run("here") == (True, 1) assert p.run("here") == (True, 2) - + ret = p.run("errargs") - assert not ret[0] + assert not ret[0] assert len(ret[1]) == 2 # Check reload p.load() assert p.run("here") == (True, 1) + def test_duplicate_flow(self): + s = flow.State() + fm = flow.FlowMaster(None, s) + fm.load_script(os.path.join("scripts", "duplicate_flow.py")) + r = tutils.treq() + fm.handle_request(r) + assert fm.state.flow_count() == 2 + assert not fm.state.view[0].request.is_replay() + assert fm.state.view[1].request.is_replay() + def test_err(self): s = flow.State() fm = flow.FlowMaster(None, s)