Home | History | Annotate | Download | only in libevent
      1 /*
      2  * Copyright (c) 2002-2007 Niels Provos <provos (at) citi.umich.edu>
      3  * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  * 3. The name of the author may not be used to endorse or promote products
     14  *    derived from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  */
     27 
     28 #include "event2/event-config.h"
     29 #include "evconfig-private.h"
     30 
     31 #ifdef EVENT__HAVE_SYS_PARAM_H
     32 #include <sys/param.h>
     33 #endif
     34 #ifdef EVENT__HAVE_SYS_TYPES_H
     35 #include <sys/types.h>
     36 #endif
     37 
     38 #ifdef HAVE_SYS_IOCCOM_H
     39 #include <sys/ioccom.h>
     40 #endif
     41 #ifdef EVENT__HAVE_SYS_RESOURCE_H
     42 #include <sys/resource.h>
     43 #endif
     44 #ifdef EVENT__HAVE_SYS_TIME_H
     45 #include <sys/time.h>
     46 #endif
     47 #ifdef EVENT__HAVE_SYS_WAIT_H
     48 #include <sys/wait.h>
     49 #endif
     50 
     51 #ifndef _WIN32
     52 #include <sys/socket.h>
     53 #include <sys/stat.h>
     54 #else
     55 #include <winsock2.h>
     56 #include <ws2tcpip.h>
     57 #endif
     58 
     59 #include <sys/queue.h>
     60 
     61 #ifdef EVENT__HAVE_NETINET_IN_H
     62 #include <netinet/in.h>
     63 #endif
     64 #ifdef EVENT__HAVE_ARPA_INET_H
     65 #include <arpa/inet.h>
     66 #endif
     67 #ifdef EVENT__HAVE_NETDB_H
     68 #include <netdb.h>
     69 #endif
     70 
     71 #ifdef _WIN32
     72 #include <winsock2.h>
     73 #endif
     74 
     75 #include <errno.h>
     76 #include <stdio.h>
     77 #include <stdlib.h>
     78 #include <string.h>
     79 #ifndef _WIN32
     80 #include <syslog.h>
     81 #endif
     82 #include <signal.h>
     83 #ifdef EVENT__HAVE_UNISTD_H
     84 #include <unistd.h>
     85 #endif
     86 #ifdef EVENT__HAVE_FCNTL_H
     87 #include <fcntl.h>
     88 #endif
     89 
     90 #undef timeout_pending
     91 #undef timeout_initialized
     92 
     93 #include "strlcpy-internal.h"
     94 #include "event2/http.h"
     95 #include "event2/event.h"
     96 #include "event2/buffer.h"
     97 #include "event2/bufferevent.h"
     98 #include "event2/http_struct.h"
     99 #include "event2/http_compat.h"
    100 #include "event2/util.h"
    101 #include "event2/listener.h"
    102 #include "log-internal.h"
    103 #include "util-internal.h"
    104 #include "http-internal.h"
    105 #include "mm-internal.h"
    106 #include "bufferevent-internal.h"
    107 
    108 #ifndef EVENT__HAVE_GETNAMEINFO
    109 #define NI_MAXSERV 32
    110 #define NI_MAXHOST 1025
    111 
    112 #ifndef NI_NUMERICHOST
    113 #define NI_NUMERICHOST 1
    114 #endif
    115 
    116 #ifndef NI_NUMERICSERV
    117 #define NI_NUMERICSERV 2
    118 #endif
    119 
    120 static int
    121 fake_getnameinfo(const struct sockaddr *sa, size_t salen, char *host,
    122 	size_t hostlen, char *serv, size_t servlen, int flags)
    123 {
    124 	struct sockaddr_in *sin = (struct sockaddr_in *)sa;
    125 
    126 	if (serv != NULL) {
    127 		char tmpserv[16];
    128 		evutil_snprintf(tmpserv, sizeof(tmpserv),
    129 		    "%d", ntohs(sin->sin_port));
    130 		if (strlcpy(serv, tmpserv, servlen) >= servlen)
    131 			return (-1);
    132 	}
    133 
    134 	if (host != NULL) {
    135 		if (flags & NI_NUMERICHOST) {
    136 			if (strlcpy(host, inet_ntoa(sin->sin_addr),
    137 			    hostlen) >= hostlen)
    138 				return (-1);
    139 			else
    140 				return (0);
    141 		} else {
    142 			struct hostent *hp;
    143 			hp = gethostbyaddr((char *)&sin->sin_addr,
    144 			    sizeof(struct in_addr), AF_INET);
    145 			if (hp == NULL)
    146 				return (-2);
    147 
    148 			if (strlcpy(host, hp->h_name, hostlen) >= hostlen)
    149 				return (-1);
    150 			else
    151 				return (0);
    152 		}
    153 	}
    154 	return (0);
    155 }
    156 
    157 #endif
    158 
    159 #define REQ_VERSION_BEFORE(req, major_v, minor_v)			\
    160 	((req)->major < (major_v) ||					\
    161 	    ((req)->major == (major_v) && (req)->minor < (minor_v)))
    162 
    163 #define REQ_VERSION_ATLEAST(req, major_v, minor_v)			\
    164 	((req)->major > (major_v) ||					\
    165 	    ((req)->major == (major_v) && (req)->minor >= (minor_v)))
    166 
    167 #ifndef MIN
    168 #define MIN(a,b) (((a)<(b))?(a):(b))
    169 #endif
    170 
    171 extern int debug;
    172 
    173 static evutil_socket_t bind_socket_ai(struct evutil_addrinfo *, int reuse);
    174 static evutil_socket_t bind_socket(const char *, ev_uint16_t, int reuse);
    175 static void name_from_addr(struct sockaddr *, ev_socklen_t, char **, char **);
    176 static int evhttp_associate_new_request_with_connection(
    177 	struct evhttp_connection *evcon);
    178 static void evhttp_connection_start_detectclose(
    179 	struct evhttp_connection *evcon);
    180 static void evhttp_connection_stop_detectclose(
    181 	struct evhttp_connection *evcon);
    182 static void evhttp_request_dispatch(struct evhttp_connection* evcon);
    183 static void evhttp_read_firstline(struct evhttp_connection *evcon,
    184 				  struct evhttp_request *req);
    185 static void evhttp_read_header(struct evhttp_connection *evcon,
    186     struct evhttp_request *req);
    187 static int evhttp_add_header_internal(struct evkeyvalq *headers,
    188     const char *key, const char *value);
    189 static const char *evhttp_response_phrase_internal(int code);
    190 static void evhttp_get_request(struct evhttp *, evutil_socket_t, struct sockaddr *, ev_socklen_t);
    191 static void evhttp_write_buffer(struct evhttp_connection *,
    192     void (*)(struct evhttp_connection *, void *), void *);
    193 static void evhttp_make_header(struct evhttp_connection *, struct evhttp_request *);
    194 
    195 /* callbacks for bufferevent */
    196 static void evhttp_read_cb(struct bufferevent *, void *);
    197 static void evhttp_write_cb(struct bufferevent *, void *);
    198 static void evhttp_error_cb(struct bufferevent *bufev, short what, void *arg);
    199 static int evhttp_find_vhost(struct evhttp *http, struct evhttp **outhttp,
    200 		  const char *hostname);
    201 
    202 #ifndef EVENT__HAVE_STRSEP
    203 /* strsep replacement for platforms that lack it.  Only works if
    204  * del is one character long. */
    205 static char *
    206 strsep(char **s, const char *del)
    207 {
    208 	char *d, *tok;
    209 	EVUTIL_ASSERT(strlen(del) == 1);
    210 	if (!s || !*s)
    211 		return NULL;
    212 	tok = *s;
    213 	d = strstr(tok, del);
    214 	if (d) {
    215 		*d = '\0';
    216 		*s = d + 1;
    217 	} else
    218 		*s = NULL;
    219 	return tok;
    220 }
    221 #endif
    222 
    223 static size_t
    224 html_replace(const char ch, const char **escaped)
    225 {
    226 	switch (ch) {
    227 	case '<':
    228 		*escaped = "&lt;";
    229 		return 4;
    230 	case '>':
    231 		*escaped = "&gt;";
    232 		return 4;
    233 	case '"':
    234 		*escaped = "&quot;";
    235 		return 6;
    236 	case '\'':
    237 		*escaped = "&#039;";
    238 		return 6;
    239 	case '&':
    240 		*escaped = "&amp;";
    241 		return 5;
    242 	default:
    243 		break;
    244 	}
    245 
    246 	return 1;
    247 }
    248 
    249 /*
    250  * Replaces <, >, ", ' and & with &lt;, &gt;, &quot;,
    251  * &#039; and &amp; correspondingly.
    252  *
    253  * The returned string needs to be freed by the caller.
    254  */
    255 
    256 char *
    257 evhttp_htmlescape(const char *html)
    258 {
    259 	size_t i;
    260 	size_t new_size = 0, old_size = 0;
    261 	char *escaped_html, *p;
    262 
    263 	if (html == NULL)
    264 		return (NULL);
    265 
    266 	old_size = strlen(html);
    267 	for (i = 0; i < old_size; ++i) {
    268 		const char *replaced = NULL;
    269 		const size_t replace_size = html_replace(html[i], &replaced);
    270 		if (replace_size > EV_SIZE_MAX - new_size) {
    271 			event_warn("%s: html_replace overflow", __func__);
    272 			return (NULL);
    273 		}
    274 		new_size += replace_size;
    275 	}
    276 
    277 	if (new_size == EV_SIZE_MAX)
    278 		return (NULL);
    279 	p = escaped_html = mm_malloc(new_size + 1);
    280 	if (escaped_html == NULL) {
    281 		event_warn("%s: malloc(%lu)", __func__,
    282 		           (unsigned long)(new_size + 1));
    283 		return (NULL);
    284 	}
    285 	for (i = 0; i < old_size; ++i) {
    286 		const char *replaced = &html[i];
    287 		const size_t len = html_replace(html[i], &replaced);
    288 		memcpy(p, replaced, len);
    289 		p += len;
    290 	}
    291 
    292 	*p = '\0';
    293 
    294 	return (escaped_html);
    295 }
    296 
    297 /** Given an evhttp_cmd_type, returns a constant string containing the
    298  * equivalent HTTP command, or NULL if the evhttp_command_type is
    299  * unrecognized. */
    300 static const char *
    301 evhttp_method(enum evhttp_cmd_type type)
    302 {
    303 	const char *method;
    304 
    305 	switch (type) {
    306 	case EVHTTP_REQ_GET:
    307 		method = "GET";
    308 		break;
    309 	case EVHTTP_REQ_POST:
    310 		method = "POST";
    311 		break;
    312 	case EVHTTP_REQ_HEAD:
    313 		method = "HEAD";
    314 		break;
    315 	case EVHTTP_REQ_PUT:
    316 		method = "PUT";
    317 		break;
    318 	case EVHTTP_REQ_DELETE:
    319 		method = "DELETE";
    320 		break;
    321 	case EVHTTP_REQ_OPTIONS:
    322 		method = "OPTIONS";
    323 		break;
    324 	case EVHTTP_REQ_TRACE:
    325 		method = "TRACE";
    326 		break;
    327 	case EVHTTP_REQ_CONNECT:
    328 		method = "CONNECT";
    329 		break;
    330 	case EVHTTP_REQ_PATCH:
    331 		method = "PATCH";
    332 		break;
    333 	default:
    334 		method = NULL;
    335 		break;
    336 	}
    337 
    338 	return (method);
    339 }
    340 
    341 /**
    342  * Determines if a response should have a body.
    343  * Follows the rules in RFC 2616 section 4.3.
    344  * @return 1 if the response MUST have a body; 0 if the response MUST NOT have
    345  *     a body.
    346  */
    347 static int
    348 evhttp_response_needs_body(struct evhttp_request *req)
    349 {
    350 	return (req->response_code != HTTP_NOCONTENT &&
    351 		req->response_code != HTTP_NOTMODIFIED &&
    352 		(req->response_code < 100 || req->response_code >= 200) &&
    353 		req->type != EVHTTP_REQ_HEAD);
    354 }
    355 
    356 /** Helper: called after we've added some data to an evcon's bufferevent's
    357  * output buffer.  Sets the evconn's writing-is-done callback, and puts
    358  * the bufferevent into writing mode.
    359  */
    360 static void
    361 evhttp_write_buffer(struct evhttp_connection *evcon,
    362     void (*cb)(struct evhttp_connection *, void *), void *arg)
    363 {
    364 	event_debug(("%s: preparing to write buffer\n", __func__));
    365 
    366 	/* Set call back */
    367 	evcon->cb = cb;
    368 	evcon->cb_arg = arg;
    369 
    370 	/* Disable the read callback: we don't actually care about data;
    371 	 * we only care about close detection.  (We don't disable reading,
    372 	 * since we *do* want to learn about any close events.) */
    373 	bufferevent_setcb(evcon->bufev,
    374 	    NULL, /*read*/
    375 	    evhttp_write_cb,
    376 	    evhttp_error_cb,
    377 	    evcon);
    378 
    379 	bufferevent_enable(evcon->bufev, EV_WRITE);
    380 }
    381 
    382 static void
    383 evhttp_send_continue_done(struct evhttp_connection *evcon, void *arg)
    384 {
    385 	bufferevent_disable(evcon->bufev, EV_WRITE);
    386 }
    387 
    388 static void
    389 evhttp_send_continue(struct evhttp_connection *evcon,
    390 			struct evhttp_request *req)
    391 {
    392 	bufferevent_enable(evcon->bufev, EV_WRITE);
    393 	evbuffer_add_printf(bufferevent_get_output(evcon->bufev),
    394 			"HTTP/%d.%d 100 Continue\r\n\r\n",
    395 			req->major, req->minor);
    396 	evcon->cb = evhttp_send_continue_done;
    397 	evcon->cb_arg = NULL;
    398 	bufferevent_setcb(evcon->bufev,
    399 	    evhttp_read_cb,
    400 	    evhttp_write_cb,
    401 	    evhttp_error_cb,
    402 	    evcon);
    403 }
    404 
    405 /** Helper: returns true iff evconn is in any connected state. */
    406 static int
    407 evhttp_connected(struct evhttp_connection *evcon)
    408 {
    409 	switch (evcon->state) {
    410 	case EVCON_DISCONNECTED:
    411 	case EVCON_CONNECTING:
    412 		return (0);
    413 	case EVCON_IDLE:
    414 	case EVCON_READING_FIRSTLINE:
    415 	case EVCON_READING_HEADERS:
    416 	case EVCON_READING_BODY:
    417 	case EVCON_READING_TRAILER:
    418 	case EVCON_WRITING:
    419 	default:
    420 		return (1);
    421 	}
    422 }
    423 
    424 /* Create the headers needed for an outgoing HTTP request, adds them to
    425  * the request's header list, and writes the request line to the
    426  * connection's output buffer.
    427  */
    428 static void
    429 evhttp_make_header_request(struct evhttp_connection *evcon,
    430     struct evhttp_request *req)
    431 {
    432 	const char *method;
    433 
    434 	evhttp_remove_header(req->output_headers, "Proxy-Connection");
    435 
    436 	/* Generate request line */
    437 	if (!(method = evhttp_method(req->type))) {
    438 		method = "NULL";
    439 	}
    440 
    441 	evbuffer_add_printf(bufferevent_get_output(evcon->bufev),
    442 	    "%s %s HTTP/%d.%d\r\n",
    443 	    method, req->uri, req->major, req->minor);
    444 
    445 	/* Add the content length on a post or put request if missing */
    446 	if ((req->type == EVHTTP_REQ_POST || req->type == EVHTTP_REQ_PUT) &&
    447 	    evhttp_find_header(req->output_headers, "Content-Length") == NULL){
    448 		char size[22];
    449 		evutil_snprintf(size, sizeof(size), EV_SIZE_FMT,
    450 		    EV_SIZE_ARG(evbuffer_get_length(req->output_buffer)));
    451 		evhttp_add_header(req->output_headers, "Content-Length", size);
    452 	}
    453 }
    454 
    455 /** Return true if the list of headers in 'headers', intepreted with respect
    456  * to flags, means that we should send a "connection: close" when the request
    457  * is done. */
    458 static int
    459 evhttp_is_connection_close(int flags, struct evkeyvalq* headers)
    460 {
    461 	if (flags & EVHTTP_PROXY_REQUEST) {
    462 		/* proxy connection */
    463 		const char *connection = evhttp_find_header(headers, "Proxy-Connection");
    464 		return (connection == NULL || evutil_ascii_strcasecmp(connection, "keep-alive") != 0);
    465 	} else {
    466 		const char *connection = evhttp_find_header(headers, "Connection");
    467 		return (connection != NULL && evutil_ascii_strcasecmp(connection, "close") == 0);
    468 	}
    469 }
    470 static int
    471 evhttp_is_request_connection_close(struct evhttp_request *req)
    472 {
    473 	return
    474 		evhttp_is_connection_close(req->flags, req->input_headers) ||
    475 		evhttp_is_connection_close(req->flags, req->output_headers);
    476 }
    477 
    478 /* Return true iff 'headers' contains 'Connection: keep-alive' */
    479 static int
    480 evhttp_is_connection_keepalive(struct evkeyvalq* headers)
    481 {
    482 	const char *connection = evhttp_find_header(headers, "Connection");
    483 	return (connection != NULL
    484 	    && evutil_ascii_strncasecmp(connection, "keep-alive", 10) == 0);
    485 }
    486 
    487 /* Add a correct "Date" header to headers, unless it already has one. */
    488 static void
    489 evhttp_maybe_add_date_header(struct evkeyvalq *headers)
    490 {
    491 	if (evhttp_find_header(headers, "Date") == NULL) {
    492 		char date[50];
    493 		if (sizeof(date) - evutil_date_rfc1123(date, sizeof(date), NULL) > 0) {
    494 			evhttp_add_header(headers, "Date", date);
    495 		}
    496 	}
    497 }
    498 
    499 /* Add a "Content-Length" header with value 'content_length' to headers,
    500  * unless it already has a content-length or transfer-encoding header. */
    501 static void
    502 evhttp_maybe_add_content_length_header(struct evkeyvalq *headers,
    503     size_t content_length)
    504 {
    505 	if (evhttp_find_header(headers, "Transfer-Encoding") == NULL &&
    506 	    evhttp_find_header(headers,	"Content-Length") == NULL) {
    507 		char len[22];
    508 		evutil_snprintf(len, sizeof(len), EV_SIZE_FMT,
    509 		    EV_SIZE_ARG(content_length));
    510 		evhttp_add_header(headers, "Content-Length", len);
    511 	}
    512 }
    513 
    514 /*
    515  * Create the headers needed for an HTTP reply in req->output_headers,
    516  * and write the first HTTP response for req line to evcon.
    517  */
    518 static void
    519 evhttp_make_header_response(struct evhttp_connection *evcon,
    520     struct evhttp_request *req)
    521 {
    522 	int is_keepalive = evhttp_is_connection_keepalive(req->input_headers);
    523 	evbuffer_add_printf(bufferevent_get_output(evcon->bufev),
    524 	    "HTTP/%d.%d %d %s\r\n",
    525 	    req->major, req->minor, req->response_code,
    526 	    req->response_code_line);
    527 
    528 	if (req->major == 1) {
    529 		if (req->minor >= 1)
    530 			evhttp_maybe_add_date_header(req->output_headers);
    531 
    532 		/*
    533 		 * if the protocol is 1.0; and the connection was keep-alive
    534 		 * we need to add a keep-alive header, too.
    535 		 */
    536 		if (req->minor == 0 && is_keepalive)
    537 			evhttp_add_header(req->output_headers,
    538 			    "Connection", "keep-alive");
    539 
    540 		if ((req->minor >= 1 || is_keepalive) &&
    541 		    evhttp_response_needs_body(req)) {
    542 			/*
    543 			 * we need to add the content length if the
    544 			 * user did not give it, this is required for
    545 			 * persistent connections to work.
    546 			 */
    547 			evhttp_maybe_add_content_length_header(
    548 				req->output_headers,
    549 				evbuffer_get_length(req->output_buffer));
    550 		}
    551 	}
    552 
    553 	/* Potentially add headers for unidentified content. */
    554 	if (evhttp_response_needs_body(req)) {
    555 		if (evhttp_find_header(req->output_headers,
    556 			"Content-Type") == NULL
    557 		    && evcon->http_server->default_content_type) {
    558 			evhttp_add_header(req->output_headers,
    559 			    "Content-Type",
    560 			    evcon->http_server->default_content_type);
    561 		}
    562 	}
    563 
    564 	/* if the request asked for a close, we send a close, too */
    565 	if (evhttp_is_connection_close(req->flags, req->input_headers)) {
    566 		evhttp_remove_header(req->output_headers, "Connection");
    567 		if (!(req->flags & EVHTTP_PROXY_REQUEST))
    568 		    evhttp_add_header(req->output_headers, "Connection", "close");
    569 		evhttp_remove_header(req->output_headers, "Proxy-Connection");
    570 	}
    571 }
    572 
    573 enum expect { NO, CONTINUE, OTHER };
    574 static enum expect evhttp_have_expect(struct evhttp_request *req, int input)
    575 {
    576 	const char *expect;
    577 	struct evkeyvalq *h = input ? req->input_headers : req->output_headers;
    578 
    579 	if (!(req->kind == EVHTTP_REQUEST) || !REQ_VERSION_ATLEAST(req, 1, 1))
    580 		return NO;
    581 
    582 	expect = evhttp_find_header(h, "Expect");
    583 	if (!expect)
    584 		return NO;
    585 
    586 	return !evutil_ascii_strcasecmp(expect, "100-continue") ? CONTINUE : OTHER;
    587 }
    588 
    589 
    590 /** Generate all headers appropriate for sending the http request in req (or
    591  * the response, if we're sending a response), and write them to evcon's
    592  * bufferevent. Also writes all data from req->output_buffer */
    593 static void
    594 evhttp_make_header(struct evhttp_connection *evcon, struct evhttp_request *req)
    595 {
    596 	struct evkeyval *header;
    597 	struct evbuffer *output = bufferevent_get_output(evcon->bufev);
    598 
    599 	/*
    600 	 * Depending if this is a HTTP request or response, we might need to
    601 	 * add some new headers or remove existing headers.
    602 	 */
    603 	if (req->kind == EVHTTP_REQUEST) {
    604 		evhttp_make_header_request(evcon, req);
    605 	} else {
    606 		evhttp_make_header_response(evcon, req);
    607 	}
    608 
    609 	TAILQ_FOREACH(header, req->output_headers, next) {
    610 		evbuffer_add_printf(output, "%s: %s\r\n",
    611 		    header->key, header->value);
    612 	}
    613 	evbuffer_add(output, "\r\n", 2);
    614 
    615 	if (evhttp_have_expect(req, 0) != CONTINUE &&
    616 		evbuffer_get_length(req->output_buffer)) {
    617 		/*
    618 		 * For a request, we add the POST data, for a reply, this
    619 		 * is the regular data.
    620 		 */
    621 		evbuffer_add_buffer(output, req->output_buffer);
    622 	}
    623 }
    624 
    625 void
    626 evhttp_connection_set_max_headers_size(struct evhttp_connection *evcon,
    627     ev_ssize_t new_max_headers_size)
    628 {
    629 	if (new_max_headers_size<0)
    630 		evcon->max_headers_size = EV_SIZE_MAX;
    631 	else
    632 		evcon->max_headers_size = new_max_headers_size;
    633 }
    634 void
    635 evhttp_connection_set_max_body_size(struct evhttp_connection* evcon,
    636     ev_ssize_t new_max_body_size)
    637 {
    638 	if (new_max_body_size<0)
    639 		evcon->max_body_size = EV_UINT64_MAX;
    640 	else
    641 		evcon->max_body_size = new_max_body_size;
    642 }
    643 
    644 static int
    645 evhttp_connection_incoming_fail(struct evhttp_request *req,
    646     enum evhttp_request_error error)
    647 {
    648 	switch (error) {
    649 		case EVREQ_HTTP_DATA_TOO_LONG:
    650 			req->response_code = HTTP_ENTITYTOOLARGE;
    651 			break;
    652 		default:
    653 			req->response_code = HTTP_BADREQUEST;
    654 	}
    655 
    656 	switch (error) {
    657 	case EVREQ_HTTP_TIMEOUT:
    658 	case EVREQ_HTTP_EOF:
    659 		/*
    660 		 * these are cases in which we probably should just
    661 		 * close the connection and not send a reply.  this
    662 		 * case may happen when a browser keeps a persistent
    663 		 * connection open and we timeout on the read.  when
    664 		 * the request is still being used for sending, we
    665 		 * need to disassociated it from the connection here.
    666 		 */
    667 		if (!req->userdone) {
    668 			/* remove it so that it will not be freed */
    669 			TAILQ_REMOVE(&req->evcon->requests, req, next);
    670 			/* indicate that this request no longer has a
    671 			 * connection object
    672 			 */
    673 			req->evcon = NULL;
    674 		}
    675 		return (-1);
    676 	case EVREQ_HTTP_INVALID_HEADER:
    677 	case EVREQ_HTTP_BUFFER_ERROR:
    678 	case EVREQ_HTTP_REQUEST_CANCEL:
    679 	case EVREQ_HTTP_DATA_TOO_LONG:
    680 	default:	/* xxx: probably should just error on default */
    681 		/* the callback looks at the uri to determine errors */
    682 		if (req->uri) {
    683 			mm_free(req->uri);
    684 			req->uri = NULL;
    685 		}
    686 		if (req->uri_elems) {
    687 			evhttp_uri_free(req->uri_elems);
    688 			req->uri_elems = NULL;
    689 		}
    690 
    691 		/*
    692 		 * the callback needs to send a reply, once the reply has
    693 		 * been send, the connection should get freed.
    694 		 */
    695 		(*req->cb)(req, req->cb_arg);
    696 	}
    697 
    698 	return (0);
    699 }
    700 
    701 /* Free connection ownership of which can be acquired by user using
    702  * evhttp_request_own(). */
    703 static inline void
    704 evhttp_request_free_auto(struct evhttp_request *req)
    705 {
    706 	if (!(req->flags & EVHTTP_USER_OWNED))
    707 		evhttp_request_free(req);
    708 }
    709 
    710 static void
    711 evhttp_request_free_(struct evhttp_connection *evcon, struct evhttp_request *req)
    712 {
    713 	TAILQ_REMOVE(&evcon->requests, req, next);
    714 	evhttp_request_free_auto(req);
    715 }
    716 
    717 /* Called when evcon has experienced a (non-recoverable? -NM) error, as
    718  * given in error. If it's an outgoing connection, reset the connection,
    719  * retry any pending requests, and inform the user.  If it's incoming,
    720  * delegates to evhttp_connection_incoming_fail(). */
    721 void
    722 evhttp_connection_fail_(struct evhttp_connection *evcon,
    723     enum evhttp_request_error error)
    724 {
    725 	const int errsave = EVUTIL_SOCKET_ERROR();
    726 	struct evhttp_request* req = TAILQ_FIRST(&evcon->requests);
    727 	void (*cb)(struct evhttp_request *, void *);
    728 	void *cb_arg;
    729 	void (*error_cb)(enum evhttp_request_error, void *);
    730 	void *error_cb_arg;
    731 	EVUTIL_ASSERT(req != NULL);
    732 
    733 	bufferevent_disable(evcon->bufev, EV_READ|EV_WRITE);
    734 
    735 	if (evcon->flags & EVHTTP_CON_INCOMING) {
    736 		/*
    737 		 * for incoming requests, there are two different
    738 		 * failure cases.  it's either a network level error
    739 		 * or an http layer error. for problems on the network
    740 		 * layer like timeouts we just drop the connections.
    741 		 * For HTTP problems, we might have to send back a
    742 		 * reply before the connection can be freed.
    743 		 */
    744 		if (evhttp_connection_incoming_fail(req, error) == -1)
    745 			evhttp_connection_free(evcon);
    746 		return;
    747 	}
    748 
    749 	error_cb = req->error_cb;
    750 	error_cb_arg = req->cb_arg;
    751 	/* when the request was canceled, the callback is not executed */
    752 	if (error != EVREQ_HTTP_REQUEST_CANCEL) {
    753 		/* save the callback for later; the cb might free our object */
    754 		cb = req->cb;
    755 		cb_arg = req->cb_arg;
    756 	} else {
    757 		cb = NULL;
    758 		cb_arg = NULL;
    759 	}
    760 
    761 	/* do not fail all requests; the next request is going to get
    762 	 * send over a new connection.   when a user cancels a request,
    763 	 * all other pending requests should be processed as normal
    764 	 */
    765 	evhttp_request_free_(evcon, req);
    766 
    767 	/* reset the connection */
    768 	evhttp_connection_reset_(evcon);
    769 
    770 	/* We are trying the next request that was queued on us */
    771 	if (TAILQ_FIRST(&evcon->requests) != NULL)
    772 		evhttp_connection_connect_(evcon);
    773 
    774 	/* The call to evhttp_connection_reset_ overwrote errno.
    775 	 * Let's restore the original errno, so that the user's
    776 	 * callback can have a better idea of what the error was.
    777 	 */
    778 	EVUTIL_SET_SOCKET_ERROR(errsave);
    779 
    780 	/* inform the user */
    781 	if (error_cb != NULL)
    782 		error_cb(error, error_cb_arg);
    783 	if (cb != NULL)
    784 		(*cb)(NULL, cb_arg);
    785 }
    786 
    787 /* Bufferevent callback: invoked when any data has been written from an
    788  * http connection's bufferevent */
    789 static void
    790 evhttp_write_cb(struct bufferevent *bufev, void *arg)
    791 {
    792 	struct evhttp_connection *evcon = arg;
    793 
    794 	/* Activate our call back */
    795 	if (evcon->cb != NULL)
    796 		(*evcon->cb)(evcon, evcon->cb_arg);
    797 }
    798 
    799 /**
    800  * Advance the connection state.
    801  * - If this is an outgoing connection, we've just processed the response;
    802  *   idle or close the connection.
    803  * - If this is an incoming connection, we've just processed the request;
    804  *   respond.
    805  */
    806 static void
    807 evhttp_connection_done(struct evhttp_connection *evcon)
    808 {
    809 	struct evhttp_request *req = TAILQ_FIRST(&evcon->requests);
    810 	int con_outgoing = evcon->flags & EVHTTP_CON_OUTGOING;
    811 	int free_evcon = 0;
    812 
    813 	if (con_outgoing) {
    814 		/* idle or close the connection */
    815 		int need_close = evhttp_is_request_connection_close(req);
    816 		TAILQ_REMOVE(&evcon->requests, req, next);
    817 		req->evcon = NULL;
    818 
    819 		evcon->state = EVCON_IDLE;
    820 
    821 		/* check if we got asked to close the connection */
    822 		if (need_close)
    823 			evhttp_connection_reset_(evcon);
    824 
    825 		if (TAILQ_FIRST(&evcon->requests) != NULL) {
    826 			/*
    827 			 * We have more requests; reset the connection
    828 			 * and deal with the next request.
    829 			 */
    830 			if (!evhttp_connected(evcon))
    831 				evhttp_connection_connect_(evcon);
    832 			else
    833 				evhttp_request_dispatch(evcon);
    834 		} else if (!need_close) {
    835 			/*
    836 			 * The connection is going to be persistent, but we
    837 			 * need to detect if the other side closes it.
    838 			 */
    839 			evhttp_connection_start_detectclose(evcon);
    840 		} else if ((evcon->flags & EVHTTP_CON_AUTOFREE)) {
    841 			/*
    842 			 * If we have no more requests that need completion
    843 			 * and we're not waiting for the connection to close
    844 			 */
    845 			 free_evcon = 1;
    846 		}
    847 	} else {
    848 		/*
    849 		 * incoming connection - we need to leave the request on the
    850 		 * connection so that we can reply to it.
    851 		 */
    852 		evcon->state = EVCON_WRITING;
    853 	}
    854 
    855 	/* notify the user of the request */
    856 	(*req->cb)(req, req->cb_arg);
    857 
    858 	/* if this was an outgoing request, we own and it's done. so free it. */
    859 	if (con_outgoing) {
    860 		evhttp_request_free_auto(req);
    861 	}
    862 
    863 	/* If this was the last request of an outgoing connection and we're
    864 	 * not waiting to receive a connection close event and we want to
    865 	 * automatically free the connection. We check to ensure our request
    866 	 * list is empty one last time just in case our callback added a
    867 	 * new request.
    868 	 */
    869 	if (free_evcon && TAILQ_FIRST(&evcon->requests) == NULL) {
    870 		evhttp_connection_free(evcon);
    871 	}
    872 }
    873 
    874 /*
    875  * Handles reading from a chunked request.
    876  *   return ALL_DATA_READ:
    877  *     all data has been read
    878  *   return MORE_DATA_EXPECTED:
    879  *     more data is expected
    880  *   return DATA_CORRUPTED:
    881  *     data is corrupted
    882  *   return REQUEST_CANCELED:
    883  *     request was canceled by the user calling evhttp_cancel_request
    884  *   return DATA_TOO_LONG:
    885  *     ran over the maximum limit
    886  */
    887 
    888 static enum message_read_status
    889 evhttp_handle_chunked_read(struct evhttp_request *req, struct evbuffer *buf)
    890 {
    891 	if (req == NULL || buf == NULL) {
    892 	    return DATA_CORRUPTED;
    893 	}
    894 
    895 	while (1) {
    896 		size_t buflen;
    897 
    898 		if ((buflen = evbuffer_get_length(buf)) == 0) {
    899 			break;
    900 		}
    901 
    902 		/* evbuffer_get_length returns size_t, but len variable is ssize_t,
    903 		 * check for overflow conditions */
    904 		if (buflen > EV_SSIZE_MAX) {
    905 			return DATA_CORRUPTED;
    906 		}
    907 
    908 		if (req->ntoread < 0) {
    909 			/* Read chunk size */
    910 			ev_int64_t ntoread;
    911 			char *p = evbuffer_readln(buf, NULL, EVBUFFER_EOL_CRLF);
    912 			char *endp;
    913 			int error;
    914 			if (p == NULL)
    915 				break;
    916 			/* the last chunk is on a new line? */
    917 			if (strlen(p) == 0) {
    918 				mm_free(p);
    919 				continue;
    920 			}
    921 			ntoread = evutil_strtoll(p, &endp, 16);
    922 			error = (*p == '\0' ||
    923 			    (*endp != '\0' && *endp != ' ') ||
    924 			    ntoread < 0);
    925 			mm_free(p);
    926 			if (error) {
    927 				/* could not get chunk size */
    928 				return (DATA_CORRUPTED);
    929 			}
    930 
    931 			/* ntoread is signed int64, body_size is unsigned size_t, check for under/overflow conditions */
    932 			if ((ev_uint64_t)ntoread > EV_SIZE_MAX - req->body_size) {
    933 			    return DATA_CORRUPTED;
    934 			}
    935 
    936 			if (req->body_size + (size_t)ntoread > req->evcon->max_body_size) {
    937 				/* failed body length test */
    938 				event_debug(("Request body is too long"));
    939 				return (DATA_TOO_LONG);
    940 			}
    941 
    942 			req->body_size += (size_t)ntoread;
    943 			req->ntoread = ntoread;
    944 			if (req->ntoread == 0) {
    945 				/* Last chunk */
    946 				return (ALL_DATA_READ);
    947 			}
    948 			continue;
    949 		}
    950 
    951 		/* req->ntoread is signed int64, len is ssize_t, based on arch,
    952 		 * ssize_t could only be 32b, check for these conditions */
    953 		if (req->ntoread > EV_SSIZE_MAX) {
    954 			return DATA_CORRUPTED;
    955 		}
    956 
    957 		/* don't have enough to complete a chunk; wait for more */
    958 		if (req->ntoread > 0 && buflen < (ev_uint64_t)req->ntoread)
    959 			return (MORE_DATA_EXPECTED);
    960 
    961 		/* Completed chunk */
    962 		evbuffer_remove_buffer(buf, req->input_buffer, (size_t)req->ntoread);
    963 		req->ntoread = -1;
    964 		if (req->chunk_cb != NULL) {
    965 			req->flags |= EVHTTP_REQ_DEFER_FREE;
    966 			(*req->chunk_cb)(req, req->cb_arg);
    967 			evbuffer_drain(req->input_buffer,
    968 			    evbuffer_get_length(req->input_buffer));
    969 			req->flags &= ~EVHTTP_REQ_DEFER_FREE;
    970 			if ((req->flags & EVHTTP_REQ_NEEDS_FREE) != 0) {
    971 				return (REQUEST_CANCELED);
    972 			}
    973 		}
    974 	}
    975 
    976 	return (MORE_DATA_EXPECTED);
    977 }
    978 
    979 static void
    980 evhttp_read_trailer(struct evhttp_connection *evcon, struct evhttp_request *req)
    981 {
    982 	struct evbuffer *buf = bufferevent_get_input(evcon->bufev);
    983 
    984 	switch (evhttp_parse_headers_(req, buf)) {
    985 	case DATA_CORRUPTED:
    986 	case DATA_TOO_LONG:
    987 		evhttp_connection_fail_(evcon, EVREQ_HTTP_DATA_TOO_LONG);
    988 		break;
    989 	case ALL_DATA_READ:
    990 		bufferevent_disable(evcon->bufev, EV_READ);
    991 		evhttp_connection_done(evcon);
    992 		break;
    993 	case MORE_DATA_EXPECTED:
    994 	case REQUEST_CANCELED: /* ??? */
    995 	default:
    996 		break;
    997 	}
    998 }
    999 
   1000 static void
   1001 evhttp_lingering_close(struct evhttp_connection *evcon,
   1002 	struct evhttp_request *req)
   1003 {
   1004 	struct evbuffer *buf = bufferevent_get_input(evcon->bufev);
   1005 
   1006 	size_t n = evbuffer_get_length(buf);
   1007 	if (n > (size_t) req->ntoread)
   1008 		n = (size_t) req->ntoread;
   1009 	req->ntoread -= n;
   1010 	req->body_size += n;
   1011 
   1012 	event_debug(("Request body is too long, left " EV_I64_FMT,
   1013 		EV_I64_ARG(req->ntoread)));
   1014 
   1015 	evbuffer_drain(buf, n);
   1016 	if (!req->ntoread)
   1017 		evhttp_connection_fail_(evcon, EVREQ_HTTP_DATA_TOO_LONG);
   1018 }
   1019 static void
   1020 evhttp_lingering_fail(struct evhttp_connection *evcon,
   1021 	struct evhttp_request *req)
   1022 {
   1023 	if (evcon->flags & EVHTTP_CON_LINGERING_CLOSE)
   1024 		evhttp_lingering_close(evcon, req);
   1025 	else
   1026 		evhttp_connection_fail_(evcon, EVREQ_HTTP_DATA_TOO_LONG);
   1027 }
   1028 
   1029 static void
   1030 evhttp_read_body(struct evhttp_connection *evcon, struct evhttp_request *req)
   1031 {
   1032 	struct evbuffer *buf = bufferevent_get_input(evcon->bufev);
   1033 
   1034 	if (req->chunked) {
   1035 		switch (evhttp_handle_chunked_read(req, buf)) {
   1036 		case ALL_DATA_READ:
   1037 			/* finished last chunk */
   1038 			evcon->state = EVCON_READING_TRAILER;
   1039 			evhttp_read_trailer(evcon, req);
   1040 			return;
   1041 		case DATA_CORRUPTED:
   1042 		case DATA_TOO_LONG:
   1043 			/* corrupted data */
   1044 			evhttp_connection_fail_(evcon,
   1045 			    EVREQ_HTTP_DATA_TOO_LONG);
   1046 			return;
   1047 		case REQUEST_CANCELED:
   1048 			/* request canceled */
   1049 			evhttp_request_free_auto(req);
   1050 			return;
   1051 		case MORE_DATA_EXPECTED:
   1052 		default:
   1053 			break;
   1054 		}
   1055 	} else if (req->ntoread < 0) {
   1056 		/* Read until connection close. */
   1057 		if ((size_t)(req->body_size + evbuffer_get_length(buf)) < req->body_size) {
   1058 			evhttp_connection_fail_(evcon, EVREQ_HTTP_INVALID_HEADER);
   1059 			return;
   1060 		}
   1061 
   1062 		req->body_size += evbuffer_get_length(buf);
   1063 		evbuffer_add_buffer(req->input_buffer, buf);
   1064 	} else if (req->chunk_cb != NULL || evbuffer_get_length(buf) >= (size_t)req->ntoread) {
   1065 		/* XXX: the above get_length comparison has to be fixed for overflow conditions! */
   1066 		/* We've postponed moving the data until now, but we're
   1067 		 * about to use it. */
   1068 		size_t n = evbuffer_get_length(buf);
   1069 
   1070 		if (n > (size_t) req->ntoread)
   1071 			n = (size_t) req->ntoread;
   1072 		req->ntoread -= n;
   1073 		req->body_size += n;
   1074 		evbuffer_remove_buffer(buf, req->input_buffer, n);
   1075 	}
   1076 
   1077 	if (req->body_size > req->evcon->max_body_size ||
   1078 	    (!req->chunked && req->ntoread >= 0 &&
   1079 		(size_t)req->ntoread > req->evcon->max_body_size)) {
   1080 		/* XXX: The above casted comparison must checked for overflow */
   1081 		/* failed body length test */
   1082 
   1083 		evhttp_lingering_fail(evcon, req);
   1084 		return;
   1085 	}
   1086 
   1087 	if (evbuffer_get_length(req->input_buffer) > 0 && req->chunk_cb != NULL) {
   1088 		req->flags |= EVHTTP_REQ_DEFER_FREE;
   1089 		(*req->chunk_cb)(req, req->cb_arg);
   1090 		req->flags &= ~EVHTTP_REQ_DEFER_FREE;
   1091 		evbuffer_drain(req->input_buffer,
   1092 		    evbuffer_get_length(req->input_buffer));
   1093 		if ((req->flags & EVHTTP_REQ_NEEDS_FREE) != 0) {
   1094 			evhttp_request_free_auto(req);
   1095 			return;
   1096 		}
   1097 	}
   1098 
   1099 	if (!req->ntoread) {
   1100 		bufferevent_disable(evcon->bufev, EV_READ);
   1101 		/* Completed content length */
   1102 		evhttp_connection_done(evcon);
   1103 		return;
   1104 	}
   1105 }
   1106 
   1107 #define get_deferred_queue(evcon)		\
   1108 	((evcon)->base)
   1109 
   1110 /*
   1111  * Gets called when more data becomes available
   1112  */
   1113 
   1114 static void
   1115 evhttp_read_cb(struct bufferevent *bufev, void *arg)
   1116 {
   1117 	struct evhttp_connection *evcon = arg;
   1118 	struct evhttp_request *req = TAILQ_FIRST(&evcon->requests);
   1119 
   1120 	/* Cancel if it's pending. */
   1121 	event_deferred_cb_cancel_(get_deferred_queue(evcon),
   1122 	    &evcon->read_more_deferred_cb);
   1123 
   1124 	switch (evcon->state) {
   1125 	case EVCON_READING_FIRSTLINE:
   1126 		evhttp_read_firstline(evcon, req);
   1127 		/* note the request may have been freed in
   1128 		 * evhttp_read_body */
   1129 		break;
   1130 	case EVCON_READING_HEADERS:
   1131 		evhttp_read_header(evcon, req);
   1132 		/* note the request may have been freed in
   1133 		 * evhttp_read_body */
   1134 		break;
   1135 	case EVCON_READING_BODY:
   1136 		evhttp_read_body(evcon, req);
   1137 		/* note the request may have been freed in
   1138 		 * evhttp_read_body */
   1139 		break;
   1140 	case EVCON_READING_TRAILER:
   1141 		evhttp_read_trailer(evcon, req);
   1142 		break;
   1143 	case EVCON_IDLE:
   1144 		{
   1145 #ifdef USE_DEBUG
   1146 			struct evbuffer *input;
   1147 			size_t total_len;
   1148 
   1149 			input = bufferevent_get_input(evcon->bufev);
   1150 			total_len = evbuffer_get_length(input);
   1151 			event_debug(("%s: read "EV_SIZE_FMT
   1152 				" bytes in EVCON_IDLE state,"
   1153 				" resetting connection",
   1154 				__func__, EV_SIZE_ARG(total_len)));
   1155 #endif
   1156 
   1157 			evhttp_connection_reset_(evcon);
   1158 		}
   1159 		break;
   1160 	case EVCON_DISCONNECTED:
   1161 	case EVCON_CONNECTING:
   1162 	case EVCON_WRITING:
   1163 	default:
   1164 		event_errx(1, "%s: illegal connection state %d",
   1165 			   __func__, evcon->state);
   1166 	}
   1167 }
   1168 
   1169 static void
   1170 evhttp_deferred_read_cb(struct event_callback *cb, void *data)
   1171 {
   1172 	struct evhttp_connection *evcon = data;
   1173 	evhttp_read_cb(evcon->bufev, evcon);
   1174 }
   1175 
   1176 static void
   1177 evhttp_write_connectioncb(struct evhttp_connection *evcon, void *arg)
   1178 {
   1179 	/* This is after writing the request to the server */
   1180 	struct evhttp_request *req = TAILQ_FIRST(&evcon->requests);
   1181 	struct evbuffer *output = bufferevent_get_output(evcon->bufev);
   1182 	EVUTIL_ASSERT(req != NULL);
   1183 
   1184 	EVUTIL_ASSERT(evcon->state == EVCON_WRITING);
   1185 
   1186 	/* We need to wait until we've written all of our output data before we can
   1187 	 * continue */
   1188 	if (evbuffer_get_length(output) > 0)
   1189 		return;
   1190 
   1191 	/* We are done writing our header and are now expecting the response */
   1192 	req->kind = EVHTTP_RESPONSE;
   1193 
   1194 	evhttp_start_read_(evcon);
   1195 }
   1196 
   1197 /*
   1198  * Clean up a connection object
   1199  */
   1200 
   1201 void
   1202 evhttp_connection_free(struct evhttp_connection *evcon)
   1203 {
   1204 	struct evhttp_request *req;
   1205 
   1206 	/* notify interested parties that this connection is going down */
   1207 	if (evcon->fd != -1) {
   1208 		if (evhttp_connected(evcon) && evcon->closecb != NULL)
   1209 			(*evcon->closecb)(evcon, evcon->closecb_arg);
   1210 	}
   1211 
   1212 	/* remove all requests that might be queued on this
   1213 	 * connection.  for server connections, this should be empty.
   1214 	 * because it gets dequeued either in evhttp_connection_done or
   1215 	 * evhttp_connection_fail_.
   1216 	 */
   1217 	while ((req = TAILQ_FIRST(&evcon->requests)) != NULL) {
   1218 		evhttp_request_free_(evcon, req);
   1219 	}
   1220 
   1221 	if (evcon->http_server != NULL) {
   1222 		struct evhttp *http = evcon->http_server;
   1223 		TAILQ_REMOVE(&http->connections, evcon, next);
   1224 	}
   1225 
   1226 	if (event_initialized(&evcon->retry_ev)) {
   1227 		event_del(&evcon->retry_ev);
   1228 		event_debug_unassign(&evcon->retry_ev);
   1229 	}
   1230 
   1231 	if (evcon->bufev != NULL)
   1232 		bufferevent_free(evcon->bufev);
   1233 
   1234 	event_deferred_cb_cancel_(get_deferred_queue(evcon),
   1235 	    &evcon->read_more_deferred_cb);
   1236 
   1237 	if (evcon->fd == -1)
   1238 		evcon->fd = bufferevent_getfd(evcon->bufev);
   1239 
   1240 	if (evcon->fd != -1) {
   1241 		bufferevent_disable(evcon->bufev, EV_READ|EV_WRITE);
   1242 		shutdown(evcon->fd, EVUTIL_SHUT_WR);
   1243 		if (!(bufferevent_get_options_(evcon->bufev) & BEV_OPT_CLOSE_ON_FREE)) {
   1244 			evutil_closesocket(evcon->fd);
   1245 		}
   1246 	}
   1247 
   1248 	if (evcon->bind_address != NULL)
   1249 		mm_free(evcon->bind_address);
   1250 
   1251 	if (evcon->address != NULL)
   1252 		mm_free(evcon->address);
   1253 
   1254 	mm_free(evcon);
   1255 }
   1256 
   1257 void
   1258 evhttp_connection_free_on_completion(struct evhttp_connection *evcon) {
   1259 	evcon->flags |= EVHTTP_CON_AUTOFREE;
   1260 }
   1261 
   1262 void
   1263 evhttp_connection_set_local_address(struct evhttp_connection *evcon,
   1264     const char *address)
   1265 {
   1266 	EVUTIL_ASSERT(evcon->state == EVCON_DISCONNECTED);
   1267 	if (evcon->bind_address)
   1268 		mm_free(evcon->bind_address);
   1269 	if ((evcon->bind_address = mm_strdup(address)) == NULL)
   1270 		event_warn("%s: strdup", __func__);
   1271 }
   1272 
   1273 void
   1274 evhttp_connection_set_local_port(struct evhttp_connection *evcon,
   1275     ev_uint16_t port)
   1276 {
   1277 	EVUTIL_ASSERT(evcon->state == EVCON_DISCONNECTED);
   1278 	evcon->bind_port = port;
   1279 }
   1280 
   1281 static void
   1282 evhttp_request_dispatch(struct evhttp_connection* evcon)
   1283 {
   1284 	struct evhttp_request *req = TAILQ_FIRST(&evcon->requests);
   1285 
   1286 	/* this should not usually happy but it's possible */
   1287 	if (req == NULL)
   1288 		return;
   1289 
   1290 	/* delete possible close detection events */
   1291 	evhttp_connection_stop_detectclose(evcon);
   1292 
   1293 	/* we assume that the connection is connected already */
   1294 	EVUTIL_ASSERT(evcon->state == EVCON_IDLE);
   1295 
   1296 	evcon->state = EVCON_WRITING;
   1297 
   1298 	/* Create the header from the store arguments */
   1299 	evhttp_make_header(evcon, req);
   1300 
   1301 	evhttp_write_buffer(evcon, evhttp_write_connectioncb, NULL);
   1302 }
   1303 
   1304 /* Reset our connection state: disables reading/writing, closes our fd (if
   1305 * any), clears out buffers, and puts us in state DISCONNECTED. */
   1306 void
   1307 evhttp_connection_reset_(struct evhttp_connection *evcon)
   1308 {
   1309 	struct evbuffer *tmp;
   1310 	int err;
   1311 
   1312 	/* XXXX This is not actually an optimal fix.  Instead we ought to have
   1313 	   an API for "stop connecting", or use bufferevent_setfd to turn off
   1314 	   connecting.  But for Libevent 2.0, this seems like a minimal change
   1315 	   least likely to disrupt the rest of the bufferevent and http code.
   1316 
   1317 	   Why is this here?  If the fd is set in the bufferevent, and the
   1318 	   bufferevent is connecting, then you can't actually stop the
   1319 	   bufferevent from trying to connect with bufferevent_disable().  The
   1320 	   connect will never trigger, since we close the fd, but the timeout
   1321 	   might.  That caused an assertion failure in evhttp_connection_fail_.
   1322 	*/
   1323 	bufferevent_disable_hard_(evcon->bufev, EV_READ|EV_WRITE);
   1324 
   1325 	if (evcon->fd == -1)
   1326 		evcon->fd = bufferevent_getfd(evcon->bufev);
   1327 
   1328 	if (evcon->fd != -1) {
   1329 		/* inform interested parties about connection close */
   1330 		if (evhttp_connected(evcon) && evcon->closecb != NULL)
   1331 			(*evcon->closecb)(evcon, evcon->closecb_arg);
   1332 
   1333 		shutdown(evcon->fd, EVUTIL_SHUT_WR);
   1334 		evutil_closesocket(evcon->fd);
   1335 		evcon->fd = -1;
   1336 	}
   1337 	bufferevent_setfd(evcon->bufev, -1);
   1338 
   1339 	/* we need to clean up any buffered data */
   1340 	tmp = bufferevent_get_output(evcon->bufev);
   1341 	err = evbuffer_drain(tmp, -1);
   1342 	EVUTIL_ASSERT(!err && "drain output");
   1343 	tmp = bufferevent_get_input(evcon->bufev);
   1344 	err = evbuffer_drain(tmp, -1);
   1345 	EVUTIL_ASSERT(!err && "drain input");
   1346 
   1347 	evcon->flags &= ~EVHTTP_CON_READING_ERROR;
   1348 
   1349 	evcon->state = EVCON_DISCONNECTED;
   1350 }
   1351 
   1352 static void
   1353 evhttp_connection_start_detectclose(struct evhttp_connection *evcon)
   1354 {
   1355 	evcon->flags |= EVHTTP_CON_CLOSEDETECT;
   1356 
   1357 	bufferevent_enable(evcon->bufev, EV_READ);
   1358 }
   1359 
   1360 static void
   1361 evhttp_connection_stop_detectclose(struct evhttp_connection *evcon)
   1362 {
   1363 	evcon->flags &= ~EVHTTP_CON_CLOSEDETECT;
   1364 
   1365 	bufferevent_disable(evcon->bufev, EV_READ);
   1366 }
   1367 
   1368 static void
   1369 evhttp_connection_retry(evutil_socket_t fd, short what, void *arg)
   1370 {
   1371 	struct evhttp_connection *evcon = arg;
   1372 
   1373 	evcon->state = EVCON_DISCONNECTED;
   1374 	evhttp_connection_connect_(evcon);
   1375 }
   1376 
   1377 static void
   1378 evhttp_connection_cb_cleanup(struct evhttp_connection *evcon)
   1379 {
   1380 	struct evcon_requestq requests;
   1381 
   1382 	evhttp_connection_reset_(evcon);
   1383 	if (evcon->retry_max < 0 || evcon->retry_cnt < evcon->retry_max) {
   1384 		struct timeval tv_retry = evcon->initial_retry_timeout;
   1385 		int i;
   1386 		evtimer_assign(&evcon->retry_ev, evcon->base, evhttp_connection_retry, evcon);
   1387 		/* XXXX handle failure from evhttp_add_event */
   1388 		for (i=0; i < evcon->retry_cnt; ++i) {
   1389 			tv_retry.tv_usec *= 2;
   1390 			if (tv_retry.tv_usec > 1000000) {
   1391 				tv_retry.tv_usec -= 1000000;
   1392 				tv_retry.tv_sec += 1;
   1393 			}
   1394 			tv_retry.tv_sec *= 2;
   1395 			if (tv_retry.tv_sec > 3600) {
   1396 				tv_retry.tv_sec = 3600;
   1397 				tv_retry.tv_usec = 0;
   1398 			}
   1399 		}
   1400 		event_add(&evcon->retry_ev, &tv_retry);
   1401 		evcon->retry_cnt++;
   1402 		return;
   1403 	}
   1404 
   1405 	/*
   1406 	 * User callback can do evhttp_make_request() on the same
   1407 	 * evcon so new request will be added to evcon->requests.  To
   1408 	 * avoid freeing it prematurely we iterate over the copy of
   1409 	 * the queue.
   1410 	 */
   1411 	TAILQ_INIT(&requests);
   1412 	while (TAILQ_FIRST(&evcon->requests) != NULL) {
   1413 		struct evhttp_request *request = TAILQ_FIRST(&evcon->requests);
   1414 		TAILQ_REMOVE(&evcon->requests, request, next);
   1415 		TAILQ_INSERT_TAIL(&requests, request, next);
   1416 	}
   1417 
   1418 	/* for now, we just signal all requests by executing their callbacks */
   1419 	while (TAILQ_FIRST(&requests) != NULL) {
   1420 		struct evhttp_request *request = TAILQ_FIRST(&requests);
   1421 		TAILQ_REMOVE(&requests, request, next);
   1422 		request->evcon = NULL;
   1423 
   1424 		/* we might want to set an error here */
   1425 		request->cb(request, request->cb_arg);
   1426 		evhttp_request_free_auto(request);
   1427 	}
   1428 }
   1429 
   1430 static void
   1431 evhttp_connection_read_on_write_error(struct evhttp_connection *evcon,
   1432     struct evhttp_request *req)
   1433 {
   1434 	struct evbuffer *buf;
   1435 
   1436 	/** Second time, we can't read anything */
   1437 	if (evcon->flags & EVHTTP_CON_READING_ERROR) {
   1438 		evcon->flags &= ~EVHTTP_CON_READING_ERROR;
   1439 		evhttp_connection_fail_(evcon, EVREQ_HTTP_EOF);
   1440 		return;
   1441 	}
   1442 
   1443 	req->kind = EVHTTP_RESPONSE;
   1444 
   1445 	buf = bufferevent_get_output(evcon->bufev);
   1446 	evbuffer_unfreeze(buf, 1);
   1447 	evbuffer_drain(buf, evbuffer_get_length(buf));
   1448 	evbuffer_freeze(buf, 1);
   1449 
   1450 	evhttp_start_read_(evcon);
   1451 	evcon->flags |= EVHTTP_CON_READING_ERROR;
   1452 }
   1453 
   1454 static void
   1455 evhttp_error_cb(struct bufferevent *bufev, short what, void *arg)
   1456 {
   1457 	struct evhttp_connection *evcon = arg;
   1458 	struct evhttp_request *req = TAILQ_FIRST(&evcon->requests);
   1459 
   1460 	if (evcon->fd == -1)
   1461 		evcon->fd = bufferevent_getfd(bufev);
   1462 
   1463 	switch (evcon->state) {
   1464 	case EVCON_CONNECTING:
   1465 		if (what & BEV_EVENT_TIMEOUT) {
   1466 			event_debug(("%s: connection timeout for \"%s:%d\" on "
   1467 				EV_SOCK_FMT,
   1468 				__func__, evcon->address, evcon->port,
   1469 				EV_SOCK_ARG(evcon->fd)));
   1470 			evhttp_connection_cb_cleanup(evcon);
   1471 			return;
   1472 		}
   1473 		break;
   1474 
   1475 	case EVCON_READING_BODY:
   1476 		if (!req->chunked && req->ntoread < 0
   1477 		    && what == (BEV_EVENT_READING|BEV_EVENT_EOF)) {
   1478 			/* EOF on read can be benign */
   1479 			evhttp_connection_done(evcon);
   1480 			return;
   1481 		}
   1482 		break;
   1483 
   1484 	case EVCON_DISCONNECTED:
   1485 	case EVCON_IDLE:
   1486 	case EVCON_READING_FIRSTLINE:
   1487 	case EVCON_READING_HEADERS:
   1488 	case EVCON_READING_TRAILER:
   1489 	case EVCON_WRITING:
   1490 	default:
   1491 		break;
   1492 	}
   1493 
   1494 	/* when we are in close detect mode, a read error means that
   1495 	 * the other side closed their connection.
   1496 	 */
   1497 	if (evcon->flags & EVHTTP_CON_CLOSEDETECT) {
   1498 		evcon->flags &= ~EVHTTP_CON_CLOSEDETECT;
   1499 		EVUTIL_ASSERT(evcon->http_server == NULL);
   1500 		/* For connections from the client, we just
   1501 		 * reset the connection so that it becomes
   1502 		 * disconnected.
   1503 		 */
   1504 		EVUTIL_ASSERT(evcon->state == EVCON_IDLE);
   1505 		evhttp_connection_reset_(evcon);
   1506 
   1507 		/*
   1508 		 * If we have no more requests that need completion
   1509 		 * and we want to auto-free the connection when all
   1510 		 * requests have been completed.
   1511 		 */
   1512 		if (TAILQ_FIRST(&evcon->requests) == NULL
   1513 		  && (evcon->flags & EVHTTP_CON_OUTGOING)
   1514 		  && (evcon->flags & EVHTTP_CON_AUTOFREE)) {
   1515 			evhttp_connection_free(evcon);
   1516 		}
   1517 		return;
   1518 	}
   1519 
   1520 	if (what & BEV_EVENT_TIMEOUT) {
   1521 		evhttp_connection_fail_(evcon, EVREQ_HTTP_TIMEOUT);
   1522 	} else if (what & (BEV_EVENT_EOF|BEV_EVENT_ERROR)) {
   1523 		if (what & BEV_EVENT_WRITING &&
   1524 			evcon->flags & EVHTTP_CON_READ_ON_WRITE_ERROR) {
   1525 			evhttp_connection_read_on_write_error(evcon, req);
   1526 			return;
   1527 		}
   1528 
   1529 		evhttp_connection_fail_(evcon, EVREQ_HTTP_EOF);
   1530 	} else if (what == BEV_EVENT_CONNECTED) {
   1531 	} else {
   1532 		evhttp_connection_fail_(evcon, EVREQ_HTTP_BUFFER_ERROR);
   1533 	}
   1534 }
   1535 
   1536 /*
   1537  * Event callback for asynchronous connection attempt.
   1538  */
   1539 static void
   1540 evhttp_connection_cb(struct bufferevent *bufev, short what, void *arg)
   1541 {
   1542 	struct evhttp_connection *evcon = arg;
   1543 	int error;
   1544 	ev_socklen_t errsz = sizeof(error);
   1545 
   1546 	if (evcon->fd == -1)
   1547 		evcon->fd = bufferevent_getfd(bufev);
   1548 
   1549 	if (!(what & BEV_EVENT_CONNECTED)) {
   1550 		/* some operating systems return ECONNREFUSED immediately
   1551 		 * when connecting to a local address.  the cleanup is going
   1552 		 * to reschedule this function call.
   1553 		 */
   1554 #ifndef _WIN32
   1555 		if (errno == ECONNREFUSED)
   1556 			goto cleanup;
   1557 #endif
   1558 		evhttp_error_cb(bufev, what, arg);
   1559 		return;
   1560 	}
   1561 
   1562 	if (evcon->fd == -1) {
   1563 		event_debug(("%s: bufferevent_getfd returned -1",
   1564 			__func__));
   1565 		goto cleanup;
   1566 	}
   1567 
   1568 	/* Check if the connection completed */
   1569 	if (getsockopt(evcon->fd, SOL_SOCKET, SO_ERROR, (void*)&error,
   1570 		       &errsz) == -1) {
   1571 		event_debug(("%s: getsockopt for \"%s:%d\" on "EV_SOCK_FMT,
   1572 			__func__, evcon->address, evcon->port,
   1573 			EV_SOCK_ARG(evcon->fd)));
   1574 		goto cleanup;
   1575 	}
   1576 
   1577 	if (error) {
   1578 		event_debug(("%s: connect failed for \"%s:%d\" on "
   1579 			EV_SOCK_FMT": %s",
   1580 			__func__, evcon->address, evcon->port,
   1581 			EV_SOCK_ARG(evcon->fd),
   1582 			evutil_socket_error_to_string(error)));
   1583 		goto cleanup;
   1584 	}
   1585 
   1586 	/* We are connected to the server now */
   1587 	event_debug(("%s: connected to \"%s:%d\" on "EV_SOCK_FMT"\n",
   1588 			__func__, evcon->address, evcon->port,
   1589 			EV_SOCK_ARG(evcon->fd)));
   1590 
   1591 	/* Reset the retry count as we were successful in connecting */
   1592 	evcon->retry_cnt = 0;
   1593 	evcon->state = EVCON_IDLE;
   1594 
   1595 	/* reset the bufferevent cbs */
   1596 	bufferevent_setcb(evcon->bufev,
   1597 	    evhttp_read_cb,
   1598 	    evhttp_write_cb,
   1599 	    evhttp_error_cb,
   1600 	    evcon);
   1601 
   1602 	if (!evutil_timerisset(&evcon->timeout)) {
   1603 		const struct timeval read_tv = { HTTP_READ_TIMEOUT, 0 };
   1604 		const struct timeval write_tv = { HTTP_WRITE_TIMEOUT, 0 };
   1605 		bufferevent_set_timeouts(evcon->bufev, &read_tv, &write_tv);
   1606 	} else {
   1607 		bufferevent_set_timeouts(evcon->bufev, &evcon->timeout, &evcon->timeout);
   1608 	}
   1609 
   1610 	/* try to start requests that have queued up on this connection */
   1611 	evhttp_request_dispatch(evcon);
   1612 	return;
   1613 
   1614  cleanup:
   1615 	evhttp_connection_cb_cleanup(evcon);
   1616 }
   1617 
   1618 /*
   1619  * Check if we got a valid response code.
   1620  */
   1621 
   1622 static int
   1623 evhttp_valid_response_code(int code)
   1624 {
   1625 	if (code == 0)
   1626 		return (0);
   1627 
   1628 	return (1);
   1629 }
   1630 
   1631 static int
   1632 evhttp_parse_http_version(const char *version, struct evhttp_request *req)
   1633 {
   1634 	int major, minor;
   1635 	char ch;
   1636 	int n = sscanf(version, "HTTP/%d.%d%c", &major, &minor, &ch);
   1637 	if (n != 2 || major > 1) {
   1638 		event_debug(("%s: bad version %s on message %p from %s",
   1639 			__func__, version, req, req->remote_host));
   1640 		return (-1);
   1641 	}
   1642 	req->major = major;
   1643 	req->minor = minor;
   1644 	return (0);
   1645 }
   1646 
   1647 /* Parses the status line of a web server */
   1648 
   1649 static int
   1650 evhttp_parse_response_line(struct evhttp_request *req, char *line)
   1651 {
   1652 	char *protocol;
   1653 	char *number;
   1654 	const char *readable = "";
   1655 
   1656 	protocol = strsep(&line, " ");
   1657 	if (line == NULL)
   1658 		return (-1);
   1659 	number = strsep(&line, " ");
   1660 	if (line != NULL)
   1661 		readable = line;
   1662 
   1663 	if (evhttp_parse_http_version(protocol, req) < 0)
   1664 		return (-1);
   1665 
   1666 	req->response_code = atoi(number);
   1667 	if (!evhttp_valid_response_code(req->response_code)) {
   1668 		event_debug(("%s: bad response code \"%s\"",
   1669 			__func__, number));
   1670 		return (-1);
   1671 	}
   1672 
   1673 	if (req->response_code_line != NULL)
   1674 		mm_free(req->response_code_line);
   1675 	if ((req->response_code_line = mm_strdup(readable)) == NULL) {
   1676 		event_warn("%s: strdup", __func__);
   1677 		return (-1);
   1678 	}
   1679 
   1680 	return (0);
   1681 }
   1682 
   1683 /* Parse the first line of a HTTP request */
   1684 
   1685 static int
   1686 evhttp_parse_request_line(struct evhttp_request *req, char *line)
   1687 {
   1688 	char *method;
   1689 	char *uri;
   1690 	char *version;
   1691 	const char *hostname;
   1692 	const char *scheme;
   1693 	size_t method_len;
   1694 	enum evhttp_cmd_type type;
   1695 
   1696 	/* Parse the request line */
   1697 	method = strsep(&line, " ");
   1698 	if (line == NULL)
   1699 		return (-1);
   1700 	uri = strsep(&line, " ");
   1701 	if (line == NULL)
   1702 		return (-1);
   1703 	version = strsep(&line, " ");
   1704 	if (line != NULL)
   1705 		return (-1);
   1706 
   1707 	method_len = (uri - method) - 1;
   1708 	type       = EVHTTP_REQ_UNKNOWN_;
   1709 
   1710 	/* First line */
   1711 	switch (method_len) {
   1712 	    case 3:
   1713 		/* The length of the method string is 3, meaning it can only be one of two methods: GET or PUT */
   1714 
   1715 		/* Since both GET and PUT share the same character 'T' at the end,
   1716 		 * if the string doesn't have 'T', we can immediately determine this
   1717 		 * is an invalid HTTP method */
   1718 
   1719 		if (method[2] != 'T') {
   1720 		    break;
   1721 		}
   1722 
   1723 		switch (*method) {
   1724 		    case 'G':
   1725 			/* This first byte is 'G', so make sure the next byte is
   1726 			 * 'E', if it isn't then this isn't a valid method */
   1727 
   1728 			if (method[1] == 'E') {
   1729 			    type = EVHTTP_REQ_GET;
   1730 			}
   1731 
   1732 			break;
   1733 		    case 'P':
   1734 			/* First byte is P, check second byte for 'U', if not,
   1735 			 * we know it's an invalid method */
   1736 			if (method[1] == 'U') {
   1737 			    type = EVHTTP_REQ_PUT;
   1738 			}
   1739 			break;
   1740 		    default:
   1741 			break;
   1742 		}
   1743 		break;
   1744 	    case 4:
   1745 		/* The method length is 4 bytes, leaving only the methods "POST" and "HEAD" */
   1746 		switch (*method) {
   1747 		    case 'P':
   1748 			if (method[3] == 'T' && method[2] == 'S' && method[1] == 'O') {
   1749 			    type = EVHTTP_REQ_POST;
   1750 			}
   1751 			break;
   1752 		    case 'H':
   1753 			if (method[3] == 'D' && method[2] == 'A' && method[1] == 'E') {
   1754 			    type = EVHTTP_REQ_HEAD;
   1755 			}
   1756 			break;
   1757 		    default:
   1758 			break;
   1759 		}
   1760 		break;
   1761 	    case 5:
   1762 		/* Method length is 5 bytes, which can only encompass PATCH and TRACE */
   1763 		switch (*method) {
   1764 		    case 'P':
   1765 			if (method[4] == 'H' && method[3] == 'C' && method[2] == 'T' && method[1] == 'A') {
   1766 			    type = EVHTTP_REQ_PATCH;
   1767 			}
   1768 			break;
   1769 		    case 'T':
   1770 			if (method[4] == 'E' && method[3] == 'C' && method[2] == 'A' && method[1] == 'R') {
   1771 			    type = EVHTTP_REQ_TRACE;
   1772 			}
   1773 
   1774 			break;
   1775 		    default:
   1776 			break;
   1777 		}
   1778 		break;
   1779 	    case 6:
   1780 		/* Method length is 6, only valid method 6 bytes in length is DELEte */
   1781 
   1782 		/* If the first byte isn't 'D' then it's invalid */
   1783 		if (*method != 'D') {
   1784 		    break;
   1785 		}
   1786 
   1787 		if (method[5] == 'E' && method[4] == 'T' && method[3] == 'E' && method[2] == 'L' && method[1] == 'E') {
   1788 		    type = EVHTTP_REQ_DELETE;
   1789 		}
   1790 
   1791 		break;
   1792 	    case 7:
   1793 		/* Method length is 7, only valid methods are "OPTIONS" and "CONNECT" */
   1794 		switch (*method) {
   1795 		    case 'O':
   1796 			if (method[6] == 'S' && method[5] == 'N' && method[4] == 'O' &&
   1797 				method[3] == 'I' && method[2] == 'T' && method[1] == 'P') {
   1798 			    type = EVHTTP_REQ_OPTIONS;
   1799 			}
   1800 
   1801 		       	break;
   1802 		    case 'C':
   1803 			if (method[6] == 'T' && method[5] == 'C' && method[4] == 'E' &&
   1804 				method[3] == 'N' && method[2] == 'N' && method[1] == 'O') {
   1805 			    type = EVHTTP_REQ_CONNECT;
   1806 			}
   1807 
   1808 			break;
   1809 		    default:
   1810 			break;
   1811 		}
   1812 		break;
   1813 	} /* switch */
   1814 
   1815 	if ((int)type == EVHTTP_REQ_UNKNOWN_) {
   1816 	        event_debug(("%s: bad method %s on request %p from %s",
   1817 			__func__, method, req, req->remote_host));
   1818                 /* No error yet; we'll give a better error later when
   1819                  * we see that req->type is unsupported. */
   1820 	}
   1821 
   1822 	req->type = type;
   1823 
   1824 	if (evhttp_parse_http_version(version, req) < 0)
   1825 		return (-1);
   1826 
   1827 	if ((req->uri = mm_strdup(uri)) == NULL) {
   1828 		event_debug(("%s: mm_strdup", __func__));
   1829 		return (-1);
   1830 	}
   1831 
   1832 	if ((req->uri_elems = evhttp_uri_parse_with_flags(req->uri,
   1833 		    EVHTTP_URI_NONCONFORMANT)) == NULL) {
   1834 		return -1;
   1835 	}
   1836 
   1837 	/* If we have an absolute-URI, check to see if it is an http request
   1838 	   for a known vhost or server alias. If we don't know about this
   1839 	   host, we consider it a proxy request. */
   1840 	scheme = evhttp_uri_get_scheme(req->uri_elems);
   1841 	hostname = evhttp_uri_get_host(req->uri_elems);
   1842 	if (scheme && (!evutil_ascii_strcasecmp(scheme, "http") ||
   1843 		       !evutil_ascii_strcasecmp(scheme, "https")) &&
   1844 	    hostname &&
   1845 	    !evhttp_find_vhost(req->evcon->http_server, NULL, hostname))
   1846 		req->flags |= EVHTTP_PROXY_REQUEST;
   1847 
   1848 	return (0);
   1849 }
   1850 
   1851 const char *
   1852 evhttp_find_header(const struct evkeyvalq *headers, const char *key)
   1853 {
   1854 	struct evkeyval *header;
   1855 
   1856 	TAILQ_FOREACH(header, headers, next) {
   1857 		if (evutil_ascii_strcasecmp(header->key, key) == 0)
   1858 			return (header->value);
   1859 	}
   1860 
   1861 	return (NULL);
   1862 }
   1863 
   1864 void
   1865 evhttp_clear_headers(struct evkeyvalq *headers)
   1866 {
   1867 	struct evkeyval *header;
   1868 
   1869 	for (header = TAILQ_FIRST(headers);
   1870 	    header != NULL;
   1871 	    header = TAILQ_FIRST(headers)) {
   1872 		TAILQ_REMOVE(headers, header, next);
   1873 		mm_free(header->key);
   1874 		mm_free(header->value);
   1875 		mm_free(header);
   1876 	}
   1877 }
   1878 
   1879 /*
   1880  * Returns 0,  if the header was successfully removed.
   1881  * Returns -1, if the header could not be found.
   1882  */
   1883 
   1884 int
   1885 evhttp_remove_header(struct evkeyvalq *headers, const char *key)
   1886 {
   1887 	struct evkeyval *header;
   1888 
   1889 	TAILQ_FOREACH(header, headers, next) {
   1890 		if (evutil_ascii_strcasecmp(header->key, key) == 0)
   1891 			break;
   1892 	}
   1893 
   1894 	if (header == NULL)
   1895 		return (-1);
   1896 
   1897 	/* Free and remove the header that we found */
   1898 	TAILQ_REMOVE(headers, header, next);
   1899 	mm_free(header->key);
   1900 	mm_free(header->value);
   1901 	mm_free(header);
   1902 
   1903 	return (0);
   1904 }
   1905 
   1906 static int
   1907 evhttp_header_is_valid_value(const char *value)
   1908 {
   1909 	const char *p = value;
   1910 
   1911 	while ((p = strpbrk(p, "\r\n")) != NULL) {
   1912 		/* we really expect only one new line */
   1913 		p += strspn(p, "\r\n");
   1914 		/* we expect a space or tab for continuation */
   1915 		if (*p != ' ' && *p != '\t')
   1916 			return (0);
   1917 	}
   1918 	return (1);
   1919 }
   1920 
   1921 int
   1922 evhttp_add_header(struct evkeyvalq *headers,
   1923     const char *key, const char *value)
   1924 {
   1925 	event_debug(("%s: key: %s val: %s\n", __func__, key, value));
   1926 
   1927 	if (strchr(key, '\r') != NULL || strchr(key, '\n') != NULL) {
   1928 		/* drop illegal headers */
   1929 		event_debug(("%s: dropping illegal header key\n", __func__));
   1930 		return (-1);
   1931 	}
   1932 
   1933 	if (!evhttp_header_is_valid_value(value)) {
   1934 		event_debug(("%s: dropping illegal header value\n", __func__));
   1935 		return (-1);
   1936 	}
   1937 
   1938 	return (evhttp_add_header_internal(headers, key, value));
   1939 }
   1940 
   1941 static int
   1942 evhttp_add_header_internal(struct evkeyvalq *headers,
   1943     const char *key, const char *value)
   1944 {
   1945 	struct evkeyval *header = mm_calloc(1, sizeof(struct evkeyval));
   1946 	if (header == NULL) {
   1947 		event_warn("%s: calloc", __func__);
   1948 		return (-1);
   1949 	}
   1950 	if ((header->key = mm_strdup(key)) == NULL) {
   1951 		mm_free(header);
   1952 		event_warn("%s: strdup", __func__);
   1953 		return (-1);
   1954 	}
   1955 	if ((header->value = mm_strdup(value)) == NULL) {
   1956 		mm_free(header->key);
   1957 		mm_free(header);
   1958 		event_warn("%s: strdup", __func__);
   1959 		return (-1);
   1960 	}
   1961 
   1962 	TAILQ_INSERT_TAIL(headers, header, next);
   1963 
   1964 	return (0);
   1965 }
   1966 
   1967 /*
   1968  * Parses header lines from a request or a response into the specified
   1969  * request object given an event buffer.
   1970  *
   1971  * Returns
   1972  *   DATA_CORRUPTED      on error
   1973  *   MORE_DATA_EXPECTED  when we need to read more headers
   1974  *   ALL_DATA_READ       when all headers have been read.
   1975  */
   1976 
   1977 enum message_read_status
   1978 evhttp_parse_firstline_(struct evhttp_request *req, struct evbuffer *buffer)
   1979 {
   1980 	char *line;
   1981 	enum message_read_status status = ALL_DATA_READ;
   1982 
   1983 	size_t line_length;
   1984 	/* XXX try */
   1985 	line = evbuffer_readln(buffer, &line_length, EVBUFFER_EOL_CRLF);
   1986 	if (line == NULL) {
   1987 		if (req->evcon != NULL &&
   1988 		    evbuffer_get_length(buffer) > req->evcon->max_headers_size)
   1989 			return (DATA_TOO_LONG);
   1990 		else
   1991 			return (MORE_DATA_EXPECTED);
   1992 	}
   1993 
   1994 	if (req->evcon != NULL &&
   1995 	    line_length > req->evcon->max_headers_size) {
   1996 		mm_free(line);
   1997 		return (DATA_TOO_LONG);
   1998 	}
   1999 
   2000 	req->headers_size = line_length;
   2001 
   2002 	switch (req->kind) {
   2003 	case EVHTTP_REQUEST:
   2004 		if (evhttp_parse_request_line(req, line) == -1)
   2005 			status = DATA_CORRUPTED;
   2006 		break;
   2007 	case EVHTTP_RESPONSE:
   2008 		if (evhttp_parse_response_line(req, line) == -1)
   2009 			status = DATA_CORRUPTED;
   2010 		break;
   2011 	default:
   2012 		status = DATA_CORRUPTED;
   2013 	}
   2014 
   2015 	mm_free(line);
   2016 	return (status);
   2017 }
   2018 
   2019 static int
   2020 evhttp_append_to_last_header(struct evkeyvalq *headers, char *line)
   2021 {
   2022 	struct evkeyval *header = TAILQ_LAST(headers, evkeyvalq);
   2023 	char *newval;
   2024 	size_t old_len, line_len;
   2025 
   2026 	if (header == NULL)
   2027 		return (-1);
   2028 
   2029 	old_len = strlen(header->value);
   2030 
   2031 	/* Strip space from start and end of line. */
   2032 	while (*line == ' ' || *line == '\t')
   2033 		++line;
   2034 	evutil_rtrim_lws_(line);
   2035 
   2036 	line_len = strlen(line);
   2037 
   2038 	newval = mm_realloc(header->value, old_len + line_len + 2);
   2039 	if (newval == NULL)
   2040 		return (-1);
   2041 
   2042 	newval[old_len] = ' ';
   2043 	memcpy(newval + old_len + 1, line, line_len + 1);
   2044 	header->value = newval;
   2045 
   2046 	return (0);
   2047 }
   2048 
   2049 enum message_read_status
   2050 evhttp_parse_headers_(struct evhttp_request *req, struct evbuffer* buffer)
   2051 {
   2052 	enum message_read_status errcode = DATA_CORRUPTED;
   2053 	char *line;
   2054 	enum message_read_status status = MORE_DATA_EXPECTED;
   2055 
   2056 	struct evkeyvalq* headers = req->input_headers;
   2057 	size_t line_length;
   2058 	while ((line = evbuffer_readln(buffer, &line_length, EVBUFFER_EOL_CRLF))
   2059 	       != NULL) {
   2060 		char *skey, *svalue;
   2061 
   2062 		req->headers_size += line_length;
   2063 
   2064 		if (req->evcon != NULL &&
   2065 		    req->headers_size > req->evcon->max_headers_size) {
   2066 			errcode = DATA_TOO_LONG;
   2067 			goto error;
   2068 		}
   2069 
   2070 		if (*line == '\0') { /* Last header - Done */
   2071 			status = ALL_DATA_READ;
   2072 			mm_free(line);
   2073 			break;
   2074 		}
   2075 
   2076 		/* Check if this is a continuation line */
   2077 		if (*line == ' ' || *line == '\t') {
   2078 			if (evhttp_append_to_last_header(headers, line) == -1)
   2079 				goto error;
   2080 			mm_free(line);
   2081 			continue;
   2082 		}
   2083 
   2084 		/* Processing of header lines */
   2085 		svalue = line;
   2086 		skey = strsep(&svalue, ":");
   2087 		if (svalue == NULL)
   2088 			goto error;
   2089 
   2090 		svalue += strspn(svalue, " ");
   2091 		evutil_rtrim_lws_(svalue);
   2092 
   2093 		if (evhttp_add_header(headers, skey, svalue) == -1)
   2094 			goto error;
   2095 
   2096 		mm_free(line);
   2097 	}
   2098 
   2099 	if (status == MORE_DATA_EXPECTED) {
   2100 		if (req->evcon != NULL &&
   2101 		req->headers_size + evbuffer_get_length(buffer) > req->evcon->max_headers_size)
   2102 			return (DATA_TOO_LONG);
   2103 	}
   2104 
   2105 	return (status);
   2106 
   2107  error:
   2108 	mm_free(line);
   2109 	return (errcode);
   2110 }
   2111 
   2112 static int
   2113 evhttp_get_body_length(struct evhttp_request *req)
   2114 {
   2115 	struct evkeyvalq *headers = req->input_headers;
   2116 	const char *content_length;
   2117 	const char *connection;
   2118 
   2119 	content_length = evhttp_find_header(headers, "Content-Length");
   2120 	connection = evhttp_find_header(headers, "Connection");
   2121 
   2122 	if (content_length == NULL && connection == NULL)
   2123 		req->ntoread = -1;
   2124 	else if (content_length == NULL &&
   2125 	    evutil_ascii_strcasecmp(connection, "Close") != 0) {
   2126 		/* Bad combination, we don't know when it will end */
   2127 		event_warnx("%s: we got no content length, but the "
   2128 		    "server wants to keep the connection open: %s.",
   2129 		    __func__, connection);
   2130 		return (-1);
   2131 	} else if (content_length == NULL) {
   2132 		req->ntoread = -1;
   2133 	} else {
   2134 		char *endp;
   2135 		ev_int64_t ntoread = evutil_strtoll(content_length, &endp, 10);
   2136 		if (*content_length == '\0' || *endp != '\0' || ntoread < 0) {
   2137 			event_debug(("%s: illegal content length: %s",
   2138 				__func__, content_length));
   2139 			return (-1);
   2140 		}
   2141 		req->ntoread = ntoread;
   2142 	}
   2143 
   2144 	event_debug(("%s: bytes to read: "EV_I64_FMT" (in buffer "EV_SIZE_FMT")\n",
   2145 		__func__, EV_I64_ARG(req->ntoread),
   2146 		EV_SIZE_ARG(evbuffer_get_length(bufferevent_get_input(req->evcon->bufev)))));
   2147 
   2148 	return (0);
   2149 }
   2150 
   2151 static int
   2152 evhttp_method_may_have_body(enum evhttp_cmd_type type)
   2153 {
   2154 	switch (type) {
   2155 	case EVHTTP_REQ_POST:
   2156 	case EVHTTP_REQ_PUT:
   2157 	case EVHTTP_REQ_PATCH:
   2158 		return 1;
   2159 	case EVHTTP_REQ_TRACE:
   2160 		return 0;
   2161 	/* XXX May any of the below methods have a body? */
   2162 	case EVHTTP_REQ_GET:
   2163 	case EVHTTP_REQ_HEAD:
   2164 	case EVHTTP_REQ_DELETE:
   2165 	case EVHTTP_REQ_OPTIONS:
   2166 	case EVHTTP_REQ_CONNECT:
   2167 		return 0;
   2168 	default:
   2169 		return 0;
   2170 	}
   2171 }
   2172 
   2173 static void
   2174 evhttp_get_body(struct evhttp_connection *evcon, struct evhttp_request *req)
   2175 {
   2176 	const char *xfer_enc;
   2177 
   2178 	/* If this is a request without a body, then we are done */
   2179 	if (req->kind == EVHTTP_REQUEST &&
   2180 	    !evhttp_method_may_have_body(req->type)) {
   2181 		evhttp_connection_done(evcon);
   2182 		return;
   2183 	}
   2184 	evcon->state = EVCON_READING_BODY;
   2185 	xfer_enc = evhttp_find_header(req->input_headers, "Transfer-Encoding");
   2186 	if (xfer_enc != NULL && evutil_ascii_strcasecmp(xfer_enc, "chunked") == 0) {
   2187 		req->chunked = 1;
   2188 		req->ntoread = -1;
   2189 	} else {
   2190 		if (evhttp_get_body_length(req) == -1) {
   2191 			evhttp_connection_fail_(evcon, EVREQ_HTTP_INVALID_HEADER);
   2192 			return;
   2193 		}
   2194 		if (req->kind == EVHTTP_REQUEST && req->ntoread < 1) {
   2195 			/* An incoming request with no content-length and no
   2196 			 * transfer-encoding has no body. */
   2197 			evhttp_connection_done(evcon);
   2198 			return;
   2199 		}
   2200 	}
   2201 
   2202 	/* Should we send a 100 Continue status line? */
   2203 	switch (evhttp_have_expect(req, 1)) {
   2204 		case CONTINUE:
   2205 				/* XXX It would be nice to do some sanity
   2206 				   checking here. Does the resource exist?
   2207 				   Should the resource accept post requests? If
   2208 				   no, we should respond with an error. For
   2209 				   now, just optimistically tell the client to
   2210 				   send their message body. */
   2211 				if (req->ntoread > 0) {
   2212 					/* ntoread is ev_int64_t, max_body_size is ev_uint64_t */
   2213 					if ((req->evcon->max_body_size <= EV_INT64_MAX) &&
   2214 						(ev_uint64_t)req->ntoread > req->evcon->max_body_size) {
   2215 						evhttp_lingering_fail(evcon, req);
   2216 						return;
   2217 					}
   2218 				}
   2219 				if (!evbuffer_get_length(bufferevent_get_input(evcon->bufev)))
   2220 					evhttp_send_continue(evcon, req);
   2221 			break;
   2222 		case OTHER:
   2223 			evhttp_send_error(req, HTTP_EXPECTATIONFAILED, NULL);
   2224 			return;
   2225 		case NO: break;
   2226 	}
   2227 
   2228 	evhttp_read_body(evcon, req);
   2229 	/* note the request may have been freed in evhttp_read_body */
   2230 }
   2231 
   2232 static void
   2233 evhttp_read_firstline(struct evhttp_connection *evcon,
   2234 		      struct evhttp_request *req)
   2235 {
   2236 	enum message_read_status res;
   2237 
   2238 	res = evhttp_parse_firstline_(req, bufferevent_get_input(evcon->bufev));
   2239 	if (res == DATA_CORRUPTED || res == DATA_TOO_LONG) {
   2240 		/* Error while reading, terminate */
   2241 		event_debug(("%s: bad header lines on "EV_SOCK_FMT"\n",
   2242 			__func__, EV_SOCK_ARG(evcon->fd)));
   2243 		evhttp_connection_fail_(evcon, EVREQ_HTTP_INVALID_HEADER);
   2244 		return;
   2245 	} else if (res == MORE_DATA_EXPECTED) {
   2246 		/* Need more header lines */
   2247 		return;
   2248 	}
   2249 
   2250 	evcon->state = EVCON_READING_HEADERS;
   2251 	evhttp_read_header(evcon, req);
   2252 }
   2253 
   2254 static void
   2255 evhttp_read_header(struct evhttp_connection *evcon,
   2256 		   struct evhttp_request *req)
   2257 {
   2258 	enum message_read_status res;
   2259 	evutil_socket_t fd = evcon->fd;
   2260 
   2261 	res = evhttp_parse_headers_(req, bufferevent_get_input(evcon->bufev));
   2262 	if (res == DATA_CORRUPTED || res == DATA_TOO_LONG) {
   2263 		/* Error while reading, terminate */
   2264 		event_debug(("%s: bad header lines on "EV_SOCK_FMT"\n",
   2265 			__func__, EV_SOCK_ARG(fd)));
   2266 		evhttp_connection_fail_(evcon, EVREQ_HTTP_INVALID_HEADER);
   2267 		return;
   2268 	} else if (res == MORE_DATA_EXPECTED) {
   2269 		/* Need more header lines */
   2270 		return;
   2271 	}
   2272 
   2273 	/* Callback can shut down connection with negative return value */
   2274 	if (req->header_cb != NULL) {
   2275 		if ((*req->header_cb)(req, req->cb_arg) < 0) {
   2276 			evhttp_connection_fail_(evcon, EVREQ_HTTP_EOF);
   2277 			return;
   2278 		}
   2279 	}
   2280 
   2281 	/* Done reading headers, do the real work */
   2282 	switch (req->kind) {
   2283 	case EVHTTP_REQUEST:
   2284 		event_debug(("%s: checking for post data on "EV_SOCK_FMT"\n",
   2285 			__func__, EV_SOCK_ARG(fd)));
   2286 		evhttp_get_body(evcon, req);
   2287 		/* note the request may have been freed in evhttp_get_body */
   2288 		break;
   2289 
   2290 	case EVHTTP_RESPONSE:
   2291 		/* Start over if we got a 100 Continue response. */
   2292 		if (req->response_code == 100) {
   2293 			struct evbuffer *output = bufferevent_get_output(evcon->bufev);
   2294 			evbuffer_add_buffer(output, req->output_buffer);
   2295 			evhttp_start_write_(evcon);
   2296 			return;
   2297 		}
   2298 		if (!evhttp_response_needs_body(req)) {
   2299 			event_debug(("%s: skipping body for code %d\n",
   2300 					__func__, req->response_code));
   2301 			evhttp_connection_done(evcon);
   2302 		} else {
   2303 			event_debug(("%s: start of read body for %s on "
   2304 				EV_SOCK_FMT"\n",
   2305 				__func__, req->remote_host, EV_SOCK_ARG(fd)));
   2306 			evhttp_get_body(evcon, req);
   2307 			/* note the request may have been freed in
   2308 			 * evhttp_get_body */
   2309 		}
   2310 		break;
   2311 
   2312 	default:
   2313 		event_warnx("%s: bad header on "EV_SOCK_FMT, __func__,
   2314 		    EV_SOCK_ARG(fd));
   2315 		evhttp_connection_fail_(evcon, EVREQ_HTTP_INVALID_HEADER);
   2316 		break;
   2317 	}
   2318 	/* request may have been freed above */
   2319 }
   2320 
   2321 /*
   2322  * Creates a TCP connection to the specified port and executes a callback
   2323  * when finished.  Failure or success is indicate by the passed connection
   2324  * object.
   2325  *
   2326  * Although this interface accepts a hostname, it is intended to take
   2327  * only numeric hostnames so that non-blocking DNS resolution can
   2328  * happen elsewhere.
   2329  */
   2330 
   2331 struct evhttp_connection *
   2332 evhttp_connection_new(const char *address, ev_uint16_t port)
   2333 {
   2334 	return (evhttp_connection_base_new(NULL, NULL, address, port));
   2335 }
   2336 
   2337 struct evhttp_connection *
   2338 evhttp_connection_base_bufferevent_new(struct event_base *base, struct evdns_base *dnsbase, struct bufferevent* bev,
   2339     const char *address, ev_uint16_t port)
   2340 {
   2341 	struct evhttp_connection *evcon = NULL;
   2342 
   2343 	event_debug(("Attempting connection to %s:%d\n", address, port));
   2344 
   2345 	if ((evcon = mm_calloc(1, sizeof(struct evhttp_connection))) == NULL) {
   2346 		event_warn("%s: calloc failed", __func__);
   2347 		goto error;
   2348 	}
   2349 
   2350 	evcon->fd = -1;
   2351 	evcon->port = port;
   2352 
   2353 	evcon->max_headers_size = EV_SIZE_MAX;
   2354 	evcon->max_body_size = EV_SIZE_MAX;
   2355 
   2356 	evutil_timerclear(&evcon->timeout);
   2357 	evcon->retry_cnt = evcon->retry_max = 0;
   2358 
   2359 	if ((evcon->address = mm_strdup(address)) == NULL) {
   2360 		event_warn("%s: strdup failed", __func__);
   2361 		goto error;
   2362 	}
   2363 
   2364 	if (bev == NULL) {
   2365 		if (!(bev = bufferevent_socket_new(base, -1, 0))) {
   2366 			event_warn("%s: bufferevent_socket_new failed", __func__);
   2367 			goto error;
   2368 		}
   2369 	}
   2370 
   2371 	bufferevent_setcb(bev, evhttp_read_cb, evhttp_write_cb, evhttp_error_cb, evcon);
   2372 	evcon->bufev = bev;
   2373 
   2374 	evcon->state = EVCON_DISCONNECTED;
   2375 	TAILQ_INIT(&evcon->requests);
   2376 
   2377 	evcon->initial_retry_timeout.tv_sec = 2;
   2378 	evcon->initial_retry_timeout.tv_usec = 0;
   2379 
   2380 	if (base != NULL) {
   2381 		evcon->base = base;
   2382 		if (bufferevent_get_base(bev) != base)
   2383 			bufferevent_base_set(base, evcon->bufev);
   2384 	}
   2385 
   2386 	event_deferred_cb_init_(
   2387 	    &evcon->read_more_deferred_cb,
   2388 	    bufferevent_get_priority(bev),
   2389 	    evhttp_deferred_read_cb, evcon);
   2390 
   2391 	evcon->dns_base = dnsbase;
   2392 	evcon->ai_family = AF_UNSPEC;
   2393 
   2394 	return (evcon);
   2395 
   2396  error:
   2397 	if (evcon != NULL)
   2398 		evhttp_connection_free(evcon);
   2399 	return (NULL);
   2400 }
   2401 
   2402 struct bufferevent* evhttp_connection_get_bufferevent(struct evhttp_connection *evcon)
   2403 {
   2404 	return evcon->bufev;
   2405 }
   2406 
   2407 struct evhttp *
   2408 evhttp_connection_get_server(struct evhttp_connection *evcon)
   2409 {
   2410 	return evcon->http_server;
   2411 }
   2412 
   2413 struct evhttp_connection *
   2414 evhttp_connection_base_new(struct event_base *base, struct evdns_base *dnsbase,
   2415     const char *address, ev_uint16_t port)
   2416 {
   2417 	return evhttp_connection_base_bufferevent_new(base, dnsbase, NULL, address, port);
   2418 }
   2419 
   2420 void evhttp_connection_set_family(struct evhttp_connection *evcon,
   2421 	int family)
   2422 {
   2423 	evcon->ai_family = family;
   2424 }
   2425 
   2426 int evhttp_connection_set_flags(struct evhttp_connection *evcon,
   2427 	int flags)
   2428 {
   2429 	int avail_flags = 0;
   2430 	avail_flags |= EVHTTP_CON_REUSE_CONNECTED_ADDR;
   2431 	avail_flags |= EVHTTP_CON_READ_ON_WRITE_ERROR;
   2432 
   2433 	if (flags & ~avail_flags || flags > EVHTTP_CON_PUBLIC_FLAGS_END)
   2434 		return 1;
   2435 	evcon->flags &= ~avail_flags;
   2436 
   2437 	evcon->flags |= flags;
   2438 
   2439 	return 0;
   2440 }
   2441 
   2442 void
   2443 evhttp_connection_set_base(struct evhttp_connection *evcon,
   2444     struct event_base *base)
   2445 {
   2446 	EVUTIL_ASSERT(evcon->base == NULL);
   2447 	EVUTIL_ASSERT(evcon->state == EVCON_DISCONNECTED);
   2448 	evcon->base = base;
   2449 	bufferevent_base_set(base, evcon->bufev);
   2450 }
   2451 
   2452 void
   2453 evhttp_connection_set_timeout(struct evhttp_connection *evcon,
   2454     int timeout_in_secs)
   2455 {
   2456 	if (timeout_in_secs == -1)
   2457 		evhttp_connection_set_timeout_tv(evcon, NULL);
   2458 	else {
   2459 		struct timeval tv;
   2460 		tv.tv_sec = timeout_in_secs;
   2461 		tv.tv_usec = 0;
   2462 		evhttp_connection_set_timeout_tv(evcon, &tv);
   2463 	}
   2464 }
   2465 
   2466 void
   2467 evhttp_connection_set_timeout_tv(struct evhttp_connection *evcon,
   2468     const struct timeval* tv)
   2469 {
   2470 	if (tv) {
   2471 		evcon->timeout = *tv;
   2472 		bufferevent_set_timeouts(evcon->bufev, &evcon->timeout, &evcon->timeout);
   2473 	} else {
   2474 		const struct timeval read_tv = { HTTP_READ_TIMEOUT, 0 };
   2475 		const struct timeval write_tv = { HTTP_WRITE_TIMEOUT, 0 };
   2476 		evutil_timerclear(&evcon->timeout);
   2477 		bufferevent_set_timeouts(evcon->bufev, &read_tv, &write_tv);
   2478 	}
   2479 }
   2480 
   2481 void
   2482 evhttp_connection_set_initial_retry_tv(struct evhttp_connection *evcon,
   2483     const struct timeval *tv)
   2484 {
   2485 	if (tv) {
   2486 		evcon->initial_retry_timeout = *tv;
   2487 	} else {
   2488 		evutil_timerclear(&evcon->initial_retry_timeout);
   2489 		evcon->initial_retry_timeout.tv_sec = 2;
   2490 	}
   2491 }
   2492 
   2493 void
   2494 evhttp_connection_set_retries(struct evhttp_connection *evcon,
   2495     int retry_max)
   2496 {
   2497 	evcon->retry_max = retry_max;
   2498 }
   2499 
   2500 void
   2501 evhttp_connection_set_closecb(struct evhttp_connection *evcon,
   2502     void (*cb)(struct evhttp_connection *, void *), void *cbarg)
   2503 {
   2504 	evcon->closecb = cb;
   2505 	evcon->closecb_arg = cbarg;
   2506 }
   2507 
   2508 void
   2509 evhttp_connection_get_peer(struct evhttp_connection *evcon,
   2510     char **address, ev_uint16_t *port)
   2511 {
   2512 	*address = evcon->address;
   2513 	*port = evcon->port;
   2514 }
   2515 
   2516 const struct sockaddr*
   2517 evhttp_connection_get_addr(struct evhttp_connection *evcon)
   2518 {
   2519 	return bufferevent_socket_get_conn_address_(evcon->bufev);
   2520 }
   2521 
   2522 int
   2523 evhttp_connection_connect_(struct evhttp_connection *evcon)
   2524 {
   2525 	int old_state = evcon->state;
   2526 	const char *address = evcon->address;
   2527 	const struct sockaddr *sa = evhttp_connection_get_addr(evcon);
   2528 	int ret;
   2529 
   2530 	if (evcon->state == EVCON_CONNECTING)
   2531 		return (0);
   2532 
   2533 	evhttp_connection_reset_(evcon);
   2534 
   2535 	EVUTIL_ASSERT(!(evcon->flags & EVHTTP_CON_INCOMING));
   2536 	evcon->flags |= EVHTTP_CON_OUTGOING;
   2537 
   2538 	if (evcon->bind_address || evcon->bind_port) {
   2539 		evcon->fd = bind_socket(
   2540 			evcon->bind_address, evcon->bind_port, 0 /*reuse*/);
   2541 		if (evcon->fd == -1) {
   2542 			event_debug(("%s: failed to bind to \"%s\"",
   2543 				__func__, evcon->bind_address));
   2544 			return (-1);
   2545 		}
   2546 
   2547 		bufferevent_setfd(evcon->bufev, evcon->fd);
   2548 	} else {
   2549 		bufferevent_setfd(evcon->bufev, -1);
   2550 	}
   2551 
   2552 	/* Set up a callback for successful connection setup */
   2553 	bufferevent_setcb(evcon->bufev,
   2554 	    NULL /* evhttp_read_cb */,
   2555 	    NULL /* evhttp_write_cb */,
   2556 	    evhttp_connection_cb,
   2557 	    evcon);
   2558 	if (!evutil_timerisset(&evcon->timeout)) {
   2559 		const struct timeval conn_tv = { HTTP_CONNECT_TIMEOUT, 0 };
   2560 		bufferevent_set_timeouts(evcon->bufev, &conn_tv, &conn_tv);
   2561 	} else {
   2562 		bufferevent_set_timeouts(evcon->bufev, &evcon->timeout, &evcon->timeout);
   2563 	}
   2564 	/* make sure that we get a write callback */
   2565 	bufferevent_enable(evcon->bufev, EV_WRITE);
   2566 
   2567 	evcon->state = EVCON_CONNECTING;
   2568 
   2569 	if (evcon->flags & EVHTTP_CON_REUSE_CONNECTED_ADDR &&
   2570 		sa &&
   2571 		(sa->sa_family == AF_INET || sa->sa_family == AF_INET6)) {
   2572 		int socklen = sizeof(struct sockaddr_in);
   2573 		if (sa->sa_family == AF_INET6) {
   2574 			socklen = sizeof(struct sockaddr_in6);
   2575 		}
   2576 		ret = bufferevent_socket_connect(evcon->bufev, sa, socklen);
   2577 	} else {
   2578 		ret = bufferevent_socket_connect_hostname(evcon->bufev,
   2579 				evcon->dns_base, evcon->ai_family, address, evcon->port);
   2580 	}
   2581 
   2582 	if (ret < 0) {
   2583 		evcon->state = old_state;
   2584 		event_sock_warn(evcon->fd, "%s: connection to \"%s\" failed",
   2585 		    __func__, evcon->address);
   2586 		/* some operating systems return ECONNREFUSED immediately
   2587 		 * when connecting to a local address.  the cleanup is going
   2588 		 * to reschedule this function call.
   2589 		 */
   2590 		evhttp_connection_cb_cleanup(evcon);
   2591 		return (0);
   2592 	}
   2593 
   2594 	return (0);
   2595 }
   2596 
   2597 /*
   2598  * Starts an HTTP request on the provided evhttp_connection object.
   2599  * If the connection object is not connected to the web server already,
   2600  * this will start the connection.
   2601  */
   2602 
   2603 int
   2604 evhttp_make_request(struct evhttp_connection *evcon,
   2605     struct evhttp_request *req,
   2606     enum evhttp_cmd_type type, const char *uri)
   2607 {
   2608 	/* We are making a request */
   2609 	req->kind = EVHTTP_REQUEST;
   2610 	req->type = type;
   2611 	if (req->uri != NULL)
   2612 		mm_free(req->uri);
   2613 	if ((req->uri = mm_strdup(uri)) == NULL) {
   2614 		event_warn("%s: strdup", __func__);
   2615 		evhttp_request_free_auto(req);
   2616 		return (-1);
   2617 	}
   2618 
   2619 	/* Set the protocol version if it is not supplied */
   2620 	if (!req->major && !req->minor) {
   2621 		req->major = 1;
   2622 		req->minor = 1;
   2623 	}
   2624 
   2625 	EVUTIL_ASSERT(req->evcon == NULL);
   2626 	req->evcon = evcon;
   2627 	EVUTIL_ASSERT(!(req->flags & EVHTTP_REQ_OWN_CONNECTION));
   2628 
   2629 	TAILQ_INSERT_TAIL(&evcon->requests, req, next);
   2630 
   2631 	/* If the connection object is not connected; make it so */
   2632 	if (!evhttp_connected(evcon)) {
   2633 		int res = evhttp_connection_connect_(evcon);
   2634 		/* evhttp_connection_fail_(), which is called through
   2635 		 * evhttp_connection_connect_(), assumes that req lies in
   2636 		 * evcon->requests.  Thus, enqueue the request in advance and
   2637 		 * remove it in the error case. */
   2638 		if (res != 0)
   2639 			TAILQ_REMOVE(&evcon->requests, req, next);
   2640 
   2641 		return res;
   2642 	}
   2643 
   2644 	/*
   2645 	 * If it's connected already and we are the first in the queue,
   2646 	 * then we can dispatch this request immediately.  Otherwise, it
   2647 	 * will be dispatched once the pending requests are completed.
   2648 	 */
   2649 	if (TAILQ_FIRST(&evcon->requests) == req)
   2650 		evhttp_request_dispatch(evcon);
   2651 
   2652 	return (0);
   2653 }
   2654 
   2655 void
   2656 evhttp_cancel_request(struct evhttp_request *req)
   2657 {
   2658 	struct evhttp_connection *evcon = req->evcon;
   2659 	if (evcon != NULL) {
   2660 		/* We need to remove it from the connection */
   2661 		if (TAILQ_FIRST(&evcon->requests) == req) {
   2662 			/* it's currently being worked on, so reset
   2663 			 * the connection.
   2664 			 */
   2665 			evhttp_connection_fail_(evcon,
   2666 			    EVREQ_HTTP_REQUEST_CANCEL);
   2667 
   2668 			/* connection fail freed the request */
   2669 			return;
   2670 		} else {
   2671 			/* otherwise, we can just remove it from the
   2672 			 * queue
   2673 			 */
   2674 			TAILQ_REMOVE(&evcon->requests, req, next);
   2675 		}
   2676 	}
   2677 
   2678 	evhttp_request_free_auto(req);
   2679 }
   2680 
   2681 /*
   2682  * Reads data from file descriptor into request structure
   2683  * Request structure needs to be set up correctly.
   2684  */
   2685 
   2686 void
   2687 evhttp_start_read_(struct evhttp_connection *evcon)
   2688 {
   2689 	bufferevent_disable(evcon->bufev, EV_WRITE);
   2690 	bufferevent_enable(evcon->bufev, EV_READ);
   2691 
   2692 	evcon->state = EVCON_READING_FIRSTLINE;
   2693 	/* Reset the bufferevent callbacks */
   2694 	bufferevent_setcb(evcon->bufev,
   2695 	    evhttp_read_cb,
   2696 	    evhttp_write_cb,
   2697 	    evhttp_error_cb,
   2698 	    evcon);
   2699 
   2700 	/* If there's still data pending, process it next time through the
   2701 	 * loop.  Don't do it now; that could get recusive. */
   2702 	if (evbuffer_get_length(bufferevent_get_input(evcon->bufev))) {
   2703 		event_deferred_cb_schedule_(get_deferred_queue(evcon),
   2704 		    &evcon->read_more_deferred_cb);
   2705 	}
   2706 }
   2707 
   2708 void
   2709 evhttp_start_write_(struct evhttp_connection *evcon)
   2710 {
   2711 	bufferevent_disable(evcon->bufev, EV_WRITE);
   2712 	bufferevent_enable(evcon->bufev, EV_READ);
   2713 
   2714 	evcon->state = EVCON_WRITING;
   2715 	evhttp_write_buffer(evcon, evhttp_write_connectioncb, NULL);
   2716 }
   2717 
   2718 static void
   2719 evhttp_send_done(struct evhttp_connection *evcon, void *arg)
   2720 {
   2721 	int need_close;
   2722 	struct evhttp_request *req = TAILQ_FIRST(&evcon->requests);
   2723 	TAILQ_REMOVE(&evcon->requests, req, next);
   2724 
   2725 	if (req->on_complete_cb != NULL) {
   2726 		req->on_complete_cb(req, req->on_complete_cb_arg);
   2727 	}
   2728 
   2729 	need_close =
   2730 	    (REQ_VERSION_BEFORE(req, 1, 1) &&
   2731 	    !evhttp_is_connection_keepalive(req->input_headers)) ||
   2732 	    evhttp_is_request_connection_close(req);
   2733 
   2734 	EVUTIL_ASSERT(req->flags & EVHTTP_REQ_OWN_CONNECTION);
   2735 	evhttp_request_free(req);
   2736 
   2737 	if (need_close) {
   2738 		evhttp_connection_free(evcon);
   2739 		return;
   2740 	}
   2741 
   2742 	/* we have a persistent connection; try to accept another request. */
   2743 	if (evhttp_associate_new_request_with_connection(evcon) == -1) {
   2744 		evhttp_connection_free(evcon);
   2745 	}
   2746 }
   2747 
   2748 /*
   2749  * Returns an error page.
   2750  */
   2751 
   2752 void
   2753 evhttp_send_error(struct evhttp_request *req, int error, const char *reason)
   2754 {
   2755 
   2756 #define ERR_FORMAT "<HTML><HEAD>\n" \
   2757 	    "<TITLE>%d %s</TITLE>\n" \
   2758 	    "</HEAD><BODY>\n" \
   2759 	    "<H1>%s</H1>\n" \
   2760 	    "</BODY></HTML>\n"
   2761 
   2762 	struct evbuffer *buf = evbuffer_new();
   2763 	if (buf == NULL) {
   2764 		/* if we cannot allocate memory; we just drop the connection */
   2765 		evhttp_connection_free(req->evcon);
   2766 		return;
   2767 	}
   2768 	if (reason == NULL) {
   2769 		reason = evhttp_response_phrase_internal(error);
   2770 	}
   2771 
   2772 	evhttp_response_code_(req, error, reason);
   2773 
   2774 	evbuffer_add_printf(buf, ERR_FORMAT, error, reason, reason);
   2775 
   2776 	evhttp_send_page_(req, buf);
   2777 
   2778 	evbuffer_free(buf);
   2779 #undef ERR_FORMAT
   2780 }
   2781 
   2782 /* Requires that headers and response code are already set up */
   2783 
   2784 static inline void
   2785 evhttp_send(struct evhttp_request *req, struct evbuffer *databuf)
   2786 {
   2787 	struct evhttp_connection *evcon = req->evcon;
   2788 
   2789 	if (evcon == NULL) {
   2790 		evhttp_request_free(req);
   2791 		return;
   2792 	}
   2793 
   2794 	EVUTIL_ASSERT(TAILQ_FIRST(&evcon->requests) == req);
   2795 
   2796 	/* we expect no more calls form the user on this request */
   2797 	req->userdone = 1;
   2798 
   2799 	/* xxx: not sure if we really should expose the data buffer this way */
   2800 	if (databuf != NULL)
   2801 		evbuffer_add_buffer(req->output_buffer, databuf);
   2802 
   2803 	/* Adds headers to the response */
   2804 	evhttp_make_header(evcon, req);
   2805 
   2806 	evhttp_write_buffer(evcon, evhttp_send_done, NULL);
   2807 }
   2808 
   2809 void
   2810 evhttp_send_reply(struct evhttp_request *req, int code, const char *reason,
   2811     struct evbuffer *databuf)
   2812 {
   2813 	evhttp_response_code_(req, code, reason);
   2814 
   2815 	evhttp_send(req, databuf);
   2816 }
   2817 
   2818 void
   2819 evhttp_send_reply_start(struct evhttp_request *req, int code,
   2820     const char *reason)
   2821 {
   2822 	evhttp_response_code_(req, code, reason);
   2823 	if (evhttp_find_header(req->output_headers, "Content-Length") == NULL &&
   2824 	    REQ_VERSION_ATLEAST(req, 1, 1) &&
   2825 	    evhttp_response_needs_body(req)) {
   2826 		/*
   2827 		 * prefer HTTP/1.1 chunked encoding to closing the connection;
   2828 		 * note RFC 2616 section 4.4 forbids it with Content-Length:
   2829 		 * and it's not necessary then anyway.
   2830 		 */
   2831 		evhttp_add_header(req->output_headers, "Transfer-Encoding",
   2832 		    "chunked");
   2833 		req->chunked = 1;
   2834 	} else {
   2835 		req->chunked = 0;
   2836 	}
   2837 	evhttp_make_header(req->evcon, req);
   2838 	evhttp_write_buffer(req->evcon, NULL, NULL);
   2839 }
   2840 
   2841 void
   2842 evhttp_send_reply_chunk_with_cb(struct evhttp_request *req, struct evbuffer *databuf,
   2843     void (*cb)(struct evhttp_connection *, void *), void *arg)
   2844 {
   2845 	struct evhttp_connection *evcon = req->evcon;
   2846 	struct evbuffer *output;
   2847 
   2848 	if (evcon == NULL)
   2849 		return;
   2850 
   2851 	output = bufferevent_get_output(evcon->bufev);
   2852 
   2853 	if (evbuffer_get_length(databuf) == 0)
   2854 		return;
   2855 	if (!evhttp_response_needs_body(req))
   2856 		return;
   2857 	if (req->chunked) {
   2858 		evbuffer_add_printf(output, "%x\r\n",
   2859 				    (unsigned)evbuffer_get_length(databuf));
   2860 	}
   2861 	evbuffer_add_buffer(output, databuf);
   2862 	if (req->chunked) {
   2863 		evbuffer_add(output, "\r\n", 2);
   2864 	}
   2865 	evhttp_write_buffer(evcon, cb, arg);
   2866 }
   2867 
   2868 void
   2869 evhttp_send_reply_chunk(struct evhttp_request *req, struct evbuffer *databuf)
   2870 {
   2871 	evhttp_send_reply_chunk_with_cb(req, databuf, NULL, NULL);
   2872 }
   2873 void
   2874 evhttp_send_reply_end(struct evhttp_request *req)
   2875 {
   2876 	struct evhttp_connection *evcon = req->evcon;
   2877 	struct evbuffer *output;
   2878 
   2879 	if (evcon == NULL) {
   2880 		evhttp_request_free(req);
   2881 		return;
   2882 	}
   2883 
   2884 	output = bufferevent_get_output(evcon->bufev);
   2885 
   2886 	/* we expect no more calls form the user on this request */
   2887 	req->userdone = 1;
   2888 
   2889 	if (req->chunked) {
   2890 		evbuffer_add(output, "0\r\n\r\n", 5);
   2891 		evhttp_write_buffer(req->evcon, evhttp_send_done, NULL);
   2892 		req->chunked = 0;
   2893 	} else if (evbuffer_get_length(output) == 0) {
   2894 		/* let the connection know that we are done with the request */
   2895 		evhttp_send_done(evcon, NULL);
   2896 	} else {
   2897 		/* make the callback execute after all data has been written */
   2898 		evcon->cb = evhttp_send_done;
   2899 		evcon->cb_arg = NULL;
   2900 	}
   2901 }
   2902 
   2903 static const char *informational_phrases[] = {
   2904 	/* 100 */ "Continue",
   2905 	/* 101 */ "Switching Protocols"
   2906 };
   2907 
   2908 static const char *success_phrases[] = {
   2909 	/* 200 */ "OK",
   2910 	/* 201 */ "Created",
   2911 	/* 202 */ "Accepted",
   2912 	/* 203 */ "Non-Authoritative Information",
   2913 	/* 204 */ "No Content",
   2914 	/* 205 */ "Reset Content",
   2915 	/* 206 */ "Partial Content"
   2916 };
   2917 
   2918 static const char *redirection_phrases[] = {
   2919 	/* 300 */ "Multiple Choices",
   2920 	/* 301 */ "Moved Permanently",
   2921 	/* 302 */ "Found",
   2922 	/* 303 */ "See Other",
   2923 	/* 304 */ "Not Modified",
   2924 	/* 305 */ "Use Proxy",
   2925 	/* 307 */ "Temporary Redirect"
   2926 };
   2927 
   2928 static const char *client_error_phrases[] = {
   2929 	/* 400 */ "Bad Request",
   2930 	/* 401 */ "Unauthorized",
   2931 	/* 402 */ "Payment Required",
   2932 	/* 403 */ "Forbidden",
   2933 	/* 404 */ "Not Found",
   2934 	/* 405 */ "Method Not Allowed",
   2935 	/* 406 */ "Not Acceptable",
   2936 	/* 407 */ "Proxy Authentication Required",
   2937 	/* 408 */ "Request Time-out",
   2938 	/* 409 */ "Conflict",
   2939 	/* 410 */ "Gone",
   2940 	/* 411 */ "Length Required",
   2941 	/* 412 */ "Precondition Failed",
   2942 	/* 413 */ "Request Entity Too Large",
   2943 	/* 414 */ "Request-URI Too Large",
   2944 	/* 415 */ "Unsupported Media Type",
   2945 	/* 416 */ "Requested range not satisfiable",
   2946 	/* 417 */ "Expectation Failed"
   2947 };
   2948 
   2949 static const char *server_error_phrases[] = {
   2950 	/* 500 */ "Internal Server Error",
   2951 	/* 501 */ "Not Implemented",
   2952 	/* 502 */ "Bad Gateway",
   2953 	/* 503 */ "Service Unavailable",
   2954 	/* 504 */ "Gateway Time-out",
   2955 	/* 505 */ "HTTP Version not supported"
   2956 };
   2957 
   2958 struct response_class {
   2959 	const char *name;
   2960 	size_t num_responses;
   2961 	const char **responses;
   2962 };
   2963 
   2964 #ifndef MEMBERSOF
   2965 #define MEMBERSOF(x) (sizeof(x)/sizeof(x[0]))
   2966 #endif
   2967 
   2968 static const struct response_class response_classes[] = {
   2969 	/* 1xx */ { "Informational", MEMBERSOF(informational_phrases), informational_phrases },
   2970 	/* 2xx */ { "Success", MEMBERSOF(success_phrases), success_phrases },
   2971 	/* 3xx */ { "Redirection", MEMBERSOF(redirection_phrases), redirection_phrases },
   2972 	/* 4xx */ { "Client Error", MEMBERSOF(client_error_phrases), client_error_phrases },
   2973 	/* 5xx */ { "Server Error", MEMBERSOF(server_error_phrases), server_error_phrases }
   2974 };
   2975 
   2976 static const char *
   2977 evhttp_response_phrase_internal(int code)
   2978 {
   2979 	int klass = code / 100 - 1;
   2980 	int subcode = code % 100;
   2981 
   2982 	/* Unknown class - can't do any better here */
   2983 	if (klass < 0 || klass >= (int) MEMBERSOF(response_classes))
   2984 		return "Unknown Status Class";
   2985 
   2986 	/* Unknown sub-code, return class name at least */
   2987 	if (subcode >= (int) response_classes[klass].num_responses)
   2988 		return response_classes[klass].name;
   2989 
   2990 	return response_classes[klass].responses[subcode];
   2991 }
   2992 
   2993 void
   2994 evhttp_response_code_(struct evhttp_request *req, int code, const char *reason)
   2995 {
   2996 	req->kind = EVHTTP_RESPONSE;
   2997 	req->response_code = code;
   2998 	if (req->response_code_line != NULL)
   2999 		mm_free(req->response_code_line);
   3000 	if (reason == NULL)
   3001 		reason = evhttp_response_phrase_internal(code);
   3002 	req->response_code_line = mm_strdup(reason);
   3003 	if (req->response_code_line == NULL) {
   3004 		event_warn("%s: strdup", __func__);
   3005 		/* XXX what else can we do? */
   3006 	}
   3007 }
   3008 
   3009 void
   3010 evhttp_send_page_(struct evhttp_request *req, struct evbuffer *databuf)
   3011 {
   3012 	if (!req->major || !req->minor) {
   3013 		req->major = 1;
   3014 		req->minor = 1;
   3015 	}
   3016 
   3017 	if (req->kind != EVHTTP_RESPONSE)
   3018 		evhttp_response_code_(req, 200, "OK");
   3019 
   3020 	evhttp_clear_headers(req->output_headers);
   3021 	evhttp_add_header(req->output_headers, "Content-Type", "text/html");
   3022 	evhttp_add_header(req->output_headers, "Connection", "close");
   3023 
   3024 	evhttp_send(req, databuf);
   3025 }
   3026 
   3027 static const char uri_chars[256] = {
   3028 	/* 0 */
   3029 	0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
   3030 	0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
   3031 	0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 1, 1, 0,
   3032 	1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 0, 0, 0, 0, 0, 0,
   3033 	/* 64 */
   3034 	0, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
   3035 	1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 0, 0, 0, 0, 1,
   3036 	0, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
   3037 	1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 0, 0, 0, 1, 0,
   3038 	/* 128 */
   3039 	0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
   3040 	0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
   3041 	0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
   3042 	0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
   3043 	/* 192 */
   3044 	0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
   3045 	0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
   3046 	0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
   3047 	0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
   3048 };
   3049 
   3050 #define CHAR_IS_UNRESERVED(c)			\
   3051 	(uri_chars[(unsigned char)(c)])
   3052 
   3053 /*
   3054  * Helper functions to encode/decode a string for inclusion in a URI.
   3055  * The returned string must be freed by the caller.
   3056  */
   3057 char *
   3058 evhttp_uriencode(const char *uri, ev_ssize_t len, int space_as_plus)
   3059 {
   3060 	struct evbuffer *buf = evbuffer_new();
   3061 	const char *p, *end;
   3062 	char *result;
   3063 
   3064 	if (buf == NULL) {
   3065 		return (NULL);
   3066 	}
   3067 
   3068 
   3069 	if (len >= 0) {
   3070 		if (uri + len < uri) {
   3071 			return (NULL);
   3072 		}
   3073 
   3074 		end = uri + len;
   3075 	} else {
   3076 		size_t slen = strlen(uri);
   3077 
   3078 		if (slen >= EV_SSIZE_MAX) {
   3079 			/* we don't want to mix signed and unsigned */
   3080 			return (NULL);
   3081 		}
   3082 
   3083 		if (uri + slen < uri) {
   3084 			return (NULL);
   3085 		}
   3086 
   3087 		end = uri + slen;
   3088 	}
   3089 
   3090 	for (p = uri; p < end; p++) {
   3091 		if (CHAR_IS_UNRESERVED(*p)) {
   3092 			evbuffer_add(buf, p, 1);
   3093 		} else if (*p == ' ' && space_as_plus) {
   3094 			evbuffer_add(buf, "+", 1);
   3095 		} else {
   3096 			evbuffer_add_printf(buf, "%%%02X", (unsigned char)(*p));
   3097 		}
   3098 	}
   3099 
   3100 	evbuffer_add(buf, "", 1); /* NUL-terminator. */
   3101 	result = mm_malloc(evbuffer_get_length(buf));
   3102 
   3103 	if (result)
   3104 		evbuffer_remove(buf, result, evbuffer_get_length(buf));
   3105 
   3106 	evbuffer_free(buf);
   3107 
   3108 	return (result);
   3109 }
   3110 
   3111 char *
   3112 evhttp_encode_uri(const char *str)
   3113 {
   3114 	return evhttp_uriencode(str, -1, 0);
   3115 }
   3116 
   3117 /*
   3118  * @param decode_plus_ctl: if 1, we decode plus into space.  If 0, we don't.
   3119  *     If -1, when true we transform plus to space only after we've seen
   3120  *     a ?.  -1 is deprecated.
   3121  * @return the number of bytes written to 'ret'.
   3122  */
   3123 int
   3124 evhttp_decode_uri_internal(
   3125 	const char *uri, size_t length, char *ret, int decode_plus_ctl)
   3126 {
   3127 	char c;
   3128 	int j;
   3129 	int decode_plus = (decode_plus_ctl == 1) ? 1: 0;
   3130 	unsigned i;
   3131 
   3132 	for (i = j = 0; i < length; i++) {
   3133 		c = uri[i];
   3134 		if (c == '?') {
   3135 			if (decode_plus_ctl < 0)
   3136 				decode_plus = 1;
   3137 		} else if (c == '+' && decode_plus) {
   3138 			c = ' ';
   3139 		} else if ((i + 2) < length && c == '%' &&
   3140 			EVUTIL_ISXDIGIT_(uri[i+1]) && EVUTIL_ISXDIGIT_(uri[i+2])) {
   3141 			char tmp[3];
   3142 			tmp[0] = uri[i+1];
   3143 			tmp[1] = uri[i+2];
   3144 			tmp[2] = '\0';
   3145 			c = (char)strtol(tmp, NULL, 16);
   3146 			i += 2;
   3147 		}
   3148 		ret[j++] = c;
   3149 	}
   3150 	ret[j] = '\0';
   3151 
   3152 	return (j);
   3153 }
   3154 
   3155 /* deprecated */
   3156 char *
   3157 evhttp_decode_uri(const char *uri)
   3158 {
   3159 	char *ret;
   3160 
   3161 	if ((ret = mm_malloc(strlen(uri) + 1)) == NULL) {
   3162 		event_warn("%s: malloc(%lu)", __func__,
   3163 			  (unsigned long)(strlen(uri) + 1));
   3164 		return (NULL);
   3165 	}
   3166 
   3167 	evhttp_decode_uri_internal(uri, strlen(uri),
   3168 	    ret, -1 /*always_decode_plus*/);
   3169 
   3170 	return (ret);
   3171 }
   3172 
   3173 char *
   3174 evhttp_uridecode(const char *uri, int decode_plus, size_t *size_out)
   3175 {
   3176 	char *ret;
   3177 	int n;
   3178 
   3179 	if ((ret = mm_malloc(strlen(uri) + 1)) == NULL) {
   3180 		event_warn("%s: malloc(%lu)", __func__,
   3181 			  (unsigned long)(strlen(uri) + 1));
   3182 		return (NULL);
   3183 	}
   3184 
   3185 	n = evhttp_decode_uri_internal(uri, strlen(uri),
   3186 	    ret, !!decode_plus/*always_decode_plus*/);
   3187 
   3188 	if (size_out) {
   3189 		EVUTIL_ASSERT(n >= 0);
   3190 		*size_out = (size_t)n;
   3191 	}
   3192 
   3193 	return (ret);
   3194 }
   3195 
   3196 /*
   3197  * Helper function to parse out arguments in a query.
   3198  * The arguments are separated by key and value.
   3199  */
   3200 
   3201 static int
   3202 evhttp_parse_query_impl(const char *str, struct evkeyvalq *headers,
   3203     int is_whole_uri)
   3204 {
   3205 	char *line=NULL;
   3206 	char *argument;
   3207 	char *p;
   3208 	const char *query_part;
   3209 	int result = -1;
   3210 	struct evhttp_uri *uri=NULL;
   3211 
   3212 	TAILQ_INIT(headers);
   3213 
   3214 	if (is_whole_uri) {
   3215 		uri = evhttp_uri_parse(str);
   3216 		if (!uri)
   3217 			goto error;
   3218 		query_part = evhttp_uri_get_query(uri);
   3219 	} else {
   3220 		query_part = str;
   3221 	}
   3222 
   3223 	/* No arguments - we are done */
   3224 	if (!query_part || !strlen(query_part)) {
   3225 		result = 0;
   3226 		goto done;
   3227 	}
   3228 
   3229 	if ((line = mm_strdup(query_part)) == NULL) {
   3230 		event_warn("%s: strdup", __func__);
   3231 		goto error;
   3232 	}
   3233 
   3234 	p = argument = line;
   3235 	while (p != NULL && *p != '\0') {
   3236 		char *key, *value, *decoded_value;
   3237 		argument = strsep(&p, "&");
   3238 
   3239 		value = argument;
   3240 		key = strsep(&value, "=");
   3241 		if (value == NULL || *key == '\0') {
   3242 			goto error;
   3243 		}
   3244 
   3245 		if ((decoded_value = mm_malloc(strlen(value) + 1)) == NULL) {
   3246 			event_warn("%s: mm_malloc", __func__);
   3247 			goto error;
   3248 		}
   3249 		evhttp_decode_uri_internal(value, strlen(value),
   3250 		    decoded_value, 1 /*always_decode_plus*/);
   3251 		event_debug(("Query Param: %s -> %s\n", key, decoded_value));
   3252 		evhttp_add_header_internal(headers, key, decoded_value);
   3253 		mm_free(decoded_value);
   3254 	}
   3255 
   3256 	result = 0;
   3257 	goto done;
   3258 error:
   3259 	evhttp_clear_headers(headers);
   3260 done:
   3261 	if (line)
   3262 		mm_free(line);
   3263 	if (uri)
   3264 		evhttp_uri_free(uri);
   3265 	return result;
   3266 }
   3267 
   3268 int
   3269 evhttp_parse_query(const char *uri, struct evkeyvalq *headers)
   3270 {
   3271 	return evhttp_parse_query_impl(uri, headers, 1);
   3272 }
   3273 int
   3274 evhttp_parse_query_str(const char *uri, struct evkeyvalq *headers)
   3275 {
   3276 	return evhttp_parse_query_impl(uri, headers, 0);
   3277 }
   3278 
   3279 static struct evhttp_cb *
   3280 evhttp_dispatch_callback(struct httpcbq *callbacks, struct evhttp_request *req)
   3281 {
   3282 	struct evhttp_cb *cb;
   3283 	size_t offset = 0;
   3284 	char *translated;
   3285 	const char *path;
   3286 
   3287 	/* Test for different URLs */
   3288 	path = evhttp_uri_get_path(req->uri_elems);
   3289 	offset = strlen(path);
   3290 	if ((translated = mm_malloc(offset + 1)) == NULL)
   3291 		return (NULL);
   3292 	evhttp_decode_uri_internal(path, offset, translated,
   3293 	    0 /* decode_plus */);
   3294 
   3295 	TAILQ_FOREACH(cb, callbacks, next) {
   3296 		if (!strcmp(cb->what, translated)) {
   3297 			mm_free(translated);
   3298 			return (cb);
   3299 		}
   3300 	}
   3301 
   3302 	mm_free(translated);
   3303 	return (NULL);
   3304 }
   3305 
   3306 
   3307 static int
   3308 prefix_suffix_match(const char *pattern, const char *name, int ignorecase)
   3309 {
   3310 	char c;
   3311 
   3312 	while (1) {
   3313 		switch (c = *pattern++) {
   3314 		case '\0':
   3315 			return *name == '\0';
   3316 
   3317 		case '*':
   3318 			while (*name != '\0') {
   3319 				if (prefix_suffix_match(pattern, name,
   3320 					ignorecase))
   3321 					return (1);
   3322 				++name;
   3323 			}
   3324 			return (0);
   3325 		default:
   3326 			if (c != *name) {
   3327 				if (!ignorecase ||
   3328 				    EVUTIL_TOLOWER_(c) != EVUTIL_TOLOWER_(*name))
   3329 					return (0);
   3330 			}
   3331 			++name;
   3332 		}
   3333 	}
   3334 	/* NOTREACHED */
   3335 }
   3336 
   3337 /*
   3338    Search the vhost hierarchy beginning with http for a server alias
   3339    matching hostname.  If a match is found, and outhttp is non-null,
   3340    outhttp is set to the matching http object and 1 is returned.
   3341 */
   3342 
   3343 static int
   3344 evhttp_find_alias(struct evhttp *http, struct evhttp **outhttp,
   3345 		  const char *hostname)
   3346 {
   3347 	struct evhttp_server_alias *alias;
   3348 	struct evhttp *vhost;
   3349 
   3350 	TAILQ_FOREACH(alias, &http->aliases, next) {
   3351 		/* XXX Do we need to handle IP addresses? */
   3352 		if (!evutil_ascii_strcasecmp(alias->alias, hostname)) {
   3353 			if (outhttp)
   3354 				*outhttp = http;
   3355 			return 1;
   3356 		}
   3357 	}
   3358 
   3359 	/* XXX It might be good to avoid recursion here, but I don't
   3360 	   see a way to do that w/o a list. */
   3361 	TAILQ_FOREACH(vhost, &http->virtualhosts, next_vhost) {
   3362 		if (evhttp_find_alias(vhost, outhttp, hostname))
   3363 			return 1;
   3364 	}
   3365 
   3366 	return 0;
   3367 }
   3368 
   3369 /*
   3370    Attempts to find the best http object to handle a request for a hostname.
   3371    All aliases for the root http object and vhosts are searched for an exact
   3372    match. Then, the vhost hierarchy is traversed again for a matching
   3373    pattern.
   3374 
   3375    If an alias or vhost is matched, 1 is returned, and outhttp, if non-null,
   3376    is set with the best matching http object. If there are no matches, the
   3377    root http object is stored in outhttp and 0 is returned.
   3378 */
   3379 
   3380 static int
   3381 evhttp_find_vhost(struct evhttp *http, struct evhttp **outhttp,
   3382 		  const char *hostname)
   3383 {
   3384 	struct evhttp *vhost;
   3385 	struct evhttp *oldhttp;
   3386 	int match_found = 0;
   3387 
   3388 	if (evhttp_find_alias(http, outhttp, hostname))
   3389 		return 1;
   3390 
   3391 	do {
   3392 		oldhttp = http;
   3393 		TAILQ_FOREACH(vhost, &http->virtualhosts, next_vhost) {
   3394 			if (prefix_suffix_match(vhost->vhost_pattern,
   3395 				hostname, 1 /* ignorecase */)) {
   3396 				http = vhost;
   3397 				match_found = 1;
   3398 				break;
   3399 			}
   3400 		}
   3401 	} while (oldhttp != http);
   3402 
   3403 	if (outhttp)
   3404 		*outhttp = http;
   3405 
   3406 	return match_found;
   3407 }
   3408 
   3409 static void
   3410 evhttp_handle_request(struct evhttp_request *req, void *arg)
   3411 {
   3412 	struct evhttp *http = arg;
   3413 	struct evhttp_cb *cb = NULL;
   3414 	const char *hostname;
   3415 
   3416 	/* we have a new request on which the user needs to take action */
   3417 	req->userdone = 0;
   3418 
   3419 	if (req->type == 0 || req->uri == NULL) {
   3420 		evhttp_send_error(req, req->response_code, NULL);
   3421 		return;
   3422 	}
   3423 
   3424 	if ((http->allowed_methods & req->type) == 0) {
   3425 		event_debug(("Rejecting disallowed method %x (allowed: %x)\n",
   3426 			(unsigned)req->type, (unsigned)http->allowed_methods));
   3427 		evhttp_send_error(req, HTTP_NOTIMPLEMENTED, NULL);
   3428 		return;
   3429 	}
   3430 
   3431 	/* handle potential virtual hosts */
   3432 	hostname = evhttp_request_get_host(req);
   3433 	if (hostname != NULL) {
   3434 		evhttp_find_vhost(http, &http, hostname);
   3435 	}
   3436 
   3437 	if ((cb = evhttp_dispatch_callback(&http->callbacks, req)) != NULL) {
   3438 		(*cb->cb)(req, cb->cbarg);
   3439 		return;
   3440 	}
   3441 
   3442 	/* Generic call back */
   3443 	if (http->gencb) {
   3444 		(*http->gencb)(req, http->gencbarg);
   3445 		return;
   3446 	} else {
   3447 		/* We need to send a 404 here */
   3448 #define ERR_FORMAT "<html><head>" \
   3449 		    "<title>404 Not Found</title>" \
   3450 		    "</head><body>" \
   3451 		    "<h1>Not Found</h1>" \
   3452 		    "<p>The requested URL %s was not found on this server.</p>"\
   3453 		    "</body></html>\n"
   3454 
   3455 		char *escaped_html;
   3456 		struct evbuffer *buf;
   3457 
   3458 		if ((escaped_html = evhttp_htmlescape(req->uri)) == NULL) {
   3459 			evhttp_connection_free(req->evcon);
   3460 			return;
   3461 		}
   3462 
   3463 		if ((buf = evbuffer_new()) == NULL) {
   3464 			mm_free(escaped_html);
   3465 			evhttp_connection_free(req->evcon);
   3466 			return;
   3467 		}
   3468 
   3469 		evhttp_response_code_(req, HTTP_NOTFOUND, "Not Found");
   3470 
   3471 		evbuffer_add_printf(buf, ERR_FORMAT, escaped_html);
   3472 
   3473 		mm_free(escaped_html);
   3474 
   3475 		evhttp_send_page_(req, buf);
   3476 
   3477 		evbuffer_free(buf);
   3478 #undef ERR_FORMAT
   3479 	}
   3480 }
   3481 
   3482 /* Listener callback when a connection arrives at a server. */
   3483 static void
   3484 accept_socket_cb(struct evconnlistener *listener, evutil_socket_t nfd, struct sockaddr *peer_sa, int peer_socklen, void *arg)
   3485 {
   3486 	struct evhttp *http = arg;
   3487 
   3488 	evhttp_get_request(http, nfd, peer_sa, peer_socklen);
   3489 }
   3490 
   3491 int
   3492 evhttp_bind_socket(struct evhttp *http, const char *address, ev_uint16_t port)
   3493 {
   3494 	struct evhttp_bound_socket *bound =
   3495 		evhttp_bind_socket_with_handle(http, address, port);
   3496 	if (bound == NULL)
   3497 		return (-1);
   3498 	return (0);
   3499 }
   3500 
   3501 struct evhttp_bound_socket *
   3502 evhttp_bind_socket_with_handle(struct evhttp *http, const char *address, ev_uint16_t port)
   3503 {
   3504 	evutil_socket_t fd;
   3505 	struct evhttp_bound_socket *bound;
   3506 
   3507 	if ((fd = bind_socket(address, port, 1 /*reuse*/)) == -1)
   3508 		return (NULL);
   3509 
   3510 	if (listen(fd, 128) == -1) {
   3511 		event_sock_warn(fd, "%s: listen", __func__);
   3512 		evutil_closesocket(fd);
   3513 		return (NULL);
   3514 	}
   3515 
   3516 	bound = evhttp_accept_socket_with_handle(http, fd);
   3517 
   3518 	if (bound != NULL) {
   3519 		event_debug(("Bound to port %d - Awaiting connections ... ",
   3520 			port));
   3521 		return (bound);
   3522 	}
   3523 
   3524 	return (NULL);
   3525 }
   3526 
   3527 int
   3528 evhttp_accept_socket(struct evhttp *http, evutil_socket_t fd)
   3529 {
   3530 	struct evhttp_bound_socket *bound =
   3531 		evhttp_accept_socket_with_handle(http, fd);
   3532 	if (bound == NULL)
   3533 		return (-1);
   3534 	return (0);
   3535 }
   3536 
   3537 void
   3538 evhttp_foreach_bound_socket(struct evhttp *http,
   3539                             evhttp_bound_socket_foreach_fn *function,
   3540                             void *argument)
   3541 {
   3542 	struct evhttp_bound_socket *bound;
   3543 
   3544 	TAILQ_FOREACH(bound, &http->sockets, next)
   3545 		function(bound, argument);
   3546 }
   3547 
   3548 struct evhttp_bound_socket *
   3549 evhttp_accept_socket_with_handle(struct evhttp *http, evutil_socket_t fd)
   3550 {
   3551 	struct evhttp_bound_socket *bound;
   3552 	struct evconnlistener *listener;
   3553 	const int flags =
   3554 	    LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_EXEC|LEV_OPT_CLOSE_ON_FREE;
   3555 
   3556 	listener = evconnlistener_new(http->base, NULL, NULL,
   3557 	    flags,
   3558 	    0, /* Backlog is '0' because we already said 'listen' */
   3559 	    fd);
   3560 	if (!listener)
   3561 		return (NULL);
   3562 
   3563 	bound = evhttp_bind_listener(http, listener);
   3564 	if (!bound) {
   3565 		evconnlistener_free(listener);
   3566 		return (NULL);
   3567 	}
   3568 	return (bound);
   3569 }
   3570 
   3571 struct evhttp_bound_socket *
   3572 evhttp_bind_listener(struct evhttp *http, struct evconnlistener *listener)
   3573 {
   3574 	struct evhttp_bound_socket *bound;
   3575 
   3576 	bound = mm_malloc(sizeof(struct evhttp_bound_socket));
   3577 	if (bound == NULL)
   3578 		return (NULL);
   3579 
   3580 	bound->listener = listener;
   3581 	TAILQ_INSERT_TAIL(&http->sockets, bound, next);
   3582 
   3583 	evconnlistener_set_cb(listener, accept_socket_cb, http);
   3584 	return bound;
   3585 }
   3586 
   3587 evutil_socket_t
   3588 evhttp_bound_socket_get_fd(struct evhttp_bound_socket *bound)
   3589 {
   3590 	return evconnlistener_get_fd(bound->listener);
   3591 }
   3592 
   3593 struct evconnlistener *
   3594 evhttp_bound_socket_get_listener(struct evhttp_bound_socket *bound)
   3595 {
   3596 	return bound->listener;
   3597 }
   3598 
   3599 void
   3600 evhttp_del_accept_socket(struct evhttp *http, struct evhttp_bound_socket *bound)
   3601 {
   3602 	TAILQ_REMOVE(&http->sockets, bound, next);
   3603 	evconnlistener_free(bound->listener);
   3604 	mm_free(bound);
   3605 }
   3606 
   3607 static struct evhttp*
   3608 evhttp_new_object(void)
   3609 {
   3610 	struct evhttp *http = NULL;
   3611 
   3612 	if ((http = mm_calloc(1, sizeof(struct evhttp))) == NULL) {
   3613 		event_warn("%s: calloc", __func__);
   3614 		return (NULL);
   3615 	}
   3616 
   3617 	evutil_timerclear(&http->timeout);
   3618 	evhttp_set_max_headers_size(http, EV_SIZE_MAX);
   3619 	evhttp_set_max_body_size(http, EV_SIZE_MAX);
   3620 	evhttp_set_default_content_type(http, "text/html; charset=ISO-8859-1");
   3621 	evhttp_set_allowed_methods(http,
   3622 	    EVHTTP_REQ_GET |
   3623 	    EVHTTP_REQ_POST |
   3624 	    EVHTTP_REQ_HEAD |
   3625 	    EVHTTP_REQ_PUT |
   3626 	    EVHTTP_REQ_DELETE);
   3627 
   3628 	TAILQ_INIT(&http->sockets);
   3629 	TAILQ_INIT(&http->callbacks);
   3630 	TAILQ_INIT(&http->connections);
   3631 	TAILQ_INIT(&http->virtualhosts);
   3632 	TAILQ_INIT(&http->aliases);
   3633 
   3634 	return (http);
   3635 }
   3636 
   3637 struct evhttp *
   3638 evhttp_new(struct event_base *base)
   3639 {
   3640 	struct evhttp *http = NULL;
   3641 
   3642 	http = evhttp_new_object();
   3643 	if (http == NULL)
   3644 		return (NULL);
   3645 	http->base = base;
   3646 
   3647 	return (http);
   3648 }
   3649 
   3650 /*
   3651  * Start a web server on the specified address and port.
   3652  */
   3653 
   3654 struct evhttp *
   3655 evhttp_start(const char *address, ev_uint16_t port)
   3656 {
   3657 	struct evhttp *http = NULL;
   3658 
   3659 	http = evhttp_new_object();
   3660 	if (http == NULL)
   3661 		return (NULL);
   3662 	if (evhttp_bind_socket(http, address, port) == -1) {
   3663 		mm_free(http);
   3664 		return (NULL);
   3665 	}
   3666 
   3667 	return (http);
   3668 }
   3669 
   3670 void
   3671 evhttp_free(struct evhttp* http)
   3672 {
   3673 	struct evhttp_cb *http_cb;
   3674 	struct evhttp_connection *evcon;
   3675 	struct evhttp_bound_socket *bound;
   3676 	struct evhttp* vhost;
   3677 	struct evhttp_server_alias *alias;
   3678 
   3679 	/* Remove the accepting part */
   3680 	while ((bound = TAILQ_FIRST(&http->sockets)) != NULL) {
   3681 		TAILQ_REMOVE(&http->sockets, bound, next);
   3682 
   3683 		evconnlistener_free(bound->listener);
   3684 
   3685 		mm_free(bound);
   3686 	}
   3687 
   3688 	while ((evcon = TAILQ_FIRST(&http->connections)) != NULL) {
   3689 		/* evhttp_connection_free removes the connection */
   3690 		evhttp_connection_free(evcon);
   3691 	}
   3692 
   3693 	while ((http_cb = TAILQ_FIRST(&http->callbacks)) != NULL) {
   3694 		TAILQ_REMOVE(&http->callbacks, http_cb, next);
   3695 		mm_free(http_cb->what);
   3696 		mm_free(http_cb);
   3697 	}
   3698 
   3699 	while ((vhost = TAILQ_FIRST(&http->virtualhosts)) != NULL) {
   3700 		TAILQ_REMOVE(&http->virtualhosts, vhost, next_vhost);
   3701 
   3702 		evhttp_free(vhost);
   3703 	}
   3704 
   3705 	if (http->vhost_pattern != NULL)
   3706 		mm_free(http->vhost_pattern);
   3707 
   3708 	while ((alias = TAILQ_FIRST(&http->aliases)) != NULL) {
   3709 		TAILQ_REMOVE(&http->aliases, alias, next);
   3710 		mm_free(alias->alias);
   3711 		mm_free(alias);
   3712 	}
   3713 
   3714 	mm_free(http);
   3715 }
   3716 
   3717 int
   3718 evhttp_add_virtual_host(struct evhttp* http, const char *pattern,
   3719     struct evhttp* vhost)
   3720 {
   3721 	/* a vhost can only be a vhost once and should not have bound sockets */
   3722 	if (vhost->vhost_pattern != NULL ||
   3723 	    TAILQ_FIRST(&vhost->sockets) != NULL)
   3724 		return (-1);
   3725 
   3726 	vhost->vhost_pattern = mm_strdup(pattern);
   3727 	if (vhost->vhost_pattern == NULL)
   3728 		return (-1);
   3729 
   3730 	TAILQ_INSERT_TAIL(&http->virtualhosts, vhost, next_vhost);
   3731 
   3732 	return (0);
   3733 }
   3734 
   3735 int
   3736 evhttp_remove_virtual_host(struct evhttp* http, struct evhttp* vhost)
   3737 {
   3738 	if (vhost->vhost_pattern == NULL)
   3739 		return (-1);
   3740 
   3741 	TAILQ_REMOVE(&http->virtualhosts, vhost, next_vhost);
   3742 
   3743 	mm_free(vhost->vhost_pattern);
   3744 	vhost->vhost_pattern = NULL;
   3745 
   3746 	return (0);
   3747 }
   3748 
   3749 int
   3750 evhttp_add_server_alias(struct evhttp *http, const char *alias)
   3751 {
   3752 	struct evhttp_server_alias *evalias;
   3753 
   3754 	evalias = mm_calloc(1, sizeof(*evalias));
   3755 	if (!evalias)
   3756 		return -1;
   3757 
   3758 	evalias->alias = mm_strdup(alias);
   3759 	if (!evalias->alias) {
   3760 		mm_free(evalias);
   3761 		return -1;
   3762 	}
   3763 
   3764 	TAILQ_INSERT_TAIL(&http->aliases, evalias, next);
   3765 
   3766 	return 0;
   3767 }
   3768 
   3769 int
   3770 evhttp_remove_server_alias(struct evhttp *http, const char *alias)
   3771 {
   3772 	struct evhttp_server_alias *evalias;
   3773 
   3774 	TAILQ_FOREACH(evalias, &http->aliases, next) {
   3775 		if (evutil_ascii_strcasecmp(evalias->alias, alias) == 0) {
   3776 			TAILQ_REMOVE(&http->aliases, evalias, next);
   3777 			mm_free(evalias->alias);
   3778 			mm_free(evalias);
   3779 			return 0;
   3780 		}
   3781 	}
   3782 
   3783 	return -1;
   3784 }
   3785 
   3786 void
   3787 evhttp_set_timeout(struct evhttp* http, int timeout_in_secs)
   3788 {
   3789 	if (timeout_in_secs == -1) {
   3790 		evhttp_set_timeout_tv(http, NULL);
   3791 	} else {
   3792 		struct timeval tv;
   3793 		tv.tv_sec = timeout_in_secs;
   3794 		tv.tv_usec = 0;
   3795 		evhttp_set_timeout_tv(http, &tv);
   3796 	}
   3797 }
   3798 
   3799 void
   3800 evhttp_set_timeout_tv(struct evhttp* http, const struct timeval* tv)
   3801 {
   3802 	if (tv) {
   3803 		http->timeout = *tv;
   3804 	} else {
   3805 		evutil_timerclear(&http->timeout);
   3806 	}
   3807 }
   3808 
   3809 int evhttp_set_flags(struct evhttp *http, int flags)
   3810 {
   3811 	int avail_flags = 0;
   3812 	avail_flags |= EVHTTP_SERVER_LINGERING_CLOSE;
   3813 
   3814 	if (flags & ~avail_flags)
   3815 		return 1;
   3816 	http->flags &= ~avail_flags;
   3817 
   3818 	http->flags |= flags;
   3819 
   3820 	return 0;
   3821 }
   3822 
   3823 void
   3824 evhttp_set_max_headers_size(struct evhttp* http, ev_ssize_t max_headers_size)
   3825 {
   3826 	if (max_headers_size < 0)
   3827 		http->default_max_headers_size = EV_SIZE_MAX;
   3828 	else
   3829 		http->default_max_headers_size = max_headers_size;
   3830 }
   3831 
   3832 void
   3833 evhttp_set_max_body_size(struct evhttp* http, ev_ssize_t max_body_size)
   3834 {
   3835 	if (max_body_size < 0)
   3836 		http->default_max_body_size = EV_UINT64_MAX;
   3837 	else
   3838 		http->default_max_body_size = max_body_size;
   3839 }
   3840 
   3841 void
   3842 evhttp_set_default_content_type(struct evhttp *http,
   3843 	const char *content_type) {
   3844 	http->default_content_type = content_type;
   3845 }
   3846 
   3847 void
   3848 evhttp_set_allowed_methods(struct evhttp* http, ev_uint16_t methods)
   3849 {
   3850 	http->allowed_methods = methods;
   3851 }
   3852 
   3853 int
   3854 evhttp_set_cb(struct evhttp *http, const char *uri,
   3855     void (*cb)(struct evhttp_request *, void *), void *cbarg)
   3856 {
   3857 	struct evhttp_cb *http_cb;
   3858 
   3859 	TAILQ_FOREACH(http_cb, &http->callbacks, next) {
   3860 		if (strcmp(http_cb->what, uri) == 0)
   3861 			return (-1);
   3862 	}
   3863 
   3864 	if ((http_cb = mm_calloc(1, sizeof(struct evhttp_cb))) == NULL) {
   3865 		event_warn("%s: calloc", __func__);
   3866 		return (-2);
   3867 	}
   3868 
   3869 	http_cb->what = mm_strdup(uri);
   3870 	if (http_cb->what == NULL) {
   3871 		event_warn("%s: strdup", __func__);
   3872 		mm_free(http_cb);
   3873 		return (-3);
   3874 	}
   3875 	http_cb->cb = cb;
   3876 	http_cb->cbarg = cbarg;
   3877 
   3878 	TAILQ_INSERT_TAIL(&http->callbacks, http_cb, next);
   3879 
   3880 	return (0);
   3881 }
   3882 
   3883 int
   3884 evhttp_del_cb(struct evhttp *http, const char *uri)
   3885 {
   3886 	struct evhttp_cb *http_cb;
   3887 
   3888 	TAILQ_FOREACH(http_cb, &http->callbacks, next) {
   3889 		if (strcmp(http_cb->what, uri) == 0)
   3890 			break;
   3891 	}
   3892 	if (http_cb == NULL)
   3893 		return (-1);
   3894 
   3895 	TAILQ_REMOVE(&http->callbacks, http_cb, next);
   3896 	mm_free(http_cb->what);
   3897 	mm_free(http_cb);
   3898 
   3899 	return (0);
   3900 }
   3901 
   3902 void
   3903 evhttp_set_gencb(struct evhttp *http,
   3904     void (*cb)(struct evhttp_request *, void *), void *cbarg)
   3905 {
   3906 	http->gencb = cb;
   3907 	http->gencbarg = cbarg;
   3908 }
   3909 
   3910 void
   3911 evhttp_set_bevcb(struct evhttp *http,
   3912     struct bufferevent* (*cb)(struct event_base *, void *), void *cbarg)
   3913 {
   3914 	http->bevcb = cb;
   3915 	http->bevcbarg = cbarg;
   3916 }
   3917 
   3918 /*
   3919  * Request related functions
   3920  */
   3921 
   3922 struct evhttp_request *
   3923 evhttp_request_new(void (*cb)(struct evhttp_request *, void *), void *arg)
   3924 {
   3925 	struct evhttp_request *req = NULL;
   3926 
   3927 	/* Allocate request structure */
   3928 	if ((req = mm_calloc(1, sizeof(struct evhttp_request))) == NULL) {
   3929 		event_warn("%s: calloc", __func__);
   3930 		goto error;
   3931 	}
   3932 
   3933 	req->headers_size = 0;
   3934 	req->body_size = 0;
   3935 
   3936 	req->kind = EVHTTP_RESPONSE;
   3937 	req->input_headers = mm_calloc(1, sizeof(struct evkeyvalq));
   3938 	if (req->input_headers == NULL) {
   3939 		event_warn("%s: calloc", __func__);
   3940 		goto error;
   3941 	}
   3942 	TAILQ_INIT(req->input_headers);
   3943 
   3944 	req->output_headers = mm_calloc(1, sizeof(struct evkeyvalq));
   3945 	if (req->output_headers == NULL) {
   3946 		event_warn("%s: calloc", __func__);
   3947 		goto error;
   3948 	}
   3949 	TAILQ_INIT(req->output_headers);
   3950 
   3951 	if ((req->input_buffer = evbuffer_new()) == NULL) {
   3952 		event_warn("%s: evbuffer_new", __func__);
   3953 		goto error;
   3954 	}
   3955 
   3956 	if ((req->output_buffer = evbuffer_new()) == NULL) {
   3957 		event_warn("%s: evbuffer_new", __func__);
   3958 		goto error;
   3959 	}
   3960 
   3961 	req->cb = cb;
   3962 	req->cb_arg = arg;
   3963 
   3964 	return (req);
   3965 
   3966  error:
   3967 	if (req != NULL)
   3968 		evhttp_request_free(req);
   3969 	return (NULL);
   3970 }
   3971 
   3972 void
   3973 evhttp_request_free(struct evhttp_request *req)
   3974 {
   3975 	if ((req->flags & EVHTTP_REQ_DEFER_FREE) != 0) {
   3976 		req->flags |= EVHTTP_REQ_NEEDS_FREE;
   3977 		return;
   3978 	}
   3979 
   3980 	if (req->remote_host != NULL)
   3981 		mm_free(req->remote_host);
   3982 	if (req->uri != NULL)
   3983 		mm_free(req->uri);
   3984 	if (req->uri_elems != NULL)
   3985 		evhttp_uri_free(req->uri_elems);
   3986 	if (req->response_code_line != NULL)
   3987 		mm_free(req->response_code_line);
   3988 	if (req->host_cache != NULL)
   3989 		mm_free(req->host_cache);
   3990 
   3991 	evhttp_clear_headers(req->input_headers);
   3992 	mm_free(req->input_headers);
   3993 
   3994 	evhttp_clear_headers(req->output_headers);
   3995 	mm_free(req->output_headers);
   3996 
   3997 	if (req->input_buffer != NULL)
   3998 		evbuffer_free(req->input_buffer);
   3999 
   4000 	if (req->output_buffer != NULL)
   4001 		evbuffer_free(req->output_buffer);
   4002 
   4003 	mm_free(req);
   4004 }
   4005 
   4006 void
   4007 evhttp_request_own(struct evhttp_request *req)
   4008 {
   4009 	req->flags |= EVHTTP_USER_OWNED;
   4010 }
   4011 
   4012 int
   4013 evhttp_request_is_owned(struct evhttp_request *req)
   4014 {
   4015 	return (req->flags & EVHTTP_USER_OWNED) != 0;
   4016 }
   4017 
   4018 struct evhttp_connection *
   4019 evhttp_request_get_connection(struct evhttp_request *req)
   4020 {
   4021 	return req->evcon;
   4022 }
   4023 
   4024 struct event_base *
   4025 evhttp_connection_get_base(struct evhttp_connection *conn)
   4026 {
   4027 	return conn->base;
   4028 }
   4029 
   4030 void
   4031 evhttp_request_set_chunked_cb(struct evhttp_request *req,
   4032     void (*cb)(struct evhttp_request *, void *))
   4033 {
   4034 	req->chunk_cb = cb;
   4035 }
   4036 
   4037 void
   4038 evhttp_request_set_header_cb(struct evhttp_request *req,
   4039     int (*cb)(struct evhttp_request *, void *))
   4040 {
   4041 	req->header_cb = cb;
   4042 }
   4043 
   4044 void
   4045 evhttp_request_set_error_cb(struct evhttp_request *req,
   4046     void (*cb)(enum evhttp_request_error, void *))
   4047 {
   4048 	req->error_cb = cb;
   4049 }
   4050 
   4051 void
   4052 evhttp_request_set_on_complete_cb(struct evhttp_request *req,
   4053     void (*cb)(struct evhttp_request *, void *), void *cb_arg)
   4054 {
   4055 	req->on_complete_cb = cb;
   4056 	req->on_complete_cb_arg = cb_arg;
   4057 }
   4058 
   4059 /*
   4060  * Allows for inspection of the request URI
   4061  */
   4062 
   4063 const char *
   4064 evhttp_request_get_uri(const struct evhttp_request *req) {
   4065 	if (req->uri == NULL)
   4066 		event_debug(("%s: request %p has no uri\n", __func__, req));
   4067 	return (req->uri);
   4068 }
   4069 
   4070 const struct evhttp_uri *
   4071 evhttp_request_get_evhttp_uri(const struct evhttp_request *req) {
   4072 	if (req->uri_elems == NULL)
   4073 		event_debug(("%s: request %p has no uri elems\n",
   4074 			    __func__, req));
   4075 	return (req->uri_elems);
   4076 }
   4077 
   4078 const char *
   4079 evhttp_request_get_host(struct evhttp_request *req)
   4080 {
   4081 	const char *host = NULL;
   4082 
   4083 	if (req->host_cache)
   4084 		return req->host_cache;
   4085 
   4086 	if (req->uri_elems)
   4087 		host = evhttp_uri_get_host(req->uri_elems);
   4088 	if (!host && req->input_headers) {
   4089 		const char *p;
   4090 		size_t len;
   4091 
   4092 		host = evhttp_find_header(req->input_headers, "Host");
   4093 		/* The Host: header may include a port. Remove it here
   4094 		   to be consistent with uri_elems case above. */
   4095 		if (host) {
   4096 			p = host + strlen(host) - 1;
   4097 			while (p > host && EVUTIL_ISDIGIT_(*p))
   4098 				--p;
   4099 			if (p > host && *p == ':') {
   4100 				len = p - host;
   4101 				req->host_cache = mm_malloc(len + 1);
   4102 				if (!req->host_cache) {
   4103 					event_warn("%s: malloc", __func__);
   4104 					return NULL;
   4105 				}
   4106 				memcpy(req->host_cache, host, len);
   4107 				req->host_cache[len] = '\0';
   4108 				host = req->host_cache;
   4109 			}
   4110 		}
   4111 	}
   4112 
   4113 	return host;
   4114 }
   4115 
   4116 enum evhttp_cmd_type
   4117 evhttp_request_get_command(const struct evhttp_request *req) {
   4118 	return (req->type);
   4119 }
   4120 
   4121 int
   4122 evhttp_request_get_response_code(const struct evhttp_request *req)
   4123 {
   4124 	return req->response_code;
   4125 }
   4126 
   4127 const char *
   4128 evhttp_request_get_response_code_line(const struct evhttp_request *req)
   4129 {
   4130 	return req->response_code_line;
   4131 }
   4132 
   4133 /** Returns the input headers */
   4134 struct evkeyvalq *evhttp_request_get_input_headers(struct evhttp_request *req)
   4135 {
   4136 	return (req->input_headers);
   4137 }
   4138 
   4139 /** Returns the output headers */
   4140 struct evkeyvalq *evhttp_request_get_output_headers(struct evhttp_request *req)
   4141 {
   4142 	return (req->output_headers);
   4143 }
   4144 
   4145 /** Returns the input buffer */
   4146 struct evbuffer *evhttp_request_get_input_buffer(struct evhttp_request *req)
   4147 {
   4148 	return (req->input_buffer);
   4149 }
   4150 
   4151 /** Returns the output buffer */
   4152 struct evbuffer *evhttp_request_get_output_buffer(struct evhttp_request *req)
   4153 {
   4154 	return (req->output_buffer);
   4155 }
   4156 
   4157 
   4158 /*
   4159  * Takes a file descriptor to read a request from.
   4160  * The callback is executed once the whole request has been read.
   4161  */
   4162 
   4163 static struct evhttp_connection*
   4164 evhttp_get_request_connection(
   4165 	struct evhttp* http,
   4166 	evutil_socket_t fd, struct sockaddr *sa, ev_socklen_t salen)
   4167 {
   4168 	struct evhttp_connection *evcon;
   4169 	char *hostname = NULL, *portname = NULL;
   4170 	struct bufferevent* bev = NULL;
   4171 
   4172 	name_from_addr(sa, salen, &hostname, &portname);
   4173 	if (hostname == NULL || portname == NULL) {
   4174 		if (hostname) mm_free(hostname);
   4175 		if (portname) mm_free(portname);
   4176 		return (NULL);
   4177 	}
   4178 
   4179 	event_debug(("%s: new request from %s:%s on "EV_SOCK_FMT"\n",
   4180 		__func__, hostname, portname, EV_SOCK_ARG(fd)));
   4181 
   4182 	/* we need a connection object to put the http request on */
   4183 	if (http->bevcb != NULL) {
   4184 		bev = (*http->bevcb)(http->base, http->bevcbarg);
   4185 	}
   4186 	evcon = evhttp_connection_base_bufferevent_new(
   4187 		http->base, NULL, bev, hostname, atoi(portname));
   4188 	mm_free(hostname);
   4189 	mm_free(portname);
   4190 	if (evcon == NULL)
   4191 		return (NULL);
   4192 
   4193 	evcon->max_headers_size = http->default_max_headers_size;
   4194 	evcon->max_body_size = http->default_max_body_size;
   4195 	if (http->flags & EVHTTP_SERVER_LINGERING_CLOSE)
   4196 		evcon->flags |= EVHTTP_CON_LINGERING_CLOSE;
   4197 
   4198 	evcon->flags |= EVHTTP_CON_INCOMING;
   4199 	evcon->state = EVCON_READING_FIRSTLINE;
   4200 
   4201 	evcon->fd = fd;
   4202 
   4203 	bufferevent_enable(evcon->bufev, EV_READ);
   4204 	bufferevent_disable(evcon->bufev, EV_WRITE);
   4205 	bufferevent_setfd(evcon->bufev, fd);
   4206 
   4207 	return (evcon);
   4208 }
   4209 
   4210 static int
   4211 evhttp_associate_new_request_with_connection(struct evhttp_connection *evcon)
   4212 {
   4213 	struct evhttp *http = evcon->http_server;
   4214 	struct evhttp_request *req;
   4215 	if ((req = evhttp_request_new(evhttp_handle_request, http)) == NULL)
   4216 		return (-1);
   4217 
   4218 	if ((req->remote_host = mm_strdup(evcon->address)) == NULL) {
   4219 		event_warn("%s: strdup", __func__);
   4220 		evhttp_request_free(req);
   4221 		return (-1);
   4222 	}
   4223 	req->remote_port = evcon->port;
   4224 
   4225 	req->evcon = evcon;	/* the request ends up owning the connection */
   4226 	req->flags |= EVHTTP_REQ_OWN_CONNECTION;
   4227 
   4228 	/* We did not present the request to the user user yet, so treat it as
   4229 	 * if the user was done with the request.  This allows us to free the
   4230 	 * request on a persistent connection if the client drops it without
   4231 	 * sending a request.
   4232 	 */
   4233 	req->userdone = 1;
   4234 
   4235 	TAILQ_INSERT_TAIL(&evcon->requests, req, next);
   4236 
   4237 	req->kind = EVHTTP_REQUEST;
   4238 
   4239 
   4240 	evhttp_start_read_(evcon);
   4241 
   4242 	return (0);
   4243 }
   4244 
   4245 static void
   4246 evhttp_get_request(struct evhttp *http, evutil_socket_t fd,
   4247     struct sockaddr *sa, ev_socklen_t salen)
   4248 {
   4249 	struct evhttp_connection *evcon;
   4250 
   4251 	evcon = evhttp_get_request_connection(http, fd, sa, salen);
   4252 	if (evcon == NULL) {
   4253 		event_sock_warn(fd, "%s: cannot get connection on "EV_SOCK_FMT,
   4254 		    __func__, EV_SOCK_ARG(fd));
   4255 		evutil_closesocket(fd);
   4256 		return;
   4257 	}
   4258 
   4259 	/* the timeout can be used by the server to close idle connections */
   4260 	if (evutil_timerisset(&http->timeout))
   4261 		evhttp_connection_set_timeout_tv(evcon, &http->timeout);
   4262 
   4263 	/*
   4264 	 * if we want to accept more than one request on a connection,
   4265 	 * we need to know which http server it belongs to.
   4266 	 */
   4267 	evcon->http_server = http;
   4268 	TAILQ_INSERT_TAIL(&http->connections, evcon, next);
   4269 
   4270 	if (evhttp_associate_new_request_with_connection(evcon) == -1)
   4271 		evhttp_connection_free(evcon);
   4272 }
   4273 
   4274 
   4275 /*
   4276  * Network helper functions that we do not want to export to the rest of
   4277  * the world.
   4278  */
   4279 
   4280 static void
   4281 name_from_addr(struct sockaddr *sa, ev_socklen_t salen,
   4282     char **phost, char **pport)
   4283 {
   4284 	char ntop[NI_MAXHOST];
   4285 	char strport[NI_MAXSERV];
   4286 	int ni_result;
   4287 
   4288 #ifdef EVENT__HAVE_GETNAMEINFO
   4289 	ni_result = getnameinfo(sa, salen,
   4290 		ntop, sizeof(ntop), strport, sizeof(strport),
   4291 		NI_NUMERICHOST|NI_NUMERICSERV);
   4292 
   4293 	if (ni_result != 0) {
   4294 #ifdef EAI_SYSTEM
   4295 		/* Windows doesn't have an EAI_SYSTEM. */
   4296 		if (ni_result == EAI_SYSTEM)
   4297 			event_err(1, "getnameinfo failed");
   4298 		else
   4299 #endif
   4300 			event_errx(1, "getnameinfo failed: %s", gai_strerror(ni_result));
   4301 		return;
   4302 	}
   4303 #else
   4304 	ni_result = fake_getnameinfo(sa, salen,
   4305 		ntop, sizeof(ntop), strport, sizeof(strport),
   4306 		NI_NUMERICHOST|NI_NUMERICSERV);
   4307 	if (ni_result != 0)
   4308 			return;
   4309 #endif
   4310 
   4311 	*phost = mm_strdup(ntop);
   4312 	*pport = mm_strdup(strport);
   4313 }
   4314 
   4315 /* Create a non-blocking socket and bind it */
   4316 /* todo: rename this function */
   4317 static evutil_socket_t
   4318 bind_socket_ai(struct evutil_addrinfo *ai, int reuse)
   4319 {
   4320 	evutil_socket_t fd;
   4321 
   4322 	int on = 1, r;
   4323 	int serrno;
   4324 
   4325 	/* Create listen socket */
   4326 	fd = evutil_socket_(ai ? ai->ai_family : AF_INET,
   4327 	    SOCK_STREAM|EVUTIL_SOCK_NONBLOCK|EVUTIL_SOCK_CLOEXEC, 0);
   4328 	if (fd == -1) {
   4329 			event_sock_warn(-1, "socket");
   4330 			return (-1);
   4331 	}
   4332 
   4333 	if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void *)&on, sizeof(on))<0)
   4334 		goto out;
   4335 	if (reuse) {
   4336 		if (evutil_make_listen_socket_reuseable(fd) < 0)
   4337 			goto out;
   4338 	}
   4339 
   4340 	if (ai != NULL) {
   4341 		r = bind(fd, ai->ai_addr, (ev_socklen_t)ai->ai_addrlen);
   4342 		if (r == -1)
   4343 			goto out;
   4344 	}
   4345 
   4346 	return (fd);
   4347 
   4348  out:
   4349 	serrno = EVUTIL_SOCKET_ERROR();
   4350 	evutil_closesocket(fd);
   4351 	EVUTIL_SET_SOCKET_ERROR(serrno);
   4352 	return (-1);
   4353 }
   4354 
   4355 static struct evutil_addrinfo *
   4356 make_addrinfo(const char *address, ev_uint16_t port)
   4357 {
   4358 	struct evutil_addrinfo *ai = NULL;
   4359 
   4360 	struct evutil_addrinfo hints;
   4361 	char strport[NI_MAXSERV];
   4362 	int ai_result;
   4363 
   4364 	memset(&hints, 0, sizeof(hints));
   4365 	hints.ai_family = AF_UNSPEC;
   4366 	hints.ai_socktype = SOCK_STREAM;
   4367 	/* turn NULL hostname into INADDR_ANY, and skip looking up any address
   4368 	 * types we don't have an interface to connect to. */
   4369 	hints.ai_flags = EVUTIL_AI_PASSIVE|EVUTIL_AI_ADDRCONFIG;
   4370 	evutil_snprintf(strport, sizeof(strport), "%d", port);
   4371 	if ((ai_result = evutil_getaddrinfo(address, strport, &hints, &ai))
   4372 	    != 0) {
   4373 		if (ai_result == EVUTIL_EAI_SYSTEM)
   4374 			event_warn("getaddrinfo");
   4375 		else
   4376 			event_warnx("getaddrinfo: %s",
   4377 			    evutil_gai_strerror(ai_result));
   4378 		return (NULL);
   4379 	}
   4380 
   4381 	return (ai);
   4382 }
   4383 
   4384 static evutil_socket_t
   4385 bind_socket(const char *address, ev_uint16_t port, int reuse)
   4386 {
   4387 	evutil_socket_t fd;
   4388 	struct evutil_addrinfo *aitop = NULL;
   4389 
   4390 	/* just create an unbound socket */
   4391 	if (address == NULL && port == 0)
   4392 		return bind_socket_ai(NULL, 0);
   4393 
   4394 	aitop = make_addrinfo(address, port);
   4395 
   4396 	if (aitop == NULL)
   4397 		return (-1);
   4398 
   4399 	fd = bind_socket_ai(aitop, reuse);
   4400 
   4401 	evutil_freeaddrinfo(aitop);
   4402 
   4403 	return (fd);
   4404 }
   4405 
   4406 struct evhttp_uri {
   4407 	unsigned flags;
   4408 	char *scheme; /* scheme; e.g http, ftp etc */
   4409 	char *userinfo; /* userinfo (typically username:pass), or NULL */
   4410 	char *host; /* hostname, IP address, or NULL */
   4411 	int port; /* port, or zero */
   4412 	char *path; /* path, or "". */
   4413 	char *query; /* query, or NULL */
   4414 	char *fragment; /* fragment or NULL */
   4415 };
   4416 
   4417 struct evhttp_uri *
   4418 evhttp_uri_new(void)
   4419 {
   4420 	struct evhttp_uri *uri = mm_calloc(sizeof(struct evhttp_uri), 1);
   4421 	if (uri)
   4422 		uri->port = -1;
   4423 	return uri;
   4424 }
   4425 
   4426 void
   4427 evhttp_uri_set_flags(struct evhttp_uri *uri, unsigned flags)
   4428 {
   4429 	uri->flags = flags;
   4430 }
   4431 
   4432 /* Return true if the string starting at s and ending immediately before eos
   4433  * is a valid URI scheme according to RFC3986
   4434  */
   4435 static int
   4436 scheme_ok(const char *s, const char *eos)
   4437 {
   4438 	/* scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) */
   4439 	EVUTIL_ASSERT(eos >= s);
   4440 	if (s == eos)
   4441 		return 0;
   4442 	if (!EVUTIL_ISALPHA_(*s))
   4443 		return 0;
   4444 	while (++s < eos) {
   4445 		if (! EVUTIL_ISALNUM_(*s) &&
   4446 		    *s != '+' && *s != '-' && *s != '.')
   4447 			return 0;
   4448 	}
   4449 	return 1;
   4450 }
   4451 
   4452 #define SUBDELIMS "!$&'()*+,;="
   4453 
   4454 /* Return true iff [s..eos) is a valid userinfo */
   4455 static int
   4456 userinfo_ok(const char *s, const char *eos)
   4457 {
   4458 	while (s < eos) {
   4459 		if (CHAR_IS_UNRESERVED(*s) ||
   4460 		    strchr(SUBDELIMS, *s) ||
   4461 		    *s == ':')
   4462 			++s;
   4463 		else if (*s == '%' && s+2 < eos &&
   4464 		    EVUTIL_ISXDIGIT_(s[1]) &&
   4465 		    EVUTIL_ISXDIGIT_(s[2]))
   4466 			s += 3;
   4467 		else
   4468 			return 0;
   4469 	}
   4470 	return 1;
   4471 }
   4472 
   4473 static int
   4474 regname_ok(const char *s, const char *eos)
   4475 {
   4476 	while (s && s<eos) {
   4477 		if (CHAR_IS_UNRESERVED(*s) ||
   4478 		    strchr(SUBDELIMS, *s))
   4479 			++s;
   4480 		else if (*s == '%' &&
   4481 		    EVUTIL_ISXDIGIT_(s[1]) &&
   4482 		    EVUTIL_ISXDIGIT_(s[2]))
   4483 			s += 3;
   4484 		else
   4485 			return 0;
   4486 	}
   4487 	return 1;
   4488 }
   4489 
   4490 static int
   4491 parse_port(const char *s, const char *eos)
   4492 {
   4493 	int portnum = 0;
   4494 	while (s < eos) {
   4495 		if (! EVUTIL_ISDIGIT_(*s))
   4496 			return -1;
   4497 		portnum = (portnum * 10) + (*s - '0');
   4498 		if (portnum < 0)
   4499 			return -1;
   4500 		if (portnum > 65535)
   4501 			return -1;
   4502 		++s;
   4503 	}
   4504 	return portnum;
   4505 }
   4506 
   4507 /* returns 0 for bad, 1 for ipv6, 2 for IPvFuture */
   4508 static int
   4509 bracket_addr_ok(const char *s, const char *eos)
   4510 {
   4511 	if (s + 3 > eos || *s != '[' || *(eos-1) != ']')
   4512 		return 0;
   4513 	if (s[1] == 'v') {
   4514 		/* IPvFuture, or junk.
   4515 		   "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )
   4516 		 */
   4517 		s += 2; /* skip [v */
   4518 		--eos;
   4519 		if (!EVUTIL_ISXDIGIT_(*s)) /*require at least one*/
   4520 			return 0;
   4521 		while (s < eos && *s != '.') {
   4522 			if (EVUTIL_ISXDIGIT_(*s))
   4523 				++s;
   4524 			else
   4525 				return 0;
   4526 		}
   4527 		if (*s != '.')
   4528 			return 0;
   4529 		++s;
   4530 		while (s < eos) {
   4531 			if (CHAR_IS_UNRESERVED(*s) ||
   4532 			    strchr(SUBDELIMS, *s) ||
   4533 			    *s == ':')
   4534 				++s;
   4535 			else
   4536 				return 0;
   4537 		}
   4538 		return 2;
   4539 	} else {
   4540 		/* IPv6, or junk */
   4541 		char buf[64];
   4542 		ev_ssize_t n_chars = eos-s-2;
   4543 		struct in6_addr in6;
   4544 		if (n_chars >= 64) /* way too long */
   4545 			return 0;
   4546 		memcpy(buf, s+1, n_chars);
   4547 		buf[n_chars]='\0';
   4548 		return (evutil_inet_pton(AF_INET6,buf,&in6)==1) ? 1 : 0;
   4549 	}
   4550 }
   4551 
   4552 static int
   4553 parse_authority(struct evhttp_uri *uri, char *s, char *eos)
   4554 {
   4555 	char *cp, *port;
   4556 	EVUTIL_ASSERT(eos);
   4557 	if (eos == s) {
   4558 		uri->host = mm_strdup("");
   4559 		if (uri->host == NULL) {
   4560 			event_warn("%s: strdup", __func__);
   4561 			return -1;
   4562 		}
   4563 		return 0;
   4564 	}
   4565 
   4566 	/* Optionally, we start with "userinfo@" */
   4567 
   4568 	cp = strchr(s, '@');
   4569 	if (cp && cp < eos) {
   4570 		if (! userinfo_ok(s,cp))
   4571 			return -1;
   4572 		*cp++ = '\0';
   4573 		uri->userinfo = mm_strdup(s);
   4574 		if (uri->userinfo == NULL) {
   4575 			event_warn("%s: strdup", __func__);
   4576 			return -1;
   4577 		}
   4578 	} else {
   4579 		cp = s;
   4580 	}
   4581 	/* Optionally, we end with ":port" */
   4582 	for (port=eos-1; port >= cp && EVUTIL_ISDIGIT_(*port); --port)
   4583 		;
   4584 	if (port >= cp && *port == ':') {
   4585 		if (port+1 == eos) /* Leave port unspecified; the RFC allows a
   4586 				    * nil port */
   4587 			uri->port = -1;
   4588 		else if ((uri->port = parse_port(port+1, eos))<0)
   4589 			return -1;
   4590 		eos = port;
   4591 	}
   4592 	/* Now, cp..eos holds the "host" port, which can be an IPv4Address,
   4593 	 * an IP-Literal, or a reg-name */
   4594 	EVUTIL_ASSERT(eos >= cp);
   4595 	if (*cp == '[' && eos >= cp+2 && *(eos-1) == ']') {
   4596 		/* IPv6address, IP-Literal, or junk. */
   4597 		if (! bracket_addr_ok(cp, eos))
   4598 			return -1;
   4599 	} else {
   4600 		/* Make sure the host part is ok. */
   4601 		if (! regname_ok(cp,eos)) /* Match IPv4Address or reg-name */
   4602 			return -1;
   4603 	}
   4604 	uri->host = mm_malloc(eos-cp+1);
   4605 	if (uri->host == NULL) {
   4606 		event_warn("%s: malloc", __func__);
   4607 		return -1;
   4608 	}
   4609 	memcpy(uri->host, cp, eos-cp);
   4610 	uri->host[eos-cp] = '\0';
   4611 	return 0;
   4612 
   4613 }
   4614 
   4615 static char *
   4616 end_of_authority(char *cp)
   4617 {
   4618 	while (*cp) {
   4619 		if (*cp == '?' || *cp == '#' || *cp == '/')
   4620 			return cp;
   4621 		++cp;
   4622 	}
   4623 	return cp;
   4624 }
   4625 
   4626 enum uri_part {
   4627 	PART_PATH,
   4628 	PART_QUERY,
   4629 	PART_FRAGMENT
   4630 };
   4631 
   4632 /* Return the character after the longest prefix of 'cp' that matches...
   4633  *   *pchar / "/" if allow_qchars is false, or
   4634  *   *(pchar / "/" / "?") if allow_qchars is true.
   4635  */
   4636 static char *
   4637 end_of_path(char *cp, enum uri_part part, unsigned flags)
   4638 {
   4639 	if (flags & EVHTTP_URI_NONCONFORMANT) {
   4640 		/* If NONCONFORMANT:
   4641 		 *   Path is everything up to a # or ? or nul.
   4642 		 *   Query is everything up a # or nul
   4643 		 *   Fragment is everything up to a nul.
   4644 		 */
   4645 		switch (part) {
   4646 		case PART_PATH:
   4647 			while (*cp && *cp != '#' && *cp != '?')
   4648 				++cp;
   4649 			break;
   4650 		case PART_QUERY:
   4651 			while (*cp && *cp != '#')
   4652 				++cp;
   4653 			break;
   4654 		case PART_FRAGMENT:
   4655 			cp += strlen(cp);
   4656 			break;
   4657 		};
   4658 		return cp;
   4659 	}
   4660 
   4661 	while (*cp) {
   4662 		if (CHAR_IS_UNRESERVED(*cp) ||
   4663 		    strchr(SUBDELIMS, *cp) ||
   4664 		    *cp == ':' || *cp == '@' || *cp == '/')
   4665 			++cp;
   4666 		else if (*cp == '%' && EVUTIL_ISXDIGIT_(cp[1]) &&
   4667 		    EVUTIL_ISXDIGIT_(cp[2]))
   4668 			cp += 3;
   4669 		else if (*cp == '?' && part != PART_PATH)
   4670 			++cp;
   4671 		else
   4672 			return cp;
   4673 	}
   4674 	return cp;
   4675 }
   4676 
   4677 static int
   4678 path_matches_noscheme(const char *cp)
   4679 {
   4680 	while (*cp) {
   4681 		if (*cp == ':')
   4682 			return 0;
   4683 		else if (*cp == '/')
   4684 			return 1;
   4685 		++cp;
   4686 	}
   4687 	return 1;
   4688 }
   4689 
   4690 struct evhttp_uri *
   4691 evhttp_uri_parse(const char *source_uri)
   4692 {
   4693 	return evhttp_uri_parse_with_flags(source_uri, 0);
   4694 }
   4695 
   4696 struct evhttp_uri *
   4697 evhttp_uri_parse_with_flags(const char *source_uri, unsigned flags)
   4698 {
   4699 	char *readbuf = NULL, *readp = NULL, *token = NULL, *query = NULL;
   4700 	char *path = NULL, *fragment = NULL;
   4701 	int got_authority = 0;
   4702 
   4703 	struct evhttp_uri *uri = mm_calloc(1, sizeof(struct evhttp_uri));
   4704 	if (uri == NULL) {
   4705 		event_warn("%s: calloc", __func__);
   4706 		goto err;
   4707 	}
   4708 	uri->port = -1;
   4709 	uri->flags = flags;
   4710 
   4711 	readbuf = mm_strdup(source_uri);
   4712 	if (readbuf == NULL) {
   4713 		event_warn("%s: strdup", __func__);
   4714 		goto err;
   4715 	}
   4716 
   4717 	readp = readbuf;
   4718 	token = NULL;
   4719 
   4720 	/* We try to follow RFC3986 here as much as we can, and match
   4721 	   the productions
   4722 
   4723 	      URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
   4724 
   4725 	      relative-ref  = relative-part [ "?" query ] [ "#" fragment ]
   4726 	 */
   4727 
   4728 	/* 1. scheme: */
   4729 	token = strchr(readp, ':');
   4730 	if (token && scheme_ok(readp,token)) {
   4731 		*token = '\0';
   4732 		uri->scheme = mm_strdup(readp);
   4733 		if (uri->scheme == NULL) {
   4734 			event_warn("%s: strdup", __func__);
   4735 			goto err;
   4736 		}
   4737 		readp = token+1; /* eat : */
   4738 	}
   4739 
   4740 	/* 2. Optionally, "//" then an 'authority' part. */
   4741 	if (readp[0]=='/' && readp[1] == '/') {
   4742 		char *authority;
   4743 		readp += 2;
   4744 		authority = readp;
   4745 		path = end_of_authority(readp);
   4746 		if (parse_authority(uri, authority, path) < 0)
   4747 			goto err;
   4748 		readp = path;
   4749 		got_authority = 1;
   4750 	}
   4751 
   4752 	/* 3. Query: path-abempty, path-absolute, path-rootless, or path-empty
   4753 	 */
   4754 	path = readp;
   4755 	readp = end_of_path(path, PART_PATH, flags);
   4756 
   4757 	/* Query */
   4758 	if (*readp == '?') {
   4759 		*readp = '\0';
   4760 		++readp;
   4761 		query = readp;
   4762 		readp = end_of_path(readp, PART_QUERY, flags);
   4763 	}
   4764 	/* fragment */
   4765 	if (*readp == '#') {
   4766 		*readp = '\0';
   4767 		++readp;
   4768 		fragment = readp;
   4769 		readp = end_of_path(readp, PART_FRAGMENT, flags);
   4770 	}
   4771 	if (*readp != '\0') {
   4772 		goto err;
   4773 	}
   4774 
   4775 	/* These next two cases may be unreachable; I'm leaving them
   4776 	 * in to be defensive. */
   4777 	/* If you didn't get an authority, the path can't begin with "//" */
   4778 	if (!got_authority && path[0]=='/' && path[1]=='/')
   4779 		goto err;
   4780 	/* If you did get an authority, the path must begin with "/" or be
   4781 	 * empty. */
   4782 	if (got_authority && path[0] != '/' && path[0] != '\0')
   4783 		goto err;
   4784 	/* (End of maybe-unreachable cases) */
   4785 
   4786 	/* If there was no scheme, the first part of the path (if any) must
   4787 	 * have no colon in it. */
   4788 	if (! uri->scheme && !path_matches_noscheme(path))
   4789 		goto err;
   4790 
   4791 	EVUTIL_ASSERT(path);
   4792 	uri->path = mm_strdup(path);
   4793 	if (uri->path == NULL) {
   4794 		event_warn("%s: strdup", __func__);
   4795 		goto err;
   4796 	}
   4797 
   4798 	if (query) {
   4799 		uri->query = mm_strdup(query);
   4800 		if (uri->query == NULL) {
   4801 			event_warn("%s: strdup", __func__);
   4802 			goto err;
   4803 		}
   4804 	}
   4805 	if (fragment) {
   4806 		uri->fragment = mm_strdup(fragment);
   4807 		if (uri->fragment == NULL) {
   4808 			event_warn("%s: strdup", __func__);
   4809 			goto err;
   4810 		}
   4811 	}
   4812 
   4813 	mm_free(readbuf);
   4814 
   4815 	return uri;
   4816 err:
   4817 	if (uri)
   4818 		evhttp_uri_free(uri);
   4819 	if (readbuf)
   4820 		mm_free(readbuf);
   4821 	return NULL;
   4822 }
   4823 
   4824 void
   4825 evhttp_uri_free(struct evhttp_uri *uri)
   4826 {
   4827 #define URI_FREE_STR_(f)		\
   4828 	if (uri->f) {			\
   4829 		mm_free(uri->f);		\
   4830 	}
   4831 
   4832 	URI_FREE_STR_(scheme);
   4833 	URI_FREE_STR_(userinfo);
   4834 	URI_FREE_STR_(host);
   4835 	URI_FREE_STR_(path);
   4836 	URI_FREE_STR_(query);
   4837 	URI_FREE_STR_(fragment);
   4838 
   4839 	mm_free(uri);
   4840 #undef URI_FREE_STR_
   4841 }
   4842 
   4843 char *
   4844 evhttp_uri_join(struct evhttp_uri *uri, char *buf, size_t limit)
   4845 {
   4846 	struct evbuffer *tmp = 0;
   4847 	size_t joined_size = 0;
   4848 	char *output = NULL;
   4849 
   4850 #define URI_ADD_(f)	evbuffer_add(tmp, uri->f, strlen(uri->f))
   4851 
   4852 	if (!uri || !buf || !limit)
   4853 		return NULL;
   4854 
   4855 	tmp = evbuffer_new();
   4856 	if (!tmp)
   4857 		return NULL;
   4858 
   4859 	if (uri->scheme) {
   4860 		URI_ADD_(scheme);
   4861 		evbuffer_add(tmp, ":", 1);
   4862 	}
   4863 	if (uri->host) {
   4864 		evbuffer_add(tmp, "//", 2);
   4865 		if (uri->userinfo)
   4866 			evbuffer_add_printf(tmp,"%s@", uri->userinfo);
   4867 		URI_ADD_(host);
   4868 		if (uri->port >= 0)
   4869 			evbuffer_add_printf(tmp,":%d", uri->port);
   4870 
   4871 		if (uri->path && uri->path[0] != '/' && uri->path[0] != '\0')
   4872 			goto err;
   4873 	}
   4874 
   4875 	if (uri->path)
   4876 		URI_ADD_(path);
   4877 
   4878 	if (uri->query) {
   4879 		evbuffer_add(tmp, "?", 1);
   4880 		URI_ADD_(query);
   4881 	}
   4882 
   4883 	if (uri->fragment) {
   4884 		evbuffer_add(tmp, "#", 1);
   4885 		URI_ADD_(fragment);
   4886 	}
   4887 
   4888 	evbuffer_add(tmp, "\0", 1); /* NUL */
   4889 
   4890 	joined_size = evbuffer_get_length(tmp);
   4891 
   4892 	if (joined_size > limit) {
   4893 		/* It doesn't fit. */
   4894 		evbuffer_free(tmp);
   4895 		return NULL;
   4896 	}
   4897        	evbuffer_remove(tmp, buf, joined_size);
   4898 
   4899 	output = buf;
   4900 err:
   4901 	evbuffer_free(tmp);
   4902 
   4903 	return output;
   4904 #undef URI_ADD_
   4905 }
   4906 
   4907 const char *
   4908 evhttp_uri_get_scheme(const struct evhttp_uri *uri)
   4909 {
   4910 	return uri->scheme;
   4911 }
   4912 const char *
   4913 evhttp_uri_get_userinfo(const struct evhttp_uri *uri)
   4914 {
   4915 	return uri->userinfo;
   4916 }
   4917 const char *
   4918 evhttp_uri_get_host(const struct evhttp_uri *uri)
   4919 {
   4920 	return uri->host;
   4921 }
   4922 int
   4923 evhttp_uri_get_port(const struct evhttp_uri *uri)
   4924 {
   4925 	return uri->port;
   4926 }
   4927 const char *
   4928 evhttp_uri_get_path(const struct evhttp_uri *uri)
   4929 {
   4930 	return uri->path;
   4931 }
   4932 const char *
   4933 evhttp_uri_get_query(const struct evhttp_uri *uri)
   4934 {
   4935 	return uri->query;
   4936 }
   4937 const char *
   4938 evhttp_uri_get_fragment(const struct evhttp_uri *uri)
   4939 {
   4940 	return uri->fragment;
   4941 }
   4942 
   4943 #define URI_SET_STR_(f) do {					\
   4944 	if (uri->f)						\
   4945 		mm_free(uri->f);				\
   4946 	if (f) {						\
   4947 		if ((uri->f = mm_strdup(f)) == NULL) {		\
   4948 			event_warn("%s: strdup()", __func__);	\
   4949 			return -1;				\
   4950 		}						\
   4951 	} else {						\
   4952 		uri->f = NULL;					\
   4953 	}							\
   4954 	} while(0)
   4955 
   4956 int
   4957 evhttp_uri_set_scheme(struct evhttp_uri *uri, const char *scheme)
   4958 {
   4959 	if (scheme && !scheme_ok(scheme, scheme+strlen(scheme)))
   4960 		return -1;
   4961 
   4962 	URI_SET_STR_(scheme);
   4963 	return 0;
   4964 }
   4965 int
   4966 evhttp_uri_set_userinfo(struct evhttp_uri *uri, const char *userinfo)
   4967 {
   4968 	if (userinfo && !userinfo_ok(userinfo, userinfo+strlen(userinfo)))
   4969 		return -1;
   4970 	URI_SET_STR_(userinfo);
   4971 	return 0;
   4972 }
   4973 int
   4974 evhttp_uri_set_host(struct evhttp_uri *uri, const char *host)
   4975 {
   4976 	if (host) {
   4977 		if (host[0] == '[') {
   4978 			if (! bracket_addr_ok(host, host+strlen(host)))
   4979 				return -1;
   4980 		} else {
   4981 			if (! regname_ok(host, host+strlen(host)))
   4982 				return -1;
   4983 		}
   4984 	}
   4985 
   4986 	URI_SET_STR_(host);
   4987 	return 0;
   4988 }
   4989 int
   4990 evhttp_uri_set_port(struct evhttp_uri *uri, int port)
   4991 {
   4992 	if (port < -1)
   4993 		return -1;
   4994 	uri->port = port;
   4995 	return 0;
   4996 }
   4997 #define end_of_cpath(cp,p,f) \
   4998 	((const char*)(end_of_path(((char*)(cp)), (p), (f))))
   4999 
   5000 int
   5001 evhttp_uri_set_path(struct evhttp_uri *uri, const char *path)
   5002 {
   5003 	if (path && end_of_cpath(path, PART_PATH, uri->flags) != path+strlen(path))
   5004 		return -1;
   5005 
   5006 	URI_SET_STR_(path);
   5007 	return 0;
   5008 }
   5009 int
   5010 evhttp_uri_set_query(struct evhttp_uri *uri, const char *query)
   5011 {
   5012 	if (query && end_of_cpath(query, PART_QUERY, uri->flags) != query+strlen(query))
   5013 		return -1;
   5014 	URI_SET_STR_(query);
   5015 	return 0;
   5016 }
   5017 int
   5018 evhttp_uri_set_fragment(struct evhttp_uri *uri, const char *fragment)
   5019 {
   5020 	if (fragment && end_of_cpath(fragment, PART_FRAGMENT, uri->flags) != fragment+strlen(fragment))
   5021 		return -1;
   5022 	URI_SET_STR_(fragment);
   5023 	return 0;
   5024 }
   5025