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