aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mitmproxy/addons/eventstore.py22
-rw-r--r--mitmproxy/tools/console/eventlog.py24
-rw-r--r--test/mitmproxy/addons/test_eventstore.py15
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]