lib/libevent-terom-r848.diff
author Tero Marttila <terom@fixme.fi>
Sat, 30 Aug 2008 19:13:15 +0300
changeset 49 10c7dce1a043
parent 14 5a2246f5be78
permissions -rw-r--r--
autogenerate the memcache_test help output, and pipeline memcache requests
14
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
Index: http.c
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
===================================================================
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
--- http.c	(revision 848)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
+++ http.c	(working copy)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
@@ -167,8 +167,10 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
 static void evhttp_read_header_cb(struct bufferevent *bufev, void *arg);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
 static void evhttp_write_cb(struct bufferevent *, void *);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
 static void evhttp_error_cb(struct bufferevent *bufev, short what, void *arg);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
 static int evhttp_decode_uri_internal(const char *uri, size_t length,
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
     char *ret);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
+static void _evhttp_reply_notify (struct evhttp_connection *evcon, void *arg);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
 #ifndef HAVE_STRSEP
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
 /* strsep replacement for platforms that lack it.  Only works if
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
@@ -293,13 +295,20 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
 void
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
 evhttp_write_buffer(struct evhttp_connection *evcon,
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
-    void (*cb)(struct evhttp_connection *, void *), void *arg)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
+    void (*cb)(struct evhttp_connection *, void *), void *arg,
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
+    size_t threshold)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
 {
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
 	event_debug(("%s: preparing to write buffer\n", __func__));
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
 	/* Set call back */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
 	evcon->cb = cb;
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
 	evcon->cb_arg = arg;
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
+    
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
+    if (threshold > 0) {
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
+        bufferevent_setwatermark(evcon->bufev, EV_WRITE, threshold, 0);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
+    } else {
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
+        bufferevent_setwatermark(evcon->bufev, EV_WRITE, 0, 0);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
+    }
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
 	bufferevent_disable(evcon->bufev, EV_READ);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
 	bufferevent_enable(evcon->bufev, EV_WRITE);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
@@ -483,6 +492,17 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
 	switch (error) {
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
 	case EVCON_HTTP_TIMEOUT:
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
 	case EVCON_HTTP_EOF:
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
+        /*
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
+         * Fix a bug that caused a nasty infinite-malloc()-and-write() loop.
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
+         * A write buffer error (e.g. EPIPE) means that we can't write to that 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
+         * socket anymore, and evhttp_connection_fail does disable
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
+         * EV_WRITE|EV_READ for that buffer. However, if we call req->cb, then
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
+         * that adds a "400 Bad Request" to the buffer, and enables it for
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
+         * EV_WRITE... which causes evhttp_connection_incoming_fail to be
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
+         * called again with EVCON_HTTP_BUFFER_ERROR... ended up having to
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
+         * hard-reset my machine.
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
+         */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
+	case EVCON_HTTP_BUFFER_ERROR:
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
 		/* 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
 		 * these are cases in which we probably should just
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
 		 * close the connection and not send a reply.  this
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
@@ -491,7 +511,6 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
 		 */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
 		return (-1);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
 	case EVCON_HTTP_INVALID_HEADER:
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
-	case EVCON_HTTP_BUFFER_ERROR:
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
 	case EVCON_HTTP_REQUEST_CANCEL:
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
 	default:	/* xxx: probably should just error on default */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
 		/* the callback looks at the uri to determine errors */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
@@ -869,7 +888,7 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
 	/* Create the header from the store arguments */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
 	evhttp_make_header(evcon, req);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
-	evhttp_write_buffer(evcon, evhttp_write_connectioncb, NULL);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
+	evhttp_write_buffer(evcon, evhttp_write_connectioncb, NULL, 0);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
 }
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
 /* Reset our connection state */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
@@ -1353,9 +1372,9 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
 		}
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
 	}
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
 		
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
-	event_debug(("%s: bytes to read: %d (in buffer %ld)\n",
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
+	event_debug(("%s: bytes to read: %ld (in buffer %ld)\n",
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
 		__func__, req->ntoread,
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
-		EVBUFFER_LENGTH(req->evcon->input_buffer)));
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
+		EVBUFFER_LENGTH(EVBUFFER_INPUT(req->evcon->bufev))));
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
 	return (0);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
 }
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
@@ -1688,6 +1707,10 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
 	/* delete possible close detection events */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
 	evhttp_connection_stop_detectclose(evcon);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
+    /* now that the reply was sent, we don't need to abort on connection lost */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
+    if (req->abort_cb)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
+        evhttp_connection_set_closecb(evcon, NULL, NULL);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
 	
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
 	need_close =
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
 	    (req->minor == 0 &&
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
@@ -1753,7 +1776,7 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
 	/* Adds headers to the response */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
 	evhttp_make_header(evcon, req);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
-	evhttp_write_buffer(evcon, evhttp_send_done, NULL);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
+	evhttp_write_buffer(evcon, evhttp_send_done, NULL, 0);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
 }
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
 void
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
@@ -1781,7 +1804,7 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
 		req->chunked = 1;
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
 	}
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
 	evhttp_make_header(req->evcon, req);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
-	evhttp_write_buffer(req->evcon, NULL, NULL);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
+	evhttp_write_buffer(req->evcon, NULL, NULL, 0);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
 }
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
 void
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
@@ -1796,9 +1819,32 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
 	if (req->chunked) {
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
 		evbuffer_add(output, "\r\n", 2);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
 	}
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
-	evhttp_write_buffer(req->evcon, NULL, NULL);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
+	evhttp_write_buffer(req->evcon, &_evhttp_reply_notify, req, req->write_threshold);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
 }
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
+static void
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
+_evhttp_reply_notify (struct evhttp_connection *evcon, void *arg)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
+{
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
+    struct evhttp_request *req = arg;
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
+    if (req->write_cb)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
+        req->write_cb(req, req->write_cb_arg);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
+}
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
+int
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
+evhttp_set_reply_notify(struct evhttp_request *req, size_t threshold,
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
+    void (*write_cb)(struct evhttp_request *, void *), void *cb_arg)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
+{
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
+    req->write_threshold = threshold;
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
+    req->write_cb = write_cb;
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
+    req->write_cb_arg = cb_arg;
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
+	evhttp_write_buffer(req->evcon, &_evhttp_reply_notify, req, threshold);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
+    return 0;
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
+}
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
 void
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
 evhttp_send_reply_end(struct evhttp_request *req)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
 {
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
@@ -1807,7 +1853,7 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
 	if (req->chunked) {
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
 		evbuffer_add(output, "0\r\n\r\n", 5);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
-		evhttp_write_buffer(req->evcon, evhttp_send_done, NULL);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
+		evhttp_write_buffer(req->evcon, evhttp_send_done, NULL, 0);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
 		req->chunked = 0;
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
 	} else if (EVBUFFER_LENGTH(output) == 0) {
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
 		/* let the connection know that we are done with the request */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
@@ -1819,6 +1865,28 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
 	}
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
 }
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
+void _evhttp_reply_aborted(struct evhttp_connection *evcon, void *arg)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
+{
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
+    struct evhttp_request *req = arg;
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
+    
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
+    /* call the callback */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
+    req->abort_cb(req, req->abort_cb_arg);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
+    
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
+    /* the request is now aborted, we don't want this called twice */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
+    evhttp_connection_set_closecb(evcon, NULL, NULL);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
+}
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
+void evhttp_set_reply_abortcb(struct evhttp_request *req,
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
+    void (*cb)(struct evhttp_request *, void *), void *cb_arg)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
+{
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
+    /* store the cb/arg in req */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
+    req->abort_cb = cb;
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
+    req->abort_cb_arg = cb_arg;
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
+    
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
+    /* add a closecb to the connection */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
+    evhttp_connection_set_closecb(req->evcon, &_evhttp_reply_aborted, req);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
+}
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
 void
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
 evhttp_response_code(struct evhttp_request *req, int code, const char *reason)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
 {
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
@@ -2448,6 +2516,19 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
  * Allows for inspection of the request URI
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
  */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
+enum evhttp_cmd_type
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
+evhttp_request_get_type(struct evhttp_request *req)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
+{
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
+    return req->type;
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
+}
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
+void
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
+evhttp_request_get_peer(struct evhttp_request *req,
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
+    char **address, ev_uint16_t *port)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
+{
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
+    return evhttp_connection_get_peer(req->evcon, address, port);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
+}
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
 const char *
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
 evhttp_request_get_uri(struct evhttp_request *req) {
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
 	if (req->uri == NULL)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
Index: http-internal.h
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
===================================================================
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
--- http-internal.h	(revision 848)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
+++ http-internal.h	(working copy)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
@@ -141,7 +141,8 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
 void evhttp_make_header(struct evhttp_connection *, struct evhttp_request *);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
 void evhttp_write_buffer(struct evhttp_connection *,
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
-    void (*)(struct evhttp_connection *, void *), void *);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
+    void (*)(struct evhttp_connection *, void *), void *,
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
+    size_t);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
 /* response sending HTML the data in the buffer */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
 void evhttp_response_code(struct evhttp_request *, int, const char *);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
Index: include/event2/http.h
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
===================================================================
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
--- include/event2/http.h	(revision 848)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
+++ include/event2/http.h	(working copy)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
@@ -243,6 +243,7 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
 */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   226
 void evhttp_send_reply_chunk(struct evhttp_request *req,
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
     struct evbuffer *databuf);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
 /**
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
    Complete a chunked reply.
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
@@ -250,6 +251,43 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
 */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
 void evhttp_send_reply_end(struct evhttp_request *req);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   236
+/**
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
+   Used to implement flow control for sending HTTP replies.
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   238
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
+   After calling evhttp_send_reply_start, and before calling
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
+   evhttp_send_reply_end, you may call this function to register a callback
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
+   that will be fired when the level of the HTTP connection's output buffer is
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
+   below the given threshold (if the output buffer is empty when this function
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   243
+   is called, this will happen on the next event-loop iteration).
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   244
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   245
+   This callback behaves in an edge-triggered way, such that it will only fire
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   246
+   once if the otuput buffer's level is below the threshold. It may be called
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   247
+   again after the next evhttp_send_reply_chunk call.
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   248
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   249
+   Once evhttp_send_reply_end is called (or an error occurs), the callback is
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   250
+   invalidated and not used anymore.
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   252
+   @param req a request object
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   253
+   @param threshold the buffer level to watch for
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   254
+   @param write_cb the callback to use
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   255
+   @param cb_arg the callback argument
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   256
+ 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
+*/
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   258
+int evhttp_set_reply_notify(struct evhttp_request *req, size_t threshold,
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   259
+    void (*write_cb)(struct evhttp_request *, void *), void *cb_arg);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   260
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   261
+/**
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
+   Register a callback to get called if the request is aborted due to some
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   263
+   reason other than evhttp_send_{reply,error,reply_end}, e.g. the HTTP
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   264
+   connection was lost.
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   265
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   266
+   @param req a request object
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   267
+   @param cb the callback to use
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
+   @param cb_arg the callback argument
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   269
+*/
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   270
+void evhttp_set_reply_abortcb(struct evhttp_request *,
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
+    void (*)(struct evhttp_request *, void *), void *);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   272
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   273
 /*
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
  * Interfaces for making requests
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
  */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   276
@@ -360,6 +398,11 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   277
 void evhttp_cancel_request(struct evhttp_request *req);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   278
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   279
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   280
+/** Get the request type for this request */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   281
+enum evhttp_cmd_type evhttp_request_get_type(struct evhttp_request *req);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   282
+/** Get the remote address and port this request came from. */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   283
+void evhttp_request_get_peer(struct evhttp_request *req,
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   284
+    char **address, ev_uint16_t *port);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   285
 /** Returns the request URI */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   286
 const char *evhttp_request_get_uri(struct evhttp_request *req);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   287
 /** Returns the input headers */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   288
Index: include/event2/http_struct.h
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   289
===================================================================
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   290
--- include/event2/http_struct.h	(revision 848)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   291
+++ include/event2/http_struct.h	(working copy)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   292
@@ -113,6 +113,19 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   293
 	 * the regular callback.
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   294
 	 */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   295
 	void (*chunk_cb)(struct evhttp_request *, void *);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   296
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   297
+    /*
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   298
+     * Request reply flow control callback
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   299
+     */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   300
+    size_t write_threshold;
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   301
+    void (*write_cb)(struct evhttp_request *, void *);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   302
+    void *write_cb_arg;
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   303
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   304
+    /*
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   305
+     * Request abort callback
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   306
+     */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   307
+    void (*abort_cb)(struct evhttp_request *, void *);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   308
+    void *abort_cb_arg;
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   309
 };
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   310
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   311
 #ifdef __cplusplus
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   312
Index: buffer.c
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   313
===================================================================
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   314
--- buffer.c	(revision 848)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   315
+++ buffer.c	(working copy)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   316
@@ -412,6 +412,9 @@
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   317
 	if (size == 0 || size > buf->total_len)
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   318
 		return (NULL);
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   319
 
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   320
+// XXX: the following will segfault if buf->total_len == 0 && size < -1
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   321
+// XXX: the following will return a buffer of arbitrary length if size < -1
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   322
+
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   323
 	/* No need to pull up anything; the first size bytes are
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   324
 	 * already here. */
5a2246f5be78 added lib/libevent-terom-r848.diff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   325
 	if (chain->off >= size)