diff options
Diffstat (limited to 'libmproxy/web/__init__.py')
-rw-r--r-- | libmproxy/web/__init__.py | 89 |
1 files changed, 63 insertions, 26 deletions
diff --git a/libmproxy/web/__init__.py b/libmproxy/web/__init__.py index 69971436..aa1531b3 100644 --- a/libmproxy/web/__init__.py +++ b/libmproxy/web/__init__.py @@ -1,4 +1,5 @@ from __future__ import absolute_import, print_function +import collections import tornado.ioloop import tornado.httpserver from .. import controller, flow @@ -9,10 +10,64 @@ class Stop(Exception): pass +class WebFlowView(flow.FlowView): + def __init__(self, store): + super(WebFlowView, self).__init__(store, None) + + def _add(self, f): + super(WebFlowView, self)._add(f) + app.ClientConnection.broadcast( + type="flows", + cmd="add", + data=f.get_state(short=True) + ) + + def _update(self, f): + super(WebFlowView, self)._update(f) + app.ClientConnection.broadcast( + type="flows", + cmd="update", + data=f.get_state(short=True) + ) + + def _remove(self, f): + super(WebFlowView, self)._remove(f) + app.ClientConnection.broadcast( + type="flows", + cmd="remove", + data=f.get_state(short=True) + ) + + def _recalculate(self, flows): + super(WebFlowView, self)._recalculate(flows) + app.ClientConnection.broadcast( + type="flows", + cmd="reset" + ) + + class WebState(flow.State): def __init__(self): - flow.State.__init__(self) - + super(WebState, self).__init__() + self.view._close() + self.view = WebFlowView(self.flows) + + self._last_event_id = 0 + self.events = collections.deque(maxlen=1000) + + def add_event(self, e, level): + self._last_event_id += 1 + entry = { + "id": self._last_event_id, + "message": e, + "level": level + } + self.events.append(entry) + app.ClientConnection.broadcast( + type="events", + cmd="add", + data=entry + ) class Options(object): attributes = [ @@ -58,10 +113,8 @@ class Options(object): class WebMaster(flow.FlowMaster): def __init__(self, server, options): self.options = options - self.app = app.Application(self.options.wdebug) super(WebMaster, self).__init__(server, WebState()) - - self.last_log_id = 0 + self.app = app.Application(self.state, self.options.wdebug) def tick(self): flow.FlowMaster.tick(self, self.masterq, timeout=0) @@ -83,33 +136,17 @@ class WebMaster(flow.FlowMaster): self.shutdown() def handle_request(self, f): - app.ClientConnection.broadcast("add_flow", f.get_state(True)) - flow.FlowMaster.handle_request(self, f) + super(WebMaster, self).handle_request(f) if f: f.reply() return f def handle_response(self, f): - app.ClientConnection.broadcast("update_flow", f.get_state(True)) - flow.FlowMaster.handle_response(self, f) + super(WebMaster, self).handle_response(f) if f: f.reply() return f - def handle_error(self, f): - app.ClientConnection.broadcast("update_flow", f.get_state(True)) - flow.FlowMaster.handle_error(self, f) - return f - - def handle_log(self, l): - self.last_log_id += 1 - app.ClientConnection.broadcast( - "add_event", { - "id": self.last_log_id, - "message": l.msg, - "level": l.level - } - ) - self.add_event(l.msg, l.level) - l.reply() - + def add_event(self, e, level="info"): + super(WebMaster, self).add_event(e, level) + self.state.add_event(e, level)
\ No newline at end of file |