aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2016-09-09 11:15:07 +1200
committerAldo Cortesi <aldo@nullcube.com>2016-09-09 11:15:07 +1200
commitc1bb5821295678db0d7f3fa4481c3aa28108f161 (patch)
tree63c122d8b979cfbc09f321f311699376d3a8f259
parent715e47e3d4cc16c95d572ccc871cc24417ee358a (diff)
downloadmitmproxy-c1bb5821295678db0d7f3fa4481c3aa28108f161.tar.gz
mitmproxy-c1bb5821295678db0d7f3fa4481c3aa28108f161.tar.bz2
mitmproxy-c1bb5821295678db0d7f3fa4481c3aa28108f161.zip
Fix interactive server replay in mitmproxy console
-rw-r--r--mitmproxy/addons.py13
-rw-r--r--mitmproxy/builtins/serverplayback.py13
-rw-r--r--mitmproxy/console/master.py15
-rw-r--r--mitmproxy/console/statusbar.py8
-rw-r--r--mitmproxy/console/window.py20
-rw-r--r--test/mitmproxy/test_addons.py5
6 files changed, 28 insertions, 46 deletions
diff --git a/mitmproxy/addons.py b/mitmproxy/addons.py
index 04d1e905..2658c0af 100644
--- a/mitmproxy/addons.py
+++ b/mitmproxy/addons.py
@@ -14,6 +14,11 @@ class Addons(object):
master.options.changed.connect(self.options_update)
def get(self, name):
+ """
+ Retrieve an addon by name. Addon names are equal to the .name
+ attribute on the instance, or the lower case class name if that
+ does not exist.
+ """
for i in self.chain:
if name == _get_name(i):
return i
@@ -44,14 +49,6 @@ class Addons(object):
for i in self.chain:
self.invoke_with_context(i, "done")
- def has_addon(self, name):
- """
- Is an addon with this name registered?
- """
- for i in self.chain:
- if _get_name(i) == name:
- return True
-
def __len__(self):
return len(self.chain)
diff --git a/mitmproxy/builtins/serverplayback.py b/mitmproxy/builtins/serverplayback.py
index fe56d68b..be82cad9 100644
--- a/mitmproxy/builtins/serverplayback.py
+++ b/mitmproxy/builtins/serverplayback.py
@@ -88,13 +88,14 @@ class ServerPlayback(object):
def configure(self, options, updated):
self.options = options
- if options.server_replay and "server_replay" in updated:
- try:
- flows = flow.read_flows_from_paths(options.server_replay)
- except exceptions.FlowReadException as e:
- raise exceptions.OptionsError(str(e))
+ if "server_replay" in updated:
self.clear()
- self.load(flows)
+ if options.server_replay:
+ try:
+ flows = flow.read_flows_from_paths(options.server_replay)
+ except exceptions.FlowReadException as e:
+ raise exceptions.OptionsError(str(e))
+ self.load(flows)
# FIXME: These options have to be renamed to something more sensible -
# prefixed with serverplayback_ where appropriate, and playback_ where
diff --git a/mitmproxy/console/master.py b/mitmproxy/console/master.py
index 9d2fb78b..1cb3a32b 100644
--- a/mitmproxy/console/master.py
+++ b/mitmproxy/console/master.py
@@ -388,21 +388,6 @@ class ConsoleMaster(flow.FlowMaster):
if flows:
self.start_client_playback(flows, False)
- def server_playback_path(self, path):
- if not isinstance(path, list):
- path = [path]
- flows = self._readflows(path)
- if flows:
- self.start_server_playback(
- flows,
- self.options.kill, self.options.rheaders,
- False, self.options.nopop,
- self.options.replay_ignore_params,
- self.options.replay_ignore_content,
- self.options.replay_ignore_payload_params,
- self.options.replay_ignore_host
- )
-
def spawn_editor(self, data):
text = not isinstance(data, bytes)
fd, name = tempfile.mkstemp('', "mproxy", text=text)
diff --git a/mitmproxy/console/statusbar.py b/mitmproxy/console/statusbar.py
index a099e744..6c4cc8b5 100644
--- a/mitmproxy/console/statusbar.py
+++ b/mitmproxy/console/statusbar.py
@@ -147,14 +147,12 @@ class StatusBar(urwid.WidgetWrap):
if self.master.client_playback:
r.append("[")
r.append(("heading_key", "cplayback"))
- r.append(":%s to go]" % self.master.client_playback.count())
+ r.append(":%s]" % self.master.client_playback.count())
if self.master.options.server_replay:
r.append("[")
r.append(("heading_key", "splayback"))
- if self.master.options.nopop:
- r.append(":%s in file]" % self.master.options.server_replay.count())
- else:
- r.append(":%s to go]" % self.master.options.server_replay.count())
+ a = self.master.addons.get("serverplayback")
+ r.append(":%s]" % a.count())
if self.master.options.ignore_hosts:
r.append("[")
r.append(("heading_key", "I"))
diff --git a/mitmproxy/console/window.py b/mitmproxy/console/window.py
index 35593643..159f68ed 100644
--- a/mitmproxy/console/window.py
+++ b/mitmproxy/console/window.py
@@ -57,13 +57,11 @@ class Window(urwid.Frame):
callback = self.master.stop_client_playback_prompt,
)
elif k == "s":
- if not self.master.server_playback:
- signals.status_prompt_path.send(
- self,
- prompt = "Server replay path",
- callback = self.master.server_playback_path
- )
- else:
+ a = self.master.addons.get("serverplayback")
+ if a.count():
+ def stop_server_playback(response):
+ if response == "y":
+ self.master.options.server_replay = []
signals.status_prompt_onekey.send(
self,
prompt = "Stop current server replay?",
@@ -71,7 +69,13 @@ class Window(urwid.Frame):
("yes", "y"),
("no", "n"),
),
- callback = self.master.stop_server_playback_prompt,
+ callback = stop_server_playback
+ )
+ else:
+ signals.status_prompt_path.send(
+ self,
+ prompt = "Server playback path",
+ callback = lambda x: self.master.options.setter("server_replay")([x])
)
def keypress(self, size, k):
diff --git a/test/mitmproxy/test_addons.py b/test/mitmproxy/test_addons.py
index f59f99d6..52d7f07f 100644
--- a/test/mitmproxy/test_addons.py
+++ b/test/mitmproxy/test_addons.py
@@ -17,8 +17,5 @@ def test_simple():
m = controller.Master(o)
a = addons.Addons(m)
a.add(o, TAddon("one"))
- assert a.has_addon("one")
- assert not a.has_addon("two")
-
assert a.get("one")
- assert not a.get("nonexistent")
+ assert not a.get("two")