From 785923704c6d55af0fa1f06086349d1d707fea37 Mon Sep 17 00:00:00 2001 From: Niels Provos Date: Wed, 6 Dec 2006 04:12:11 +0000 Subject: [PATCH] fix a bug where event_set was called on a pending event; don't read body for return codes that do not require a body; from dug song. svn:r294 --- evhttp.h | 2 ++ http.c | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/evhttp.h b/evhttp.h index 229259d1..b1796d04 100644 --- a/evhttp.h +++ b/evhttp.h @@ -50,8 +50,10 @@ extern "C" { /* Response codes */ #define HTTP_OK 200 +#define HTTP_NOCONTENT 204 #define HTTP_MOVEPERM 301 #define HTTP_MOVETEMP 302 +#define HTTP_NOTMODIFIED 304 #define HTTP_BADREQUEST 400 #define HTTP_NOTFOUND 404 #define HTTP_SERVUNAVAIL 503 diff --git a/http.c b/http.c index 42996461..032ff8de 100644 --- a/http.c +++ b/http.c @@ -247,7 +247,10 @@ evhttp_write_buffer(struct evhttp_connection *evcon, evcon->cb = cb; evcon->cb_arg = arg; - /* xxx: maybe check if the event is still pending? */ + /* check if the event is already pending */ + if (event_pending(&evcon->ev, EV_WRITE|EV_TIMEOUT, NULL)) + event_del(&evcon->ev); + event_set(&evcon->ev, evcon->fd, EV_WRITE, evhttp_write, evcon); evhttp_add_event(&evcon->ev, evcon->timeout, HTTP_WRITE_TIMEOUT); } @@ -1138,9 +1141,17 @@ evhttp_read_header(int fd, short what, void *arg) break; case EVHTTP_RESPONSE: - event_debug(("%s: starting to read body for \"%s\" on %d\n", + if (req->response_code == HTTP_NOCONTENT || + req->response_code == HTTP_NOTMODIFIED || + (req->response_code >= 100 && req->response_code < 200)) { + event_debug(("%s: skipping body for code %d\n", + __func__, req->response_code)); + evhttp_connection_done(evcon); + } else { + event_debug(("%s: start of read body for %s on %d\n", __func__, req->remote_host, fd)); - evhttp_get_body(evcon, req); + evhttp_get_body(evcon, req); + } break; default: