From 090bb8fe29c95465f1d40d431ef14bcdfaf8bde0 Mon Sep 17 00:00:00 2001 From: benoitc Date: Thu, 22 Apr 2010 19:07:23 +0200 Subject: [PATCH] add timeout support --- gunicorn/workers/async.py | 8 +++++++- gunicorn/workers/geventlet.py | 6 ++++++ gunicorn/workers/ggevent.py | 7 +++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/gunicorn/workers/async.py b/gunicorn/workers/async.py index 1587d1a3..7222972f 100644 --- a/gunicorn/workers/async.py +++ b/gunicorn/workers/async.py @@ -21,6 +21,10 @@ class AsyncWorker(Worker): def __init__(self, *args, **kwargs): Worker.__init__(self, *args, **kwargs) self.worker_connections = self.cfg.worker_connections + + def keepalive_request(self, client, addr): + return http.KeepAliveRequest(client, addr, self.address, + self.cfg) def handle(self, client, addr): try: @@ -49,7 +53,9 @@ class AsyncWorker(Worker): util.close(client) def handle_request(self, client, addr): - req = http.KeepAliveRequest(client, addr, self.address, self.cfg) + req = self.keepalive_request(client, addr) + if not req: + return False try: environ = req.read() if not environ or not req.parser.headers: diff --git a/gunicorn/workers/geventlet.py b/gunicorn/workers/geventlet.py index 6f51f3d8..5959ae0e 100644 --- a/gunicorn/workers/geventlet.py +++ b/gunicorn/workers/geventlet.py @@ -35,6 +35,12 @@ class EventletWorker(AsyncWorker): raise RuntimeError("You need eventlet >= 0.9.7") eventlet.monkey_patch(all=False, socket=True, select=True) + def keepalive_request(self, client, addr): + req = None + with eventlet.Timeout(self.cfg.keepalive, False): + req = super(EventletWorker, self).keepalive_request(client, addr) + return req + def run(self): self.socket.setblocking(1) diff --git a/gunicorn/workers/ggevent.py b/gunicorn/workers/ggevent.py index 310a6ddf..793027b4 100644 --- a/gunicorn/workers/ggevent.py +++ b/gunicorn/workers/ggevent.py @@ -10,6 +10,7 @@ import os import gevent from gevent import monkey +monkey.noisy = False from gevent import socket from gevent import greenlet from gevent.pool import Pool @@ -26,6 +27,12 @@ class GEventWorker(AsyncWorker): from gevent import monkey monkey.patch_all() + def keepalive_request(self, client, addr): + req = None + with gevent.Timeout(self.cfg.keepalive, False): + req = super(GEventWorker, self).keepalive_request(client, addr) + return req + def run(self): self.socket.setblocking(1)