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