aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy/flow.py
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2012-08-18 23:39:52 +1200
committerAldo Cortesi <aldo@nullcube.com>2012-08-18 23:41:04 +1200
commit3e96015e61072902941291bda56cea8c2e3b3d4b (patch)
tree170342da1ff00cc8f38ad24b0867cf07652000d1 /libmproxy/flow.py
parent53e453f72ede3b99fc36aca998ec78f8c186de1c (diff)
downloadmitmproxy-3e96015e61072902941291bda56cea8c2e3b3d4b.tar.gz
mitmproxy-3e96015e61072902941291bda56cea8c2e3b3d4b.tar.bz2
mitmproxy-3e96015e61072902941291bda56cea8c2e3b3d4b.zip
Add SetHeaders, analogous to ReplaceHooks, with a graphical editor in mitmproxy (H shortcut).
SetHeaders defines headers that are set on flows, based on a matching pattern. Existing headers are over-ridden.
Diffstat (limited to 'libmproxy/flow.py')
-rw-r--r--libmproxy/flow.py73
1 files changed, 62 insertions, 11 deletions
diff --git a/libmproxy/flow.py b/libmproxy/flow.py
index 2d016a14..6076d202 100644
--- a/libmproxy/flow.py
+++ b/libmproxy/flow.py
@@ -35,6 +35,11 @@ class ReplaceHooks:
def __init__(self):
self.lst = []
+ def set(self, r):
+ self.clear()
+ for i in r:
+ self.add(*i)
+
def add(self, fpatt, rex, s):
"""
Add a replacement hook.
@@ -56,17 +61,6 @@ class ReplaceHooks:
self.lst.append((fpatt, rex, s, cpatt))
return True
- def remove(self, fpatt, rex, s):
- """
- Remove a hook.
-
- patt: A string specifying a filter pattern.
- func: Optional callable. If not specified, all hooks matching patt are removed.
- """
- for i in range(len(self.lst)-1, -1, -1):
- if (fpatt, rex, s) == self.lst[i][:3]:
- del self.lst[i]
-
def get_specs(self):
"""
Retrieve the hook specifcations. Returns a list of (fpatt, rex, s) tuples.
@@ -88,6 +82,59 @@ class ReplaceHooks:
self.lst = []
+class SetHeaders:
+ def __init__(self):
+ self.lst = []
+
+ def set(self, r):
+ self.clear()
+ for i in r:
+ self.add(*i)
+
+ def add(self, fpatt, header, value):
+ """
+ Add a set header hook.
+
+ fpatt: String specifying a filter pattern.
+ header: Header name.
+ value: Header value string
+
+ Returns True if hook was added, False if the pattern could not be
+ parsed.
+ """
+ cpatt = filt.parse(fpatt)
+ if not cpatt:
+ return False
+ self.lst.append((fpatt, header, value, cpatt))
+ return True
+
+ def get_specs(self):
+ """
+ Retrieve the hook specifcations. Returns a list of (fpatt, rex, s) tuples.
+ """
+ return [i[:3] for i in self.lst]
+
+ def count(self):
+ return len(self.lst)
+
+ def clear(self):
+ self.lst = []
+
+ def run(self, f):
+ for _, header, value, cpatt in self.lst:
+ if cpatt(f):
+ if f.response:
+ del f.response.headers[header]
+ else:
+ del f.request.headers[header]
+ for _, header, value, cpatt in self.lst:
+ if cpatt(f):
+ if f.response:
+ f.response.headers.add(header, value)
+ else:
+ f.request.headers.add(header, value)
+
+
class ScriptContext:
def __init__(self, master):
self._master = master
@@ -1220,6 +1267,7 @@ class FlowMaster(controller.Master):
self.anticomp = False
self.refresh_server_playback = False
self.replacehooks = ReplaceHooks()
+ self.setheaders = SetHeaders()
self.stream = None
@@ -1426,6 +1474,7 @@ class FlowMaster(controller.Master):
def handle_error(self, r):
f = self.state.add_error(r)
self.replacehooks.run(f)
+ self.setheaders.run(f)
if f:
self.run_script_hook("error", f)
if self.client_playback:
@@ -1436,6 +1485,7 @@ class FlowMaster(controller.Master):
def handle_request(self, r):
f = self.state.add_request(r)
self.replacehooks.run(f)
+ self.setheaders.run(f)
self.run_script_hook("request", f)
self.process_new_request(f)
return f
@@ -1444,6 +1494,7 @@ class FlowMaster(controller.Master):
f = self.state.add_response(r)
if f:
self.replacehooks.run(f)
+ self.setheaders.run(f)
self.run_script_hook("response", f)
if self.client_playback:
self.client_playback.clear(f)