Was the message lost or no one interested in this issue? best regards, hanzhu
On Mon, Jun 28, 2010 at 9:25 PM, Zhu Han <schumi....@gmail.com> wrote: > 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 >> > >
_______________________________________________ Libevent-users mailing list Libevent-users@monkey.org http://lists.monkey.org:8080/listinfo/libevent-users