diff options
Diffstat (limited to 'libmproxy/flow.py')
-rw-r--r-- | libmproxy/flow.py | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/libmproxy/flow.py b/libmproxy/flow.py index 55a4dbcf..97d72992 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -10,11 +10,9 @@ import os import re import urlparse - from netlib import wsgi from netlib.exceptions import HttpException from netlib.http import CONTENT_MISSING, Headers, http1 -import netlib.http from . import controller, tnetstring, filt, script, version from .onboarding import app from .proxy.config import HostMatcher @@ -663,18 +661,21 @@ class FlowMaster(controller.Master): def unload_script(self, script_obj): try: script_obj.unload() - except script.ScriptError as e: + except script.ScriptException as e: self.add_event("Script error:\n" + str(e), "error") + script.reloader.unwatch(script_obj) self.scripts.remove(script_obj) - - def load_script(self, command): + + def load_script(self, command, use_reloader=True): """ Loads a script. Returns an error description if something went wrong. """ try: - s = script.Script(command, self) - except script.ScriptError as v: + s = script.Script(command, script.ScriptContext(self)) + if use_reloader: + script.reloader.watch(s, lambda: self.masterq.put(("script_change", s))) + except script.ScriptException as v: return v.args[0] self.scripts.append(s) @@ -682,7 +683,7 @@ class FlowMaster(controller.Master): if script_obj and not self.pause_scripts: try: script_obj.run(name, *args, **kwargs) - except script.ScriptError as e: + except script.ScriptException as e: self.add_event("Script error:\n" + str(e), "error") def run_script_hook(self, name, *args, **kwargs): @@ -1021,6 +1022,34 @@ class FlowMaster(controller.Master): def handle_accept_intercept(self, f): self.state.update_flow(f) + def handle_script_change(self, s): + """ + Handle a script whose contents have been changed on the file system. + + Args: + s (script.Script): the changed script + + Returns: + True, if reloading was successful. + False, otherwise. + """ + ok = True + # We deliberately do not want to fail here. + # In the worst case, we have an "empty" script object. + try: + s.unload() + except script.ScriptException as e: + ok = False + self.add_event('Error reloading "{}": {}'.format(s.filename, str(e))) + try: + s.load() + except script.ScriptException as e: + ok = False + self.add_event('Error reloading "{}": {}'.format(s.filename, str(e))) + else: + self.add_event('"{}" reloaded.'.format(s.filename)) + return ok + def shutdown(self): self.unload_scripts() controller.Master.shutdown(self) @@ -1037,7 +1066,6 @@ class FlowMaster(controller.Master): self.stream.fo.close() self.stream = None - def read_flows_from_paths(paths): """ Given a list of filepaths, read all flows and return a list of them. |