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