Projet

Général

Profil

0001-improve-generic-timeout-handling-14913.patch

Josué Kouka, 08 février 2017 17:31

Télécharger (3,3 ko)

Voir les différences:

Subject: [PATCH] improve generic timeout handling (#14913)

 mandayejs/mandaye/utils.py | 66 ++++++++++++++++++++++++----------------------
 1 file changed, 35 insertions(+), 31 deletions(-)
mandayejs/mandaye/utils.py
29 29
logger = logging.getLogger(__name__)
30 30

  
31 31

  
32
def exec_phantom(data, script='do_login.js'):
32
def run(send_end, data, script):
33
    phantom = subprocess.Popen([
34
        settings.PHANTOM_JS_BINARY,
35
        '--ignore-ssl-errors=yes', '--ssl-protocol=any',
36
        os.path.join(settings.BASE_DIR, 'mandayejs', script)],
37
        close_fds=True,
38
        stdin=subprocess.PIPE,
39
        stdout=subprocess.PIPE
40
    )
41
    stdout, stderr = phantom.communicate(json.dumps(data))
42

  
43
    try:
44
        output = re.search('<mandayejs>(.*?)</mandayejs>', stdout, re.DOTALL)
45
        if not output:
46
            raise ValueError
47
        stdout = output.group(1)
48
        result = json.loads(stdout)
49
    except (ValueError,):
50
        result = {"result": "json_error"}
51
        logger.error("invalid json: %s" % stdout)
52

  
53
    if result.get('stderr'):
54
        logger.warning(result['stderr'])
55
    if result.get('error'):
56
        logger.error('Error occured: %s' % result.get('reason'))
57

  
58
    send_end.send(result)
59
    send_end.close()
33 60

  
34
    def run(send_end):
35
        phantom = subprocess.Popen([
36
            settings.PHANTOM_JS_BINARY,
37
            '--ignore-ssl-errors=yes', '--ssl-protocol=any',
38
            os.path.join(settings.BASE_DIR, 'mandayejs', script)],
39
            close_fds=True,
40
            stdin=subprocess.PIPE,
41
            stdout=subprocess.PIPE
42
        )
43
        stdout, stderr = phantom.communicate(json.dumps(data))
44

  
45
        try:
46
            output = re.search('<mandayejs>(.*?)</mandayejs>', stdout, re.DOTALL)
47
            if not output:
48
                raise ValueError
49
            stdout = output.group(1)
50
            result = json.loads(stdout)
51
        except (ValueError,):
52
            result = {"result": "json_error"}
53
            logger.error("invalid json: %s" % stdout)
54

  
55
        if result.get('stderr'):
56
            logger.warning(result['stderr'])
57

  
58
        send_end.send(result)
59 61

  
62
def exec_phantom(data, script='do_login.js'):
60 63
    recv_end, send_end = multiprocessing.Pipe(False)
61
    process = multiprocessing.Process(target=run, args=(send_end,))
64
    process = multiprocessing.Process(target=run, args=(send_end, data, script))
62 65
    process.start()
63
    process.join(settings.PHANTOM_JS_TIMEOUT)
64 66

  
65
    if process.is_alive():
67
    if recv_end.poll(settings.PHANTOM_JS_TIMEOUT):
68
        result = recv_end.recv()
69
        recv_end.close()
70
    else:
66 71
        process.terminate()
72
        send_end.close()
67 73
        # Don't log locators, they may contain credentials (passwords)
68 74
        context = {k: v for k, v in data.items() if k != 'locators'}
69 75
        logger.error("PhantomJS process timeout, context: %s" % context)
70 76
        result = {'result': 'timeout'}
71
    else:
72
        result = recv_end.recv()
73 77

  
74 78
    return result
75 79

  
76
-