Hi all, I have an http server using libevent-1.4.13-stable, running on
Linux (Fedora 11).  When I use curl to send a one-shot http request, my
server sends two responses on the wire!  This does not cause any errors in
the client, but it concerns me that the state handling in the http server
is not right and distracts me every time I wireshark.

Has anyone else noticed this problem?  Am I doing something wrong?

I am debugging, but haven't gotten far yet.  I do know this problem did
not happen with an ancient version of libevent I have stashed (svn trunk
r309).  Any assistance would be much appreciated.

My test is:

     $ curl -i localhost:18090/echo

and what I see on the wire is the expected response plus one more:

     # ngrep -d lo -W byline port 18090
     interface: lo (127.0.0.0/255.0.0.0)
     filter: (ip) and ( port 18090 )
     ####
     T 127.0.0.1:50506 -> 127.0.0.1:18090 [AP]
     GET /echo HTTP/1.1.
     User-Agent: curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5  
OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5.
     Host: localhost:18090.
     Accept: */*.
     .

     ##
     T 127.0.0.1:18090 -> 127.0.0.1:50506 [AP]
     HTTP/1.1 200 OK.
     content-length: 13.
     Date: Tue, 08 Dec 2009 14:08:23 GMT.
     Content-Type: text/html; charset=ISO-8859-1.
     .
     we are here!

     ###
     T 127.0.0.1:18090 -> 127.0.0.1:50506 [AP]
     HTTP/1.1 400 Bad Request.
     Content-Type: text/html.
     Connection: close.
     Date: Tue, 08 Dec 2009 14:08:23 GMT.
     Content-Length: 134.
     .
     <HTML><HEAD>
     <TITLE>400 Bad Request</TITLE>
     </HEAD><BODY>
     <H1>Method Not Implemented</H1>
     Invalid method in request<P>
     </BODY></HTML>

//---------------------program below-----------------------

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include "evhttp.h"

static void
req_set_clen(struct evhttp_request *req)
{
     char buf[11];
     snprintf(buf, sizeof(buf), "%ld",
              (long)EVBUFFER_LENGTH(req->output_buffer));
     evhttp_add_header(req->output_headers, "content-length", buf);
}

static void
echo_cb(struct evhttp_request *req, void *arg)
{
     evbuffer_add_printf(req->output_buffer, "we are here!\n");
     req_set_clen(req);
     evhttp_send_reply(req, HTTP_OK, "OK", NULL);
}

int
main(int argc, const char **argv)
{
     event_init();
     struct evhttp *http_srv = evhttp_start(NULL, 18090);
     evhttp_set_cb(http_srv, "/echo", echo_cb, NULL);
     event_dispatch();
     return 0;
}

//--------------------------------------------
_______________________________________________
Libevent-users mailing list
Libevent-users@monkey.org
http://lists.monkey.org:8080/listinfo/libevent-users

Reply via email to