From c968eb3e01ff80b9959952b858d152d62a3ac9b6 Mon Sep 17 00:00:00 2001 From: Niels Provos Date: Tue, 19 Aug 2008 11:26:47 +0000 Subject: [PATCH] Fix a bug where headers arriving in multiple packets were not parsed; fix from Jiang Hong; test by me. svn:r928 --- ChangeLog | 1 + http.c | 1 + test/regress_http.c | 23 ++++++++++++++++++----- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2038a761..900f0c69 100644 --- a/ChangeLog +++ b/ChangeLog @@ -121,6 +121,7 @@ Changes in current version: o Fix a problem with epoll() and reinit; problem report by Alexander Drozdov. o Fix off-by-one errors in devpoll; from Ian Bell o Make event_add not change any state if it fails; reported by Ian Bell. + o Fix a bug where headers arriving in multiple packets were not parsed; fix from Jiang Hong; test by me. Changes in 1.4.0: o allow \r or \n individually to separate HTTP headers instead of the standard "\r\n"; from Charles Kerr. diff --git a/http.c b/http.c index 4a537dea..0833002e 100644 --- a/http.c +++ b/http.c @@ -1584,6 +1584,7 @@ evhttp_read_firstline(struct evhttp_connection *evcon, return; } + evcon->state = EVCON_READING_HEADERS; evhttp_read_header(evcon, req); } diff --git a/test/regress_http.c b/test/regress_http.c index 207814ad..630cf762 100644 --- a/test/regress_http.c +++ b/test/regress_http.c @@ -312,9 +312,20 @@ http_chunked_cb(struct evhttp_request *req, void *arg) event_once(-1, EV_TIMEOUT, http_chunked_trickle_cb, state, &when); } +static void +http_complete_write(int fd, short what, void *arg) +{ + struct bufferevent *bev = arg; + const char *http_request = "host\r\n" + "Connection: close\r\n" + "\r\n"; + bufferevent_write(bev, http_request, strlen(http_request)); +} + static void http_basic_test(void) { + struct timeval tv; struct bufferevent *bev; int fd; const char *http_request; @@ -337,17 +348,19 @@ http_basic_test(void) bev = bufferevent_new(fd, http_readcb, http_writecb, http_errorcb, NULL); + /* first half of the http request */ http_request = "GET /test HTTP/1.1\r\n" - "Host: somehost\r\n" - "Connection: close\r\n" - "\r\n"; + "Host: some"; bufferevent_write(bev, http_request, strlen(http_request)); + timerclear(&tv); + tv.tv_usec = 10000; + event_once(-1, EV_TIMEOUT, http_complete_write, bev, &tv); event_dispatch(); - if (test_ok != 2) { + if (test_ok != 3) { fprintf(stdout, "FAILED\n"); exit(1); } @@ -377,7 +390,7 @@ http_basic_test(void) evhttp_free(http); - if (test_ok != 4) { + if (test_ok != 5) { fprintf(stdout, "FAILED\n"); exit(1); }