diff options
author | Maximilian Hils <git@maximilianhils.com> | 2013-12-08 14:14:31 +0100 |
---|---|---|
committer | Maximilian Hils <git@maximilianhils.com> | 2013-12-08 14:14:31 +0100 |
commit | e3c69fd105f925009fdf31efe8598f70e2950ab4 (patch) | |
tree | b61bb99ae8e34f73583263619730fbbe5d526161 /libmproxy/flow.py | |
parent | 948d4c0445f006640d08d96dc3d6e604df78bc99 (diff) | |
parent | 3a1d85ab18dbff82505feac3619af733a0a2b4f7 (diff) | |
download | mitmproxy-e3c69fd105f925009fdf31efe8598f70e2950ab4.tar.gz mitmproxy-e3c69fd105f925009fdf31efe8598f70e2950ab4.tar.bz2 mitmproxy-e3c69fd105f925009fdf31efe8598f70e2950ab4.zip |
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'libmproxy/flow.py')
-rw-r--r-- | libmproxy/flow.py | 60 |
1 files changed, 33 insertions, 27 deletions
diff --git a/libmproxy/flow.py b/libmproxy/flow.py index 24042812..d79f2862 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -1349,7 +1349,7 @@ class FlowMaster(controller.Master): self.server_playback = None self.client_playback = None self.kill_nonreplay = False - self.script = None + self.scripts = [] self.pause_scripts = False self.stickycookie_state = False @@ -1385,37 +1385,43 @@ class FlowMaster(controller.Master): """ pass - def get_script(self, path): + def get_script(self, script_argv): """ Returns an (error, script) tuple. """ - s = script.Script(path, ScriptContext(self)) + s = script.Script(script_argv, ScriptContext(self)) try: s.load() except script.ScriptError, v: return (v.args[0], None) - ret = s.run("start") - if not ret[0] and ret[1]: - return ("Error in script start:\n\n" + ret[1][1], None) return (None, s) - def load_script(self, path): + def unload_script(self,script): + script.unload() + self.scripts.remove(script) + + def load_script(self, script_argv): """ Loads a script. Returns an error description if something went - wrong. If path is None, the current script is terminated. + wrong. """ - if path is None: - self.run_script_hook("done") - self.script = None + r = self.get_script(script_argv) + if r[0]: + return r[0] else: - r = self.get_script(path) - if r[0]: - return r[0] - else: - if self.script: - self.run_script_hook("done") - self.script = r[1] + self.scripts.append(r[1]) + def run_single_script_hook(self, script, name, *args, **kwargs): + if script and not self.pause_scripts: + ret = script.run(name, *args, **kwargs) + if not ret[0] and ret[1]: + e = "Script error:\n" + ret[1][1] + self.add_event(e, "error") + + def run_script_hook(self, name, *args, **kwargs): + for script in self.scripts: + self.run_single_script_hook(script, name, *args, **kwargs) + def set_stickycookie(self, txt): if txt: flt = filt.parse(txt) @@ -1565,13 +1571,6 @@ class FlowMaster(controller.Master): if block: rt.join() - def run_script_hook(self, name, *args, **kwargs): - if self.script and not self.pause_scripts: - ret = self.script.run(name, *args, **kwargs) - if not ret[0] and ret[1]: - e = "Script error:\n" + ret[1][1] - self.add_event(e, "error") - def handle_clientconnect(self, cc): self.run_script_hook("clientconnect", cc) cc.reply() @@ -1580,6 +1579,13 @@ class FlowMaster(controller.Master): self.run_script_hook("clientdisconnect", r) r.reply() + def handle_serverconnection(self, sc): + # To unify the mitmproxy script API, we call the script hook "serverconnect" rather than "serverconnection". + # As things are handled differently in libmproxy (ClientConnect + ClientDisconnect vs ServerConnection class), + # there is no "serverdisonnect" event at the moment. + self.run_script_hook("serverconnect", sc) + sc.reply() + def handle_error(self, r): f = self.state.add_error(r) if f: @@ -1613,8 +1619,8 @@ class FlowMaster(controller.Master): return f def shutdown(self): - if self.script: - self.load_script(None) + for script in self.scripts: + self.unload_script(script) controller.Master.shutdown(self) if self.stream: for i in self.state._flow_list: |