diff options
-rw-r--r-- | mitmproxy/addons/eventstore.py | 22 | ||||
-rw-r--r-- | mitmproxy/tools/console/eventlog.py | 24 | ||||
-rw-r--r-- | test/mitmproxy/addons/test_eventstore.py | 15 |
3 files changed, 38 insertions, 23 deletions
diff --git a/mitmproxy/addons/eventstore.py b/mitmproxy/addons/eventstore.py index 415bd017..73ffc70c 100644 --- a/mitmproxy/addons/eventstore.py +++ b/mitmproxy/addons/eventstore.py @@ -1,31 +1,25 @@ -from typing import List # noqa +import collections +import typing # noqa import blinker from mitmproxy import command from mitmproxy.log import LogEntry -EVENTLOG_SIZE = 10000 - class EventStore: - def __init__(self): - self.data = [] # type: List[LogEntry] + def __init__(self, size=10000): + self.data = collections.deque(maxlen=size) # type: typing.Deque[LogEntry] self.sig_add = blinker.Signal() self.sig_refresh = blinker.Signal() + @property + def size(self) -> int: + return self.data.maxlen + def log(self, entry: LogEntry) -> None: self.data.append(entry) self.sig_add.send(self, entry=entry) - # Instead of removing one log row for every row > EVENTLOG_SIZE we add, - # we accept an overhead of 10% and only purge then to simplify the API. - if len(self.data) / EVENTLOG_SIZE >= 1.1: - self.purge() - - def purge(self): - """Purge event store size to EVENTLOG_SIZE""" - self.data = self.data[len(self.data) - EVENTLOG_SIZE:] - self.sig_refresh.send(self) @command.command("eventstore.clear") def clear(self) -> None: diff --git a/mitmproxy/tools/console/eventlog.py b/mitmproxy/tools/console/eventlog.py index 49e10dbc..a5d058a1 100644 --- a/mitmproxy/tools/console/eventlog.py +++ b/mitmproxy/tools/console/eventlog.py @@ -1,3 +1,5 @@ +import collections + import urwid from mitmproxy.tools.console import layoutwidget from mitmproxy import log @@ -12,12 +14,16 @@ class EventLog(urwid.ListBox, layoutwidget.LayoutWidget): title = "Events" def __init__(self, master): - self.walker = LogBufferWalker([]) self.master = master + self.walker = LogBufferWalker( + collections.deque(maxlen=self.master.events.size) + ) + + master.events.sig_add.connect(self.add_event) + master.events.sig_refresh.connect(self.refresh_events) + self.refresh_events() + super().__init__(self.walker) - master.events.sig_add.connect(self.add_entry) - master.events.sig_refresh.connect(self.refresh_entries) - self.refresh_entries(None) def load(self, loader): loader.add_option( @@ -34,9 +40,9 @@ class EventLog(urwid.ListBox, layoutwidget.LayoutWidget): self.set_focus(len(self.walker) - 1) elif key == "m_start": self.set_focus(0) - return urwid.ListBox.keypress(self, size, key) + return super().keypress(size, key) - def add_entry(self, event_store, entry: log.LogEntry): + def add_event(self, event_store, entry: log.LogEntry): if log.log_tier(self.master.options.verbosity) < log.log_tier(entry.level): return txt = "%s: %s" % (entry.level, str(entry.msg)) @@ -48,7 +54,7 @@ class EventLog(urwid.ListBox, layoutwidget.LayoutWidget): if self.master.options.console_focus_follow: self.walker.set_focus(len(self.walker) - 1) - def refresh_entries(self, event_store): - self.walker[:] = [] + def refresh_events(self, event_store=None): + self.walker.clear() for event in self.master.events.data: - self.add_entry(None, event) + self.add_event(None, event) diff --git a/test/mitmproxy/addons/test_eventstore.py b/test/mitmproxy/addons/test_eventstore.py index f54b9980..8ac26b05 100644 --- a/test/mitmproxy/addons/test_eventstore.py +++ b/test/mitmproxy/addons/test_eventstore.py @@ -30,3 +30,18 @@ def test_simple(): assert not sig_add.called assert sig_refresh.called + + +def test_max_size(): + store = eventstore.EventStore(3) + assert store.size == 3 + store.log(log.LogEntry("foo", "info")) + store.log(log.LogEntry("bar", "info")) + store.log(log.LogEntry("baz", "info")) + assert len(store.data) == 3 + assert ["foo", "bar", "baz"] == [x.msg for x in store.data] + + # overflow + store.log(log.LogEntry("boo", "info")) + assert len(store.data) == 3 + assert ["bar", "baz", "boo"] == [x.msg for x in store.data] |