aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2012-04-04 09:47:57 +1200
committerAldo Cortesi <aldo@nullcube.com>2012-04-04 09:47:57 +1200
commit79a0334a0245de915bfffc999906d45e0e42d37e (patch)
tree72ddc1948d2802b4b82c193e156d2a861ebecc20 /libmproxy
parentab0e10e60f9d481ac0aa782c69bd02de9b7fbf0d (diff)
downloadmitmproxy-79a0334a0245de915bfffc999906d45e0e42d37e.tar.gz
mitmproxy-79a0334a0245de915bfffc999906d45e0e42d37e.tar.bz2
mitmproxy-79a0334a0245de915bfffc999906d45e0e42d37e.zip
Improve revert model
- Flows are backed up whenever an interactive, non-script change is made. - That backup is canonical and never changed - "V" will always revert to it. This makes more sense than what we had previously....
Diffstat (limited to 'libmproxy')
-rw-r--r--libmproxy/console/flowlist.py5
-rw-r--r--libmproxy/console/flowview.py6
-rw-r--r--libmproxy/flow.py13
3 files changed, 16 insertions, 8 deletions
diff --git a/libmproxy/console/flowlist.py b/libmproxy/console/flowlist.py
index 412a4ec2..e4c73740 100644
--- a/libmproxy/console/flowlist.py
+++ b/libmproxy/console/flowlist.py
@@ -125,13 +125,18 @@ class ConnectionItem(common.WWrap):
self.master.currentflow = f
self.master.focus_current()
elif key == "r":
+ self.flow.backup()
r = self.master.replay_request(self.flow)
if r:
self.master.statusbar.message(r)
self.master.sync_list_view()
elif key == "V":
+ if not self.flow.modified():
+ self.master.statusbar.message("Flow not modified.")
+ return
self.state.revert(self.flow)
self.master.sync_list_view()
+ self.master.statusbar.message("Reverted.")
elif key == "w":
self.master.path_prompt(
"Save flows: ",
diff --git a/libmproxy/console/flowview.py b/libmproxy/console/flowview.py
index 1ec410ed..024a7ee1 100644
--- a/libmproxy/console/flowview.py
+++ b/libmproxy/console/flowview.py
@@ -460,13 +460,18 @@ class FlowView(common.WWrap):
elif key == "p":
self.view_prev_flow(self.flow)
elif key == "r":
+ self.flow.backup()
r = self.master.replay_request(self.flow)
if r:
self.master.statusbar.message(r)
self.master.refresh_flow(self.flow)
elif key == "V":
+ if not self.flow.modified():
+ self.master.statusbar.message("Flow not modified.")
+ return
self.state.revert(self.flow)
self.master.refresh_flow(self.flow)
+ self.master.statusbar.message("Reverted.")
elif key == "W":
self.master.path_prompt(
"Save this flow: ",
@@ -502,6 +507,7 @@ class FlowView(common.WWrap):
self.master.view_flowdetails(self.flow)
elif key == "z":
if conn:
+ self.flow.backup()
e = conn.headers["content-encoding"] or ["identity"]
if e[0] != "identity":
conn.decode()
diff --git a/libmproxy/flow.py b/libmproxy/flow.py
index 6444fb7e..571da836 100644
--- a/libmproxy/flow.py
+++ b/libmproxy/flow.py
@@ -760,6 +760,7 @@ class ClientConnect(controller.Msg):
return self._get_state() == other._get_state()
def _load_state(self, state):
+ self.close = True
self.requestcount = state["requestcount"]
def _get_state(self):
@@ -1047,21 +1048,16 @@ class Flow:
f._load_state(state)
return f
- def _get_state(self, nobackup=False):
+ def _get_state(self):
d = dict(
request = self.request._get_state() if self.request else None,
response = self.response._get_state() if self.response else None,
error = self.error._get_state() if self.error else None,
version = version.IVERSION
)
- if nobackup:
- d["backup"] = None
- else:
- d["backup"] = self._backup
return d
def _load_state(self, state):
- self._backup = state["backup"]
if self.request:
self.request._load_state(state["request"])
else:
@@ -1094,12 +1090,13 @@ class Flow:
else:
return False
- def backup(self):
+ def backup(self, force=False):
"""
Save a backup of this Flow, which can be reverted to using a
call to .revert().
"""
- self._backup = self._get_state(nobackup=True)
+ if not self._backup:
+ self._backup = self._get_state()
def revert(self):
"""