aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy/web/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'libmproxy/web/__init__.py')
-rw-r--r--libmproxy/web/__init__.py89
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