Frank, Thank you for your patch. I made another patch several minutes ago.
evhttp_request->userdone is used to indicate there is data being sending by the client. I suppose it is only useful for chunk encoding response. So I revert the meaning from userdone to user_working and mark the flag only when chunk encoding is started. IMHO, this should fix this issue. Could the maintainers take a look at it? Thank you! This patch is against libevent-1.4.14b. diff --git a/evhttp.h b/evhttp.h index 7ddf720..77ff781 100644 --- a/evhttp.h +++ b/evhttp.h @@ -222,7 +222,7 @@ struct { struct evbuffer *input_buffer; /* read data */ ev_int64_t ntoread; int chunked:1, /* a chunked request */ - userdone:1; /* the user has sent all data */ + user_working:1; /* the user is sending the data */ struct evbuffer *output_buffer; /* outgoing post or data */ diff --git a/http.c b/http.c index efcec40..aaaa6d6 100644 --- a/http.c +++ b/http.c @@ -610,8 +610,8 @@ evhttp_connection_incoming_fail(struct evhttp_request *req, * the request is still being used for sending, we * need to disassociated it from the connection here. */ - if (!req->userdone) { - /* remove it so that it will not be freed */ + if (req->user_working) { + /* remove it so that it will not be freed*/ TAILQ_REMOVE(&req->evcon->requests, req, next); /* indicate that this request no longer has a * connection object @@ -1942,7 +1942,7 @@ evhttp_send(struct evhttp_request *req, struct evbuffer *databuf) assert(TAILQ_FIRST(&evcon->requests) == req); /* we expect no more calls form the user on this request */ - req->userdone = 1; + req->user_working = 0; /* xxx: not sure if we really should expose the data buffer this way */ if (databuf != NULL) @@ -1967,6 +1967,8 @@ void evhttp_send_reply_start(struct evhttp_request *req, int code, const char *reason) { + /* mark the user is sending the request */ + req->user_working = 1; evhttp_response_code(req, code, reason); if (req->major == 1 && req->minor == 1) { /* use chunked encoding for HTTP/1.1 */ @@ -2008,7 +2010,7 @@ evhttp_send_reply_end(struct evhttp_request *req) } /* we expect no more calls form the user on this request */ - req->userdone = 1; + req->user_working = 0; if (req->chunked) { evbuffer_add(req->evcon->output_buffer, "0\r\n\r\n", 5); best regards, hanzhu On Mon, Jun 28, 2010 at 7:32 PM, Frank Denis <libev...@pureftpd.org> wrote: > Le Mon, Jun 28, 2010 at 07:21:21PM +0800, Zhu Han ecrivait : > > I observed the same problem in my environment. I took some time to trace > the > > cause. Seems like it's really a bug. Does anybody help me verify it and > > give a possible fix? > > This fixes it for me, although it's probably not the right way to fix > this : > > diff -ur /tmp/a/http.c /tmp/b/http.c > --- /tmp/a/http.c 2010-06-28 13:29:03.000000000 +0200 > +++ /tmp/b/http.c 2010-06-13 11:41:49.000000000 +0200 > @@ -557,7 +557,9 @@ > */ > if (!req->userdone) { > /* remove it so that it will not be freed */ > - TAILQ_REMOVE(&req->evcon->requests, req, next); > + if (req->evcon->http_server == NULL) { > + TAILQ_REMOVE(&req->evcon->requests, req, > next); > + } > /* indicate that this request no longer has a > * connection object > */ > > -- > Frank Denis - j [at] pureftpd.org - http://00f.net > _______________________________________________ > Libevent-users mailing list > Libevent-users@monkey.org > http://lists.monkey.org:8080/listinfo/libevent-users >
diff --git a/evhttp.h b/evhttp.h index 7ddf720..77ff781 100644 --- a/evhttp.h +++ b/evhttp.h @@ -222,7 +222,7 @@ struct { struct evbuffer *input_buffer; /* read data */ ev_int64_t ntoread; int chunked:1, /* a chunked request */ - userdone:1; /* the user has sent all data */ + user_working:1; /* the user is sending the data */ struct evbuffer *output_buffer; /* outgoing post or data */ diff --git a/http.c b/http.c index efcec40..aaaa6d6 100644 --- a/http.c +++ b/http.c @@ -610,8 +610,8 @@ evhttp_connection_incoming_fail(struct evhttp_request *req, * the request is still being used for sending, we * need to disassociated it from the connection here. */ - if (!req->userdone) { - /* remove it so that it will not be freed */ + if (req->user_working) { + /* remove it so that it will not be freed*/ TAILQ_REMOVE(&req->evcon->requests, req, next); /* indicate that this request no longer has a * connection object @@ -1942,7 +1942,7 @@ evhttp_send(struct evhttp_request *req, struct evbuffer *databuf) assert(TAILQ_FIRST(&evcon->requests) == req); /* we expect no more calls form the user on this request */ - req->userdone = 1; + req->user_working = 0; /* xxx: not sure if we really should expose the data buffer this way */ if (databuf != NULL) @@ -1967,6 +1967,8 @@ void evhttp_send_reply_start(struct evhttp_request *req, int code, const char *reason) { + /* mark the user is sending the request */ + req->user_working = 1; evhttp_response_code(req, code, reason); if (req->major == 1 && req->minor == 1) { /* use chunked encoding for HTTP/1.1 */ @@ -2008,7 +2010,7 @@ evhttp_send_reply_end(struct evhttp_request *req) } /* we expect no more calls form the user on this request */ - req->userdone = 1; + req->user_working = 0; if (req->chunked) { evbuffer_add(req->evcon->output_buffer, "0\r\n\r\n", 5);
_______________________________________________ Libevent-users mailing list Libevent-users@monkey.org http://lists.monkey.org:8080/listinfo/libevent-users