Hi, I have a tunnel program to convert the TCP traffic to HTTP traffic using the libevent. When the data received, the listener's read_cb is invoked such as:
static read_cb(struct bufferevent *bev, void*ctx) { struct evbuffer *bev = bufferevent_get_input(bev); // now I need to start the HTTP connection. } As I need to consistently send the HTTP packets, I think it makes senses to reuse a evhttp_connection instance which can perfectly fit into the ctx. So in the accept callback, we initialize the evhttp_connection once, attach it the ctx, then just reuse it: // now I need to start the HTTP connection. evhttp_connection_reset(ctx->evconn); req = evhttp_request_new(response_cb, NULL); // tweak the data. evhttp_make_request(ctx->evconn, req, EVHTTP_REQ_POST, url); } ctx->evconn is freed in the event_cb of the listener. This approach may introduce racing condition: the connection is pending when we reset it. Also evhttp_connection_reset is an internal function which should not be used. So a better solution is to start a new evhttp_connection when read_cb is invoked. But I wonder where I should put evhttp_connection_free afterwards? The evhttp_make_request is not blocking, we can not just free the connection at the end of the read_cb. Is the response_cb a good place to free the evhttp_connection? The connection owns the request, and free the req when req is done or some error incurs, so I wonder whether it is OK to free the connection in evhttp_request_new's callback. I found somebody asks the same question: http://archives.seul.org/libevent/users/Oct-2010/msg00060.html But nobody responds yet. Any suggestion is greatly appreciated. Thanks, Best regards, Kun Xi *********************************************************************** To unsubscribe, send an e-mail to majord...@freehaven.net with unsubscribe libevent-users in the body.