From 1ffcbdae274fe71eeda14806764df0c40e45a636 Mon Sep 17 00:00:00 2001 From: Julien BLACHE Date: Sat, 2 May 2009 18:47:00 +0200 Subject: [PATCH] Add a fail_cb to evhttp_request for connection failures The callback will be executed if a failure (timeout, read error) is detected on an incoming connection. This can be used to detect a client closing the connection while engaged in a chunked reply and actively pushing chunks to the client. Without this notification, it is impossible to know if/when a connection gets closed and react appropriately (ie. stop pushing chunks) resulting in a segfault. --- src/evhttp/evhttp.h | 3 +++ src/evhttp/http.c | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/evhttp/evhttp.h b/src/evhttp/evhttp.h index 99d16a2f..68bcff96 100644 --- a/src/evhttp/evhttp.h +++ b/src/evhttp/evhttp.h @@ -229,6 +229,9 @@ struct { void (*cb)(struct evhttp_request *, void *); void *cb_arg; + void (*fail_cb)(struct evhttp_request *, void *); + void *fail_cb_arg; + /* * Chunked data callback - call for each completed chunk if * specified. If not specified, all the data is delivered via diff --git a/src/evhttp/http.c b/src/evhttp/http.c index 2f62ec2f..bfd838d5 100644 --- a/src/evhttp/http.c +++ b/src/evhttp/http.c @@ -650,7 +650,11 @@ evhttp_connection_fail(struct evhttp_connection *evcon, * reply before the connection can be freed. */ if (evhttp_connection_incoming_fail(req, error) == -1) - evhttp_connection_free(evcon); + { + if (req->fail_cb) + req->fail_cb(req, req->fail_cb_arg); + evhttp_connection_free(evcon); + } return; }