]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/ntp/sntp/libevent/http.c
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / ntp / sntp / libevent / http.c
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
117 static int
118 fake_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
168 extern int debug;
169
170 static evutil_socket_t bind_socket_ai(struct evutil_addrinfo *, int reuse);
171 static evutil_socket_t bind_socket(const char *, ev_uint16_t, int reuse);
172 static void name_from_addr(struct sockaddr *, ev_socklen_t, char **, char **);
173 static int evhttp_associate_new_request_with_connection(
174         struct evhttp_connection *evcon);
175 static void evhttp_connection_start_detectclose(
176         struct evhttp_connection *evcon);
177 static void evhttp_connection_stop_detectclose(
178         struct evhttp_connection *evcon);
179 static void evhttp_request_dispatch(struct evhttp_connection* evcon);
180 static void evhttp_read_firstline(struct evhttp_connection *evcon,
181                                   struct evhttp_request *req);
182 static void evhttp_read_header(struct evhttp_connection *evcon,
183     struct evhttp_request *req);
184 static int evhttp_add_header_internal(struct evkeyvalq *headers,
185     const char *key, const char *value);
186 static const char *evhttp_response_phrase_internal(int code);
187 static void evhttp_get_request(struct evhttp *, evutil_socket_t, struct sockaddr *, ev_socklen_t);
188 static void evhttp_write_buffer(struct evhttp_connection *,
189     void (*)(struct evhttp_connection *, void *), void *);
190 static void evhttp_make_header(struct evhttp_connection *, struct evhttp_request *);
191
192 /* callbacks for bufferevent */
193 static void evhttp_read_cb(struct bufferevent *, void *);
194 static void evhttp_write_cb(struct bufferevent *, void *);
195 static void evhttp_error_cb(struct bufferevent *bufev, short what, void *arg);
196 static 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. */
202 static char *
203 strsep(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
220 static size_t
221 html_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
253 char *
254 evhttp_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. */
297 static const char *
298 evhttp_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  */
344 static int
345 evhttp_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  */
357 static void
358 evhttp_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
379 static void
380 evhttp_send_continue_done(struct evhttp_connection *evcon, void *arg)
381 {
382         bufferevent_disable(evcon->bufev, EV_WRITE);
383 }
384
385 static void
386 evhttp_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. */
403 static int
404 evhttp_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  */
425 static void
426 evhttp_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. */
452 static int
453 evhttp_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' */
466 static int
467 evhttp_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. */
475 static void
476 evhttp_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. */
500 static void
501 evhttp_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  */
517 static void
518 evhttp_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 */
575 static void
576 evhttp_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
609 void
610 evhttp_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 }
618 void
619 evhttp_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
628 static int
629 evhttp_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(). */
681 void
682 evhttp_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 */
750 static void
751 evhttp_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  */
767 static void
768 evhttp_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
855 static enum message_read_status
856 evhttp_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
946 static void
947 evhttp_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
968 static void
969 evhttp_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
1057 static void
1058 evhttp_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
1112 static void
1113 evhttp_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
1119 static void
1120 evhttp_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
1138 void
1139 evhttp_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
1194 void
1195 evhttp_connection_free_on_completion(struct evhttp_connection *evcon) {
1196         evcon->flags |= EVHTTP_CON_AUTOFREE;
1197 }
1198
1199 void
1200 evhttp_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
1210 void
1211 evhttp_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
1218 static void
1219 evhttp_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. */
1243 void
1244 evhttp_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
1281 static void
1282 evhttp_connection_start_detectclose(struct evhttp_connection *evcon)
1283 {
1284         evcon->flags |= EVHTTP_CON_CLOSEDETECT;
1285
1286         bufferevent_enable(evcon->bufev, EV_READ);
1287 }
1288
1289 static void
1290 evhttp_connection_stop_detectclose(struct evhttp_connection *evcon)
1291 {
1292         evcon->flags &= ~EVHTTP_CON_CLOSEDETECT;
1293
1294         bufferevent_disable(evcon->bufev, EV_READ);
1295 }
1296
1297 static void
1298 evhttp_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
1306 static void
1307 evhttp_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
1359 static void
1360 evhttp_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  */
1438 static void
1439 evhttp_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
1530 static int
1531 evhttp_valid_response_code(int code)
1532 {
1533         if (code == 0)
1534                 return (0);
1535
1536         return (1);
1537 }
1538
1539 static int
1540 evhttp_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
1557 static int
1558 evhttp_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
1591 static int
1592 evhttp_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
1757 const char *
1758 evhttp_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
1770 void
1771 evhttp_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
1790 int
1791 evhttp_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
1812 static int
1813 evhttp_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
1827 int
1828 evhttp_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
1847 static int
1848 evhttp_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
1883 enum message_read_status
1884 evhttp_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
1925 static int
1926 evhttp_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
1955 enum message_read_status
1956 evhttp_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
2018 static int
2019 evhttp_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
2057 static int
2058 evhttp_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
2079 static void
2080 evhttp_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
2143 static void
2144 evhttp_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
2165 static void
2166 evhttp_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
2243 struct evhttp_connection *
2244 evhttp_connection_new(const char *address, unsigned short port)
2245 {
2246         return (evhttp_connection_base_new(NULL, NULL, address, port));
2247 }
2248
2249 struct evhttp_connection *
2250 evhttp_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
2314 struct bufferevent* evhttp_connection_get_bufferevent(struct evhttp_connection *evcon)
2315 {
2316         return evcon->bufev;
2317 }
2318
2319 struct evhttp *
2320 evhttp_connection_get_server(struct evhttp_connection *evcon)
2321 {
2322         return evcon->http_server;
2323 }
2324
2325 struct evhttp_connection *
2326 evhttp_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
2332 void evhttp_connection_set_family(struct evhttp_connection *evcon,
2333         int family)
2334 {
2335         evcon->ai_family = family;
2336 }
2337
2338 void
2339 evhttp_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
2348 void
2349 evhttp_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
2362 void
2363 evhttp_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
2377 void
2378 evhttp_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
2389 void
2390 evhttp_connection_set_retries(struct evhttp_connection *evcon,
2391     int retry_max)
2392 {
2393         evcon->retry_max = retry_max;
2394 }
2395
2396 void
2397 evhttp_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
2404 void
2405 evhttp_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
2412 const struct sockaddr*
2413 evhttp_connection_get_addr(struct evhttp_connection *evcon)
2414 {
2415         return (struct sockaddr *)evcon->conn_address;
2416 }
2417
2418 int
2419 evhttp_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
2484 int
2485 evhttp_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
2536 void
2537 evhttp_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
2567 void
2568 evhttp_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
2589 static void
2590 evhttp_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
2624 void
2625 evhttp_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
2656 static inline void
2657 evhttp_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
2681 void
2682 evhttp_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
2690 void
2691 evhttp_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
2713 void
2714 evhttp_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
2740 void
2741 evhttp_send_reply_chunk(struct evhttp_request *req, struct evbuffer *databuf)
2742 {
2743         evhttp_send_reply_chunk_with_cb(req, databuf, NULL, NULL);
2744 }
2745 void
2746 evhttp_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
2775 static const char *informational_phrases[] = {
2776         /* 100 */ "Continue",
2777         /* 101 */ "Switching Protocols"
2778 };
2779
2780 static 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
2790 static 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
2800 static 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
2821 static 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
2830 struct 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
2840 static 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
2848 static const char *
2849 evhttp_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
2865 void
2866 evhttp_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
2881 void
2882 evhttp_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
2899 static 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  */
2929 char *
2930 evhttp_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
2962 char *
2963 evhttp_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  */
2974 int
2975 evhttp_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 */
3007 char *
3008 evhttp_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
3024 char *
3025 evhttp_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
3052 static int
3053 evhttp_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;
3109 error:
3110         evhttp_clear_headers(headers);
3111 done:
3112         if (line)
3113                 mm_free(line);
3114         if (uri)
3115                 evhttp_uri_free(uri);
3116         return result;
3117 }
3118
3119 int
3120 evhttp_parse_query(const char *uri, struct evkeyvalq *headers)
3121 {
3122         return evhttp_parse_query_impl(uri, headers, 1);
3123 }
3124 int
3125 evhttp_parse_query_str(const char *uri, struct evkeyvalq *headers)
3126 {
3127         return evhttp_parse_query_impl(uri, headers, 0);
3128 }
3129
3130 static struct evhttp_cb *
3131 evhttp_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
3158 static int
3159 prefix_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
3194 static int
3195 evhttp_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
3231 static int
3232 evhttp_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
3260 static void
3261 evhttp_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. */
3334 static void
3335 accept_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
3342 int
3343 evhttp_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
3352 struct evhttp_bound_socket *
3353 evhttp_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
3378 int
3379 evhttp_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
3388 void
3389 evhttp_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
3399 struct evhttp_bound_socket *
3400 evhttp_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
3422 struct evhttp_bound_socket *
3423 evhttp_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
3438 evutil_socket_t
3439 evhttp_bound_socket_get_fd(struct evhttp_bound_socket *bound)
3440 {
3441         return evconnlistener_get_fd(bound->listener);
3442 }
3443
3444 struct evconnlistener *
3445 evhttp_bound_socket_get_listener(struct evhttp_bound_socket *bound)
3446 {
3447         return bound->listener;
3448 }
3449
3450 void
3451 evhttp_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
3458 static struct evhttp*
3459 evhttp_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
3488 struct evhttp *
3489 evhttp_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
3505 struct evhttp *
3506 evhttp_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
3521 void
3522 evhttp_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
3568 int
3569 evhttp_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
3586 int
3587 evhttp_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
3600 int
3601 evhttp_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
3620 int
3621 evhttp_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
3637 void
3638 evhttp_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
3650 void
3651 evhttp_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
3660 void
3661 evhttp_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
3669 void
3670 evhttp_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
3678 void
3679 evhttp_set_default_content_type(struct evhttp *http,
3680         const char *content_type) {
3681         http->default_content_type = content_type;
3682 }
3683
3684 void
3685 evhttp_set_allowed_methods(struct evhttp* http, ev_uint16_t methods)
3686 {
3687         http->allowed_methods = methods;
3688 }
3689
3690 int
3691 evhttp_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
3720 int
3721 evhttp_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
3739 void
3740 evhttp_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
3747 void
3748 evhttp_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
3759 struct evhttp_request *
3760 evhttp_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
3809 void
3810 evhttp_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
3843 void
3844 evhttp_request_own(struct evhttp_request *req)
3845 {
3846         req->flags |= EVHTTP_USER_OWNED;
3847 }
3848
3849 int
3850 evhttp_request_is_owned(struct evhttp_request *req)
3851 {
3852         return (req->flags & EVHTTP_USER_OWNED) != 0;
3853 }
3854
3855 struct evhttp_connection *
3856 evhttp_request_get_connection(struct evhttp_request *req)
3857 {
3858         return req->evcon;
3859 }
3860
3861 struct event_base *
3862 evhttp_connection_get_base(struct evhttp_connection *conn)
3863 {
3864         return conn->base;
3865 }
3866
3867 void
3868 evhttp_request_set_chunked_cb(struct evhttp_request *req,
3869     void (*cb)(struct evhttp_request *, void *))
3870 {
3871         req->chunk_cb = cb;
3872 }
3873
3874 void
3875 evhttp_request_set_header_cb(struct evhttp_request *req,
3876     int (*cb)(struct evhttp_request *, void *))
3877 {
3878         req->header_cb = cb;
3879 }
3880
3881 void
3882 evhttp_request_set_error_cb(struct evhttp_request *req,
3883     void (*cb)(enum evhttp_request_error, void *))
3884 {
3885         req->error_cb = cb;
3886 }
3887
3888 void
3889 evhttp_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
3900 const char *
3901 evhttp_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
3907 const struct evhttp_uri *
3908 evhttp_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
3915 const char *
3916 evhttp_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
3953 enum evhttp_cmd_type
3954 evhttp_request_get_command(const struct evhttp_request *req) {
3955         return (req->type);
3956 }
3957
3958 int
3959 evhttp_request_get_response_code(const struct evhttp_request *req)
3960 {
3961         return req->response_code;
3962 }
3963
3964 const char *
3965 evhttp_request_get_response_code_line(const struct evhttp_request *req)
3966 {
3967         return req->response_code_line;
3968 }
3969
3970 /** Returns the input headers */
3971 struct evkeyvalq *evhttp_request_get_input_headers(struct evhttp_request *req)
3972 {
3973         return (req->input_headers);
3974 }
3975
3976 /** Returns the output headers */
3977 struct evkeyvalq *evhttp_request_get_output_headers(struct evhttp_request *req)
3978 {
3979         return (req->output_headers);
3980 }
3981
3982 /** Returns the input buffer */
3983 struct evbuffer *evhttp_request_get_input_buffer(struct evhttp_request *req)
3984 {
3985         return (req->input_buffer);
3986 }
3987
3988 /** Returns the output buffer */
3989 struct 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
4000 static struct evhttp_connection*
4001 evhttp_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
4043 static int
4044 evhttp_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
4078 static void
4079 evhttp_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
4113 static void
4114 name_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 */
4150 static evutil_socket_t
4151 bind_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
4188 static struct evutil_addrinfo *
4189 make_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
4217 static evutil_socket_t
4218 bind_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
4239 struct 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
4250 struct evhttp_uri *
4251 evhttp_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
4259 void
4260 evhttp_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  */
4268 static int
4269 scheme_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 */
4288 static int
4289 userinfo_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
4306 static int
4307 regname_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
4323 static int
4324 parse_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 */
4341 static int
4342 bracket_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
4385 static int
4386 parse_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
4448 static char *
4449 end_of_authority(char *cp)
4450 {
4451         while (*cp) {
4452                 if (*cp == '?' || *cp == '#' || *cp == '/')
4453                         return cp;
4454                 ++cp;
4455         }
4456         return cp;
4457 }
4458
4459 enum 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  */
4469 static char *
4470 end_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
4510 static int
4511 path_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
4523 struct evhttp_uri *
4524 evhttp_uri_parse(const char *source_uri)
4525 {
4526         return evhttp_uri_parse_with_flags(source_uri, 0);
4527 }
4528
4529 struct evhttp_uri *
4530 evhttp_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;
4649 err:
4650         if (uri)
4651                 evhttp_uri_free(uri);
4652         if (readbuf)
4653                 mm_free(readbuf);
4654         return NULL;
4655 }
4656
4657 void
4658 evhttp_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
4676 char *
4677 evhttp_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;
4733 err:
4734         evbuffer_free(tmp);
4735
4736         return output;
4737 #undef URI_ADD_
4738 }
4739
4740 const char *
4741 evhttp_uri_get_scheme(const struct evhttp_uri *uri)
4742 {
4743         return uri->scheme;
4744 }
4745 const char *
4746 evhttp_uri_get_userinfo(const struct evhttp_uri *uri)
4747 {
4748         return uri->userinfo;
4749 }
4750 const char *
4751 evhttp_uri_get_host(const struct evhttp_uri *uri)
4752 {
4753         return uri->host;
4754 }
4755 int
4756 evhttp_uri_get_port(const struct evhttp_uri *uri)
4757 {
4758         return uri->port;
4759 }
4760 const char *
4761 evhttp_uri_get_path(const struct evhttp_uri *uri)
4762 {
4763         return uri->path;
4764 }
4765 const char *
4766 evhttp_uri_get_query(const struct evhttp_uri *uri)
4767 {
4768         return uri->query;
4769 }
4770 const char *
4771 evhttp_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
4789 int
4790 evhttp_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 }
4798 int
4799 evhttp_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 }
4806 int
4807 evhttp_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 }
4822 int
4823 evhttp_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
4833 int
4834 evhttp_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 }
4842 int
4843 evhttp_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 }
4850 int
4851 evhttp_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 }