diff --git a/mitmproxy/flow.py b/mitmproxy/flow.py index 294aba26d..dc778404d 100644 --- a/mitmproxy/flow.py +++ b/mitmproxy/flow.py @@ -99,6 +99,7 @@ class Flow(stateobject.StateObject): return d def set_state(self, state): + state = state.copy() state.pop("version") if "backup" in state: self._backup = state.pop("backup") diff --git a/mitmproxy/http.py b/mitmproxy/http.py index c09778fea..7762647b4 100644 --- a/mitmproxy/http.py +++ b/mitmproxy/http.py @@ -56,6 +56,7 @@ class HTTPRequest(http.Request): return state def set_state(self, state): + state = state.copy() self.is_replay = state.pop("is_replay") super().set_state(state) diff --git a/test/mitmproxy/test_flow.py b/test/mitmproxy/test_flow.py index 7f9d577bc..fcc766b54 100644 --- a/test/mitmproxy/test_flow.py +++ b/test/mitmproxy/test_flow.py @@ -84,6 +84,17 @@ class TestSerialize: with pytest.raises(Exception, match="version"): list(r.stream()) + def test_copy(self): + """ + _backup may be shared across instances. That should not raise errors. + """ + f = tflow.tflow() + f.backup() + f.request.path = "/foo" + f2 = f.copy() + f2.revert() + f.revert() + class TestFlowMaster: def test_load_flow_reverse(self):