diff --git a/gunicorn/workers/base_async.py b/gunicorn/workers/base_async.py index 73c3f6c1..0b7d6570 100644 --- a/gunicorn/workers/base_async.py +++ b/gunicorn/workers/base_async.py @@ -109,14 +109,16 @@ class AsyncWorker(base.Worker): if self.is_already_handled(respiter): return False try: - if isinstance(respiter, environ['wsgi.file_wrapper']): - resp.write_file(respiter) - else: - for item in respiter: - resp.write(item) - resp.close() - request_time = datetime.now() - request_start - self.log.access(resp, req, environ, request_time) + try: + if isinstance(respiter, environ['wsgi.file_wrapper']): + resp.write_file(respiter) + else: + for item in respiter: + resp.write(item) + resp.close() + finally: + request_time = datetime.now() - request_start + self.log.access(resp, req, environ, request_time) finally: if hasattr(respiter, "close"): respiter.close() diff --git a/gunicorn/workers/gthread.py b/gunicorn/workers/gthread.py index f0e5bbf5..dab22fb1 100644 --- a/gunicorn/workers/gthread.py +++ b/gunicorn/workers/gthread.py @@ -333,15 +333,17 @@ class ThreadWorker(base.Worker): respiter = self.wsgi(environ, resp.start_response) try: - if isinstance(respiter, environ['wsgi.file_wrapper']): - resp.write_file(respiter) - else: - for item in respiter: - resp.write(item) + try: + if isinstance(respiter, environ['wsgi.file_wrapper']): + resp.write_file(respiter) + else: + for item in respiter: + resp.write(item) - resp.close() - request_time = datetime.now() - request_start - self.log.access(resp, req, environ, request_time) + resp.close() + finally: + request_time = datetime.now() - request_start + self.log.access(resp, req, environ, request_time) finally: if hasattr(respiter, "close"): respiter.close() diff --git a/gunicorn/workers/sync.py b/gunicorn/workers/sync.py index 4bdf0003..b6350e86 100644 --- a/gunicorn/workers/sync.py +++ b/gunicorn/workers/sync.py @@ -177,14 +177,16 @@ class SyncWorker(base.Worker): self.alive = False respiter = self.wsgi(environ, resp.start_response) try: - if isinstance(respiter, environ['wsgi.file_wrapper']): - resp.write_file(respiter) - else: - for item in respiter: - resp.write(item) - resp.close() - request_time = datetime.now() - request_start - self.log.access(resp, req, environ, request_time) + try: + if isinstance(respiter, environ['wsgi.file_wrapper']): + resp.write_file(respiter) + else: + for item in respiter: + resp.write(item) + resp.close() + finally: + request_time = datetime.now() - request_start + self.log.access(resp, req, environ, request_time) finally: if hasattr(respiter, "close"): respiter.close()