]> granicus.if.org Git - libevent/commitdiff
Add a variant of evhttp_send_reply_chunk() with a callback on evhttp_write_buffer()
authorJulien BLACHE <jb@jblache.org>
Sat, 2 May 2009 18:40:11 +0000 (20:40 +0200)
committerBalint Reczey <balint@balintreczey.hu>
Mon, 18 Nov 2013 14:39:47 +0000 (15:39 +0100)
evhttp_write_buffer() used by evhttp_send_reply_chunk() can take callback
executed when (part of) the buffer has been written. Using this callback to
schedule the next chunk avoids buffering large amounts of data in memory.

http.c
include/event2/http.h

diff --git a/http.c b/http.c
index e8672b778095f04b08bb17dcb2c8fcaadf27dc6a..33541728cf753e5aab5e6f5fbd3c07f120567e66 100644 (file)
--- a/http.c
+++ b/http.c
@@ -2658,7 +2658,8 @@ evhttp_send_reply_start(struct evhttp_request *req, int code,
 }
 
 void
-evhttp_send_reply_chunk(struct evhttp_request *req, struct evbuffer *databuf)
+evhttp_send_reply_chunk_with_cb(struct evhttp_request *req, struct evbuffer *databuf,
+    void (*cb)(struct evhttp_connection *, void *), void *arg)
 {
        struct evhttp_connection *evcon = req->evcon;
        struct evbuffer *output;
@@ -2680,9 +2681,14 @@ evhttp_send_reply_chunk(struct evhttp_request *req, struct evbuffer *databuf)
        if (req->chunked) {
                evbuffer_add(output, "\r\n", 2);
        }
-       evhttp_write_buffer(evcon, NULL, NULL);
+       evhttp_write_buffer(evcon, cb, arg);
 }
 
+void
+evhttp_send_reply_chunk(struct evhttp_request *req, struct evbuffer *databuf)
+{
+       evhttp_send_reply_chunk_with_cb(req, databuf, NULL, NULL);
+}
 void
 evhttp_send_reply_end(struct evhttp_request *req)
 {
index 956d9d6c86a83c2dc83850c6e5a11f0668267bc8..466a5a86f2fe48d0f6d4ed5a3b94f37c6434bb6b 100644 (file)
@@ -38,6 +38,7 @@ extern "C" {
 struct evbuffer;
 struct event_base;
 struct bufferevent;
+struct evhttp_connection;
 
 /** @file event2/http.h
  *
@@ -407,6 +408,23 @@ void evhttp_send_reply_start(struct evhttp_request *req, int code,
 */
 void evhttp_send_reply_chunk(struct evhttp_request *req,
     struct evbuffer *databuf);
+
+/**
+   Send another data chunk as part of an ongoing chunked reply.
+
+   The reply chunk consists of the data in databuf.  After calling
+   evhttp_send_reply_chunk() databuf will be empty, but the buffer is
+   still owned by the caller and needs to be deallocated by the caller
+   if necessary.
+
+   @param req a request object
+   @param databuf the data chunk to send as part of the reply.
+   @param cb callback funcion
+   @param call back's argument.
+*/
+void evhttp_send_reply_chunk_with_cb(struct evhttp_request *, struct evbuffer *,
+    void (*cb)(struct evhttp_connection *, void *), void *arg);
+
 /**
    Complete a chunked reply, freeing the request as appropriate.