From d03891a4706dc3106f3d51074e0e6b14cbb8ca0c Mon Sep 17 00:00:00 2001 From: wong2 Date: Wed, 11 Mar 2015 20:46:44 +0800 Subject: [PATCH] reloader should survive SyntaxError --- gunicorn/util.py | 12 ++++++++++++ gunicorn/workers/base.py | 15 ++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/gunicorn/util.py b/gunicorn/util.py index 13e6d65d..c8618b46 100644 --- a/gunicorn/util.py +++ b/gunicorn/util.py @@ -532,3 +532,15 @@ def warn(msg): print("!!!\n", file=sys.stderr) sys.stderr.flush() + + +def make_fail_app(msg): + + def app(environ, start_response): + start_response("500 Internal Server Error", [ + ("Content-Type", "text/plain"), + ("Content-Length", str(len(msg))) + ]) + return iter([msg]) + + return app diff --git a/gunicorn/workers/base.py b/gunicorn/workers/base.py index a82f6b85..58d0b5ea 100644 --- a/gunicorn/workers/base.py +++ b/gunicorn/workers/base.py @@ -8,6 +8,7 @@ import os import signal import sys import time +import traceback from random import randint @@ -116,7 +117,19 @@ class Worker(object): self.init_signals() - self.wsgi = self.app.wsgi() + try: + self.wsgi = self.app.wsgi() + except SyntaxError as e: + if not self.reloader: + raise + + self.log.exception(e) + + exc_type, exc_val, exc_tb = sys.exc_info() + self.reloader.add_extra_file(exc_val.filename) + + tb_string = traceback.format_exc(exc_tb) + self.wsgi = util.make_fail_app(tb_string) self.cfg.post_worker_init(self)