From: Balint Reczey Date: Mon, 18 Nov 2013 15:06:16 +0000 (+0100) Subject: Allow registering callback for parsing HTTP headers X-Git-Tag: release-2.1.4-alpha~59^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b0bd7fe1db93a1adde29587e12ed78726f962012;p=libevent Allow registering callback for parsing HTTP headers Slightly changed version of Espen Jürgensen's commit 548141e72312126fa6121f6a5f436đ251c7fb1251 for forked-daapd. --- diff --git a/http.c b/http.c index 33541728..826deffe 100644 --- a/http.c +++ b/http.c @@ -2150,6 +2150,14 @@ evhttp_read_header(struct evhttp_connection *evcon, /* Disable reading for now */ bufferevent_disable(evcon->bufev, EV_READ); + /* Callback can shut down connection with negative return value */ + if (req->header_cb != NULL) { + if ((*req->header_cb)(req, req->cb_arg) < 0) { + evhttp_connection_fail_(evcon, EVREQ_HTTP_EOF); + return; + } + } + /* Done reading headers, do the real work */ switch (req->kind) { case EVHTTP_REQUEST: @@ -3818,6 +3826,13 @@ evhttp_request_set_chunked_cb(struct evhttp_request *req, req->chunk_cb = cb; } +void +evhttp_request_set_header_cb(struct evhttp_request *req, + int (*cb)(struct evhttp_request *, void *)) +{ + req->header_cb = cb; +} + void evhttp_request_set_error_cb(struct evhttp_request *req, void (*cb)(enum evhttp_request_error, void *)) diff --git a/include/event2/http.h b/include/event2/http.h index 466a5a86..068120c7 100644 --- a/include/event2/http.h +++ b/include/event2/http.h @@ -504,6 +504,15 @@ struct evhttp_request *evhttp_request_new( void evhttp_request_set_chunked_cb(struct evhttp_request *, void (*cb)(struct evhttp_request *, void *)); +/** + * Register callback for additional parsing of request headers. + * @param cb will be called after receiving and parsing the full header. + * It allows analyzing the header and possibly closing the connection + * by returning a value < 0. + */ +void evhttp_request_set_header_cb(struct evhttp_request *, + int (*cb)(struct evhttp_request *, void *)); + /** * The different error types supported by evhttp * diff --git a/include/event2/http_struct.h b/include/event2/http_struct.h index 25e19bd9..4ca196ee 100644 --- a/include/event2/http_struct.h +++ b/include/event2/http_struct.h @@ -120,6 +120,14 @@ struct { * the regular callback. */ void (*chunk_cb)(struct evhttp_request *, void *); + + /* + * Callback added for forked-daapd so they can collect ICY + * (shoutcast) metadata from the http header. If return + * int is negative the connection will be closed. + */ + int (*header_cb)(struct evhttp_request *, void *); + /* * Error callback - called when error is occured. * @see evhttp_request_error for error types.