From 7d84001ca4807d5b718b15d813578b1d2c3957a1 Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Thu, 24 Dec 2015 17:08:26 +0100
Subject: [PATCH] Tweak code question error handling

---
 course/page/code.py | 43 ++++++++++++++++++++++---------------------
 1 file changed, 22 insertions(+), 21 deletions(-)

diff --git a/course/page/code.py b/course/page/code.py
index f4aa741f..0225d24b 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
 
         # }}}
 
-- 
GitLab