From 6fe6f715658dcdb5677d221518a8cbe7ff6afd2a Mon Sep 17 00:00:00 2001 From: Josue Kouka Date: Wed, 8 Feb 2017 16:09:51 +0100 Subject: [PATCH] improve generic timeout handling (#14913) --- mandayejs/mandaye/utils.py | 63 +++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/mandayejs/mandaye/utils.py b/mandayejs/mandaye/utils.py index 8050af9..fd7e310 100644 --- a/mandayejs/mandaye/utils.py +++ b/mandayejs/mandaye/utils.py @@ -29,39 +29,42 @@ from mandayejs.applications import get_app_settings logger = logging.getLogger(__name__) -def exec_phantom(data, script='do_login.js'): +def run(send_end, data, script): + phantom = subprocess.Popen([ + settings.PHANTOM_JS_BINARY, + '--ignore-ssl-errors=yes', '--ssl-protocol=any', + os.path.join(settings.BASE_DIR, 'mandayejs', script)], + close_fds=True, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE + ) + stdout, stderr = phantom.communicate(json.dumps(data)) + + try: + output = re.search('(.*?)', stdout, re.DOTALL) + if not output: + raise ValueError + stdout = output.group(1) + result = json.loads(stdout) + except (ValueError,): + result = {"result": "json_error"} + logger.error("invalid json: %s" % stdout) - def run(send_end): - phantom = subprocess.Popen([ - settings.PHANTOM_JS_BINARY, - '--ignore-ssl-errors=yes', '--ssl-protocol=any', - os.path.join(settings.BASE_DIR, 'mandayejs', script)], - close_fds=True, - stdin=subprocess.PIPE, - stdout=subprocess.PIPE - ) - stdout, stderr = phantom.communicate(json.dumps(data)) - - try: - output = re.search('(.*?)', stdout, re.DOTALL) - if not output: - raise ValueError - stdout = output.group(1) - result = json.loads(stdout) - except (ValueError,): - result = {"result": "json_error"} - logger.error("invalid json: %s" % stdout) - - if result.get('stderr'): - logger.warning(result['stderr']) - if result.get('error'): - logger.error('Error occured: %s' % result.get('reason')) - - send_end.send(result) + if result.get('stderr'): + logger.warning(result['stderr']) + if result.get('error'): + logger.error('Error occured: %s' % result.get('reason')) + send_end.send(result) + send_end.close() + + +def exec_phantom(data, script='do_login.js'): recv_end, send_end = multiprocessing.Pipe(False) - process = multiprocessing.Process(target=run, args=(send_end,)) + process = multiprocessing.Process(target=run, args=(send_end, data, script)) process.start() + result = recv_end.recv() + recv_end.close() process.join(settings.PHANTOM_JS_TIMEOUT) if process.is_alive(): @@ -70,8 +73,6 @@ def exec_phantom(data, script='do_login.js'): context = {k: v for k, v in data.items() if k != 'locators'} logger.error("PhantomJS process timeout, context: %s" % context) result = {'result': 'timeout'} - else: - result = recv_end.recv() return result -- 2.11.0