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