From 6d4faab6d6bfa85e4f9afba02d933a09beee8a7f Mon Sep 17 00:00:00 2001 From: Ilya Konstantinov Date: Thu, 30 Jul 2020 10:33:55 -0400 Subject: [PATCH 1/2] Log access even when connection is closed --- gunicorn/workers/base_async.py | 18 ++++++++++-------- gunicorn/workers/gthread.py | 18 ++++++++++-------- gunicorn/workers/sync.py | 18 ++++++++++-------- 3 files changed, 30 insertions(+), 24 deletions(-) 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() From 858b743d072c7a6cbbf3eff1fffef08e76212e0e Mon Sep 17 00:00:00 2001 From: Ilya Priven Date: Thu, 11 May 2023 15:04:45 -0400 Subject: [PATCH 2/2] remove double finally --- gunicorn/workers/base_async.py | 18 ++++++++---------- gunicorn/workers/gthread.py | 18 ++++++++---------- gunicorn/workers/sync.py | 18 ++++++++---------- 3 files changed, 24 insertions(+), 30 deletions(-) diff --git a/gunicorn/workers/base_async.py b/gunicorn/workers/base_async.py index 0b7d6570..ec5d7644 100644 --- a/gunicorn/workers/base_async.py +++ b/gunicorn/workers/base_async.py @@ -109,17 +109,15 @@ class AsyncWorker(base.Worker): if self.is_already_handled(respiter): return False try: - 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) + 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) if hasattr(respiter, "close"): respiter.close() if resp.should_close(): diff --git a/gunicorn/workers/gthread.py b/gunicorn/workers/gthread.py index dab22fb1..9a6ad006 100644 --- a/gunicorn/workers/gthread.py +++ b/gunicorn/workers/gthread.py @@ -333,18 +333,16 @@ class ThreadWorker(base.Worker): respiter = self.wsgi(environ, resp.start_response) try: - try: - if isinstance(respiter, environ['wsgi.file_wrapper']): - resp.write_file(respiter) - else: - for item in respiter: - resp.write(item) + 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) + resp.close() finally: + request_time = datetime.now() - request_start + self.log.access(resp, req, environ, request_time) if hasattr(respiter, "close"): respiter.close() diff --git a/gunicorn/workers/sync.py b/gunicorn/workers/sync.py index b6350e86..d68d15cb 100644 --- a/gunicorn/workers/sync.py +++ b/gunicorn/workers/sync.py @@ -177,17 +177,15 @@ class SyncWorker(base.Worker): self.alive = False respiter = self.wsgi(environ, resp.start_response) try: - 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) + 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) if hasattr(respiter, "close"): respiter.close() except EnvironmentError: