]> granicus.if.org Git - libevent/commitdiff
Allow registering callback for parsing HTTP headers
authorBalint Reczey <balint@balintreczey.hu>
Mon, 18 Nov 2013 15:06:16 +0000 (16:06 +0100)
committerBalint Reczey <balint@balintreczey.hu>
Mon, 18 Nov 2013 17:24:15 +0000 (18:24 +0100)
Slightly changed version of Espen Jürgensen's
commit 548141e72312126fa6121f6a5f436đ251c7fb1251 for forked-daapd.

http.c
include/event2/http.h
include/event2/http_struct.h

diff --git a/http.c b/http.c
index 33541728cf753e5aab5e6f5fbd3c07f120567e66..826deffe2d9a374a712c3456dc913ec886ccd341 100644 (file)
--- 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 *))
index 466a5a86f2fe48d0f6d4ed5a3b94f37c6434bb6b..068120c76444c542dbc46a4e4d989b0d18a792e2 100644 (file)
@@ -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
  *
index 25e19bd9991f38e3e0682859f73800d7f28eec2f..4ca196ee8bfdfa3bf53827f3bbb29cc0cad41cab 100644 (file)
@@ -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.