]> granicus.if.org Git - libevent/commitdiff
Fix a bug where headers arriving in multiple packets were not parsed; fix from Jiang...
authorNiels Provos <provos@gmail.com>
Tue, 19 Aug 2008 11:26:47 +0000 (11:26 +0000)
committerNiels Provos <provos@gmail.com>
Tue, 19 Aug 2008 11:26:47 +0000 (11:26 +0000)
svn:r928

ChangeLog
http.c
test/regress_http.c

index 2038a76186500a6d0a38e4f37e873e4d84485758..900f0c69f100bdf246ae6917f851248e1b9fb8b3 100644 (file)
--- 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 4a537deaabc16327614010fe5053dcced8a7dece..0833002e028302f7cb0794226fd1a1a23bb53e59 100644 (file)
--- 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);
 }
 
index 207814ad15c0af4052293f387c7f7cc296978130..630cf762025d0f959c115aab291eae84af076f68 100644 (file)
@@ -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);
        }