diff --git a/course/page/code.py b/course/page/code.py index f4aa741f619d9b00da31318327a9062cdf057c57..0225d24b2fc2d2e71ae8d264909df3234824d7f8 100644 --- a/course/page/code.py +++ b/course/page/code.py @@ -141,6 +141,17 @@ def request_python_run(run_req, run_timeout, image=None): from traceback import format_exc + def check_timeout(): + if time() - start_time < docker_timeout: + sleep(0.1) + # and retry + else: + return { + "result": "uncaught_error", + "message": "Timeout waiting for container.", + "traceback": "".join(format_exc()), + } + while True: try: connection = http_client.HTTPConnection('localhost', port) @@ -148,37 +159,27 @@ def request_python_run(run_req, run_timeout, image=None): connection.request('GET', '/ping') response = connection.getresponse() - response_data = response.read().decode("utf-8") + response_data = response.read().decode() if response_data != "OK": raise InvalidPingResponse() break + except (http_client.RemoteDisconnected, http_client.BadStatusLine, + InvalidPingResponse): + ct_res = check_timeout() + if ct_res is not None: + return ct_res + except socket.error as e: if e.errno in [errno.ECONNRESET, errno.ECONNREFUSED]: - if time() - start_time < docker_timeout: - sleep(0.1) - # and retry - else: - return { - "result": "uncaught_error", - "message": "Timeout waiting for container.", - "traceback": "".join(format_exc()), - } - else: - raise + ct_res = check_timeout() + if ct_res is not None: + return ct_res - except (http_client.BadStatusLine, InvalidPingResponse): - if time() - start_time < docker_timeout: - sleep(0.1) - # and retry else: - return { - "result": "uncaught_error", - "message": "Timeout waiting for container.", - "traceback": "".join(format_exc()), - } + raise # }}}