aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy/flow.py
diff options
context:
space:
mode:
Diffstat (limited to 'libmproxy/flow.py')
-rw-r--r--libmproxy/flow.py74
1 files changed, 47 insertions, 27 deletions
diff --git a/libmproxy/flow.py b/libmproxy/flow.py
index 8267ff43..c15f4566 100644
--- a/libmproxy/flow.py
+++ b/libmproxy/flow.py
@@ -301,7 +301,8 @@ class Flow:
return pattern(self.response)
elif self.request:
return pattern(self.request)
- return False
+ else:
+ return True
def kill(self, master):
self.error = proxy.Error(self.request, "Connection killed")
@@ -339,20 +340,26 @@ class Flow:
class State:
def __init__(self):
self.client_connections = []
- self.flow_map = {}
- self.flow_list = []
+
+ self._flow_map = {}
+ self._flow_list = []
+ self.view = []
# These are compiled filt expressions:
- self.limit = None
+ self._limit = None
self.intercept = None
- self.limit_txt = None
+ self._limit_txt = None
+
+ @property
+ def limit_txt(self):
+ return self._limit_txt
def flow_count(self):
- return len(self.flow_map)
+ return len(self._flow_map)
def active_flow_count(self):
c = 0
- for i in self.flow_list:
+ for i in self._flow_list:
if not i.response and not i.error:
c += 1
return c
@@ -371,18 +378,22 @@ class State:
Add a request to the state. Returns the matching flow.
"""
f = Flow(req)
- self.flow_list.append(f)
- self.flow_map[req] = f
+ self._flow_list.append(f)
+ self._flow_map[req] = f
+ if f.match(self._limit):
+ self.view.append(f)
return f
def add_response(self, resp):
"""
Add a response to the state. Returns the matching flow.
"""
- f = self.flow_map.get(resp.request)
+ f = self._flow_map.get(resp.request)
if not f:
return False
f.response = resp
+ if f.match(self._limit) and not f in self.view:
+ self.view.append(f)
return f
def add_error(self, err):
@@ -390,27 +401,31 @@ class State:
Add an error response to the state. Returns the matching flow, or
None if there isn't one.
"""
- f = self.flow_map.get(err.request) if err.request else None
+ f = self._flow_map.get(err.request) if err.request else None
if not f:
return None
f.error = err
+ if f.match(self._limit) and not f in self.view:
+ self.view.append(f)
return f
def load_flows(self, flows):
- self.flow_list.extend(flows)
+ self._flow_list.extend(flows)
for i in flows:
- self.flow_map[i.request] = i
+ self._flow_map[i.request] = i
+ self.recalculate_view()
def set_limit(self, txt):
if txt:
f = filt.parse(txt)
if not f:
return "Invalid filter expression."
- self.limit = f
- self.limit_txt = txt
+ self._limit = f
+ self._limit_txt = txt
else:
- self.limit = None
- self.limit_txt = None
+ self._limit = None
+ self._limit_txt = None
+ self.recalculate_view()
def set_intercept(self, txt):
if txt:
@@ -423,30 +438,35 @@ class State:
self.intercept = None
self.intercept_txt = None
- @property
- def view(self):
- if self.limit:
- return tuple([i for i in self.flow_list if i.match(self.limit)])
+ def recalculate_view(self):
+ if self._limit:
+ self.view = [i for i in self._flow_list if i.match(self._limit)]
else:
- return tuple(self.flow_list[:])
+ self.view = self._flow_list[:]
def delete_flow(self, f):
- if f.request in self.flow_map:
- del self.flow_map[f.request]
- self.flow_list.remove(f)
+ if f.request in self._flow_map:
+ del self._flow_map[f.request]
+ self._flow_list.remove(f)
+ if f.match(self._limit):
+ self.view.remove(f)
return True
def clear(self):
- for i in self.flow_list[:]:
+ for i in self._flow_list[:]:
self.delete_flow(i)
def accept_all(self):
- for i in self.flow_list[:]:
+ for i in self._flow_list[:]:
i.accept_intercept()
def revert(self, f):
f.revert()
+ def killall(self, master):
+ for i in self._flow_list:
+ i.kill(master)
+
class FlowMaster(controller.Master):