aboutsummaryrefslogtreecommitdiffstats
path: root/mitmproxy/tools
diff options
context:
space:
mode:
authorHenrique <typoon@gmail.com>2019-11-22 10:00:17 -0500
committerHenrique <typoon@gmail.com>2019-11-22 10:00:17 -0500
commit16b55f9476373347a3c2553e070497b383288360 (patch)
tree46f1bc8b46f6879d5429f7ce9ede834185942b12 /mitmproxy/tools
parentbbb7eb692f58ebfcf2fb3b0d6d20ec6dc60a99de (diff)
downloadmitmproxy-16b55f9476373347a3c2553e070497b383288360.tar.gz
mitmproxy-16b55f9476373347a3c2553e070497b383288360.tar.bz2
mitmproxy-16b55f9476373347a3c2553e070497b383288360.zip
Implemented feature to save command history to a file. This allows users
to reuse their commands the next time they open mitmproxy
Diffstat (limited to 'mitmproxy/tools')
-rw-r--r--mitmproxy/tools/console/commander/commander.py46
1 files changed, 41 insertions, 5 deletions
diff --git a/mitmproxy/tools/console/commander/commander.py b/mitmproxy/tools/console/commander/commander.py
index d751422b..d661d530 100644
--- a/mitmproxy/tools/console/commander/commander.py
+++ b/mitmproxy/tools/console/commander/commander.py
@@ -2,6 +2,7 @@ import abc
import collections
import copy
import typing
+import os
import urwid
from urwid.text_layout import calc_coords
@@ -147,29 +148,55 @@ class CommandBuffer:
self.completion = None
+# TODO: This class should be a Singleton
class CommandHistory:
- def __init__(self, master: mitmproxy.master.Master, size: int = 30) -> None:
+ def __init__(self, master: mitmproxy.master.Master, size: int = 300) -> None:
self.saved_commands: collections.deque = collections.deque(
[CommandBuffer(master, "")],
maxlen=size
)
self.index: int = 0
+ self.size: int = size
+ self.master: mitmproxy.master.Master = master
+
+ _command_history_path = os.path.join(os.path.expanduser(mitmproxy.options.CONF_DIR), 'command_history')
+ if os.path.exists(_command_history_path):
+ with open(_command_history_path, 'r') as f:
+ for l in f.readlines():
+ cbuf = CommandBuffer(master, l.strip())
+ self.add_command(cbuf)
+ f.close()
+
+ self.command_history_file = open(_command_history_path, 'w')
@property
def last_index(self):
return len(self.saved_commands) - 1
+ def clear_history(self):
+ """
+ Needed for test suite.
+ TODO: Maybe create a command to clear the history?
+ """
+ self.saved_commands: collections.deque = collections.deque(
+ [CommandBuffer(self.master, "")],
+ maxlen=self.size
+ )
+
+ self.index = 0
+ self.command_history_file.truncate(0)
+ self.command_history_file.seek(0)
+ self.command_history_file.flush()
+
def get_next(self) -> typing.Optional[CommandBuffer]:
if self.index < self.last_index:
self.index = self.index + 1
- return self.saved_commands[self.index]
- return None
+ return self.saved_commands[self.index]
def get_prev(self) -> typing.Optional[CommandBuffer]:
if self.index > 0:
self.index = self.index - 1
- return self.saved_commands[self.index]
- return None
+ return self.saved_commands[self.index]
def add_command(self, command: CommandBuffer, execution: bool = False) -> None:
if self.index == self.last_index or execution:
@@ -184,6 +211,15 @@ class CommandHistory:
if execution:
self.index = self.last_index
+ # This prevents the constructor from trying to overwrite the file
+ # that it is currently reading
+ if hasattr(self, 'command_history_file'):
+ _history_str = "\n".join([c.text for c in self.saved_commands])
+ self.command_history_file.truncate(0)
+ self.command_history_file.seek(0)
+ self.command_history_file.write(_history_str)
+ self.command_history_file.flush()
+
class CommandEdit(urwid.WidgetWrap):
leader = ": "