Lines Matching +full:precondition +full:- +full:timeout

2  * Copyright (c) 2002-2007 Niels Provos <provos@citi.umich.edu>
3 * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
28 #include "event2/event-config.h"
29 #include "evconfig-private.h"
100 #include "strlcpy-internal.h"
109 #include "log-internal.h"
110 #include "util-internal.h"
111 #include "http-internal.h"
112 #include "mm-internal.h"
113 #include "bufferevent-internal.h"
136 "%d", ntohs(sin->sin_port)); in fake_getnameinfo()
138 return (-1); in fake_getnameinfo()
143 if (strlcpy(host, inet_ntoa(sin->sin_addr), in fake_getnameinfo()
145 return (-1); in fake_getnameinfo()
150 hp = gethostbyaddr((char *)&sin->sin_addr, in fake_getnameinfo()
153 return (-2); in fake_getnameinfo()
155 if (strlcpy(host, hp->h_name, hostlen) >= hostlen) in fake_getnameinfo()
156 return (-1); in fake_getnameinfo()
167 ((req)->major < (major_v) || \
168 ((req)->major == (major_v) && (req)->minor < (minor_v)))
171 ((req)->major > (major_v) || \
172 ((req)->major == (major_v) && (req)->minor >= (minor_v)))
278 if (replace_size > EV_SIZE_MAX - new_size) { in evhttp_htmlescape()
358 return (req->response_code != HTTP_NOCONTENT && in evhttp_response_needs_body()
359 req->response_code != HTTP_NOTMODIFIED && in evhttp_response_needs_body()
360 (req->response_code < 100 || req->response_code >= 200) && in evhttp_response_needs_body()
361 req->type != EVHTTP_REQ_CONNECT && in evhttp_response_needs_body()
362 req->type != EVHTTP_REQ_HEAD); in evhttp_response_needs_body()
366 * output buffer. Sets the evconn's writing-is-done callback, and puts
376 evcon->cb = cb; in evhttp_write_buffer()
377 evcon->cb_arg = arg; in evhttp_write_buffer()
380 * we only care about close detection. (We don't disable reading -- in evhttp_write_buffer()
382 bufferevent_setcb(evcon->bufev, in evhttp_write_buffer()
388 bufferevent_enable(evcon->bufev, EV_READ|EV_WRITE); in evhttp_write_buffer()
394 bufferevent_disable(evcon->bufev, EV_WRITE); in evhttp_send_continue_done()
401 bufferevent_enable(evcon->bufev, EV_WRITE); in evhttp_send_continue()
402 evbuffer_add_printf(bufferevent_get_output(evcon->bufev), in evhttp_send_continue()
404 req->major, req->minor); in evhttp_send_continue()
405 evcon->cb = evhttp_send_continue_done; in evhttp_send_continue()
406 evcon->cb_arg = NULL; in evhttp_send_continue()
407 bufferevent_setcb(evcon->bufev, in evhttp_send_continue()
418 switch (evcon->state) { in evhttp_connected()
443 evhttp_remove_header(req->output_headers, "Proxy-Connection"); in evhttp_make_header_request()
446 if (!(method = evhttp_method(req->type))) { in evhttp_make_header_request()
450 evbuffer_add_printf(bufferevent_get_output(evcon->bufev), in evhttp_make_header_request()
452 method, req->uri, req->major, req->minor); in evhttp_make_header_request()
455 if ((req->type == EVHTTP_REQ_POST || req->type == EVHTTP_REQ_PUT) && in evhttp_make_header_request()
456 evhttp_find_header(req->output_headers, "Content-Length") == NULL){ in evhttp_make_header_request()
459 EV_SIZE_ARG(evbuffer_get_length(req->output_buffer))); in evhttp_make_header_request()
460 evhttp_add_header(req->output_headers, "Content-Length", size); in evhttp_make_header_request()
472 const char *connection = evhttp_find_header(headers, "Proxy-Connection"); in evhttp_is_connection_close()
473 return (connection == NULL || evutil_ascii_strcasecmp(connection, "keep-alive") != 0); in evhttp_is_connection_close()
482 if (req->type == EVHTTP_REQ_CONNECT) in evhttp_is_request_connection_close()
486 evhttp_is_connection_close(req->flags, req->input_headers) || in evhttp_is_request_connection_close()
487 evhttp_is_connection_close(req->flags, req->output_headers); in evhttp_is_request_connection_close()
490 /* Return true iff 'headers' contains 'Connection: keep-alive' */
496 && evutil_ascii_strncasecmp(connection, "keep-alive", 10) == 0); in evhttp_is_connection_keepalive()
505 if (sizeof(date) - evutil_date_rfc1123(date, sizeof(date), NULL) > 0) { in evhttp_maybe_add_date_header()
511 /* Add a "Content-Length" header with value 'content_length' to headers,
512 * unless it already has a content-length or transfer-encoding header. */
517 if (evhttp_find_header(headers, "Transfer-Encoding") == NULL && in evhttp_maybe_add_content_length_header()
518 evhttp_find_header(headers, "Content-Length") == NULL) { in evhttp_maybe_add_content_length_header()
522 evhttp_add_header(headers, "Content-Length", len); in evhttp_maybe_add_content_length_header()
527 * Create the headers needed for an HTTP reply in req->output_headers,
534 int is_keepalive = evhttp_is_connection_keepalive(req->input_headers); in evhttp_make_header_response()
535 evbuffer_add_printf(bufferevent_get_output(evcon->bufev), in evhttp_make_header_response()
537 req->major, req->minor, req->response_code, in evhttp_make_header_response()
538 req->response_code_line); in evhttp_make_header_response()
540 if (req->major == 1) { in evhttp_make_header_response()
541 if (req->minor >= 1) in evhttp_make_header_response()
542 evhttp_maybe_add_date_header(req->output_headers); in evhttp_make_header_response()
545 * if the protocol is 1.0; and the connection was keep-alive in evhttp_make_header_response()
546 * we need to add a keep-alive header, too. in evhttp_make_header_response()
548 if (req->minor == 0 && is_keepalive) in evhttp_make_header_response()
549 evhttp_add_header(req->output_headers, in evhttp_make_header_response()
550 "Connection", "keep-alive"); in evhttp_make_header_response()
552 if ((req->minor >= 1 || is_keepalive) && in evhttp_make_header_response()
560 req->output_headers, in evhttp_make_header_response()
561 evbuffer_get_length(req->output_buffer)); in evhttp_make_header_response()
567 if (evhttp_find_header(req->output_headers, in evhttp_make_header_response()
568 "Content-Type") == NULL in evhttp_make_header_response()
569 && evcon->http_server->default_content_type) { in evhttp_make_header_response()
570 evhttp_add_header(req->output_headers, in evhttp_make_header_response()
571 "Content-Type", in evhttp_make_header_response()
572 evcon->http_server->default_content_type); in evhttp_make_header_response()
577 if (evhttp_is_connection_close(req->flags, req->input_headers)) { in evhttp_make_header_response()
578 evhttp_remove_header(req->output_headers, "Connection"); in evhttp_make_header_response()
579 if (!(req->flags & EVHTTP_PROXY_REQUEST)) in evhttp_make_header_response()
580 evhttp_add_header(req->output_headers, "Connection", "close"); in evhttp_make_header_response()
581 evhttp_remove_header(req->output_headers, "Proxy-Connection"); in evhttp_make_header_response()
589 struct evkeyvalq *h = input ? req->input_headers : req->output_headers; in evhttp_have_expect()
591 if (!(req->kind == EVHTTP_REQUEST) || !REQ_VERSION_ATLEAST(req, 1, 1)) in evhttp_have_expect()
598 return !evutil_ascii_strcasecmp(expect, "100-continue") ? CONTINUE : OTHER; in evhttp_have_expect()
604 * bufferevent. Also writes all data from req->output_buffer */
609 struct evbuffer *output = bufferevent_get_output(evcon->bufev); in evhttp_make_header()
615 if (req->kind == EVHTTP_REQUEST) { in evhttp_make_header()
621 TAILQ_FOREACH(header, req->output_headers, next) { in evhttp_make_header()
623 header->key, header->value); in evhttp_make_header()
628 evbuffer_get_length(req->output_buffer)) { in evhttp_make_header()
633 evbuffer_add_buffer(output, req->output_buffer); in evhttp_make_header()
642 evcon->max_headers_size = EV_SIZE_MAX; in evhttp_connection_set_max_headers_size()
644 evcon->max_headers_size = new_max_headers_size; in evhttp_connection_set_max_headers_size()
651 evcon->max_body_size = EV_UINT64_MAX; in evhttp_connection_set_max_body_size()
653 evcon->max_body_size = new_max_body_size; in evhttp_connection_set_max_body_size()
662 req->response_code = HTTP_ENTITYTOOLARGE; in evhttp_connection_incoming_fail()
665 req->response_code = HTTP_BADREQUEST; in evhttp_connection_incoming_fail()
675 * connection open and we timeout on the read. when in evhttp_connection_incoming_fail()
679 if (!req->userdone) { in evhttp_connection_incoming_fail()
681 TAILQ_REMOVE(&req->evcon->requests, req, next); in evhttp_connection_incoming_fail()
685 req->evcon = NULL; in evhttp_connection_incoming_fail()
687 return (-1); in evhttp_connection_incoming_fail()
694 if (req->uri) { in evhttp_connection_incoming_fail()
695 mm_free(req->uri); in evhttp_connection_incoming_fail()
696 req->uri = NULL; in evhttp_connection_incoming_fail()
698 if (req->uri_elems) { in evhttp_connection_incoming_fail()
699 evhttp_uri_free(req->uri_elems); in evhttp_connection_incoming_fail()
700 req->uri_elems = NULL; in evhttp_connection_incoming_fail()
707 (*req->cb)(req, req->cb_arg); in evhttp_connection_incoming_fail()
718 if (!(req->flags & EVHTTP_USER_OWNED)) in evhttp_request_free_auto()
725 TAILQ_REMOVE(&evcon->requests, req, next); in evhttp_request_free_()
729 /* Called when evcon has experienced a (non-recoverable? -NM) error, as
738 struct evhttp_request* req = TAILQ_FIRST(&evcon->requests); in evhttp_connection_fail_()
745 bufferevent_disable(evcon->bufev, EV_READ|EV_WRITE); in evhttp_connection_fail_()
747 if (evcon->flags & EVHTTP_CON_INCOMING) { in evhttp_connection_fail_()
756 if (evhttp_connection_incoming_fail(req, error) == -1) in evhttp_connection_fail_()
761 error_cb = req->error_cb; in evhttp_connection_fail_()
762 error_cb_arg = req->cb_arg; in evhttp_connection_fail_()
766 cb = req->cb; in evhttp_connection_fail_()
767 cb_arg = req->cb_arg; in evhttp_connection_fail_()
783 if (TAILQ_FIRST(&evcon->requests) != NULL) in evhttp_connection_fail_()
786 if ((evcon->flags & EVHTTP_CON_OUTGOING) && in evhttp_connection_fail_()
787 (evcon->flags & EVHTTP_CON_AUTOFREE)) { in evhttp_connection_fail_()
812 if (evcon->cb != NULL) in evhttp_write_cb()
813 (*evcon->cb)(evcon, evcon->cb_arg); in evhttp_write_cb()
818 * - If this is an outgoing connection, we've just processed the response;
820 * - If this is an incoming connection, we've just processed the request;
826 struct evhttp_request *req = TAILQ_FIRST(&evcon->requests); in evhttp_connection_done()
827 int con_outgoing = evcon->flags & EVHTTP_CON_OUTGOING; in evhttp_connection_done()
833 TAILQ_REMOVE(&evcon->requests, req, next); in evhttp_connection_done()
834 req->evcon = NULL; in evhttp_connection_done()
836 evcon->state = EVCON_IDLE; in evhttp_connection_done()
842 if (TAILQ_FIRST(&evcon->requests) != NULL) { in evhttp_connection_done()
857 } else if ((evcon->flags & EVHTTP_CON_AUTOFREE)) { in evhttp_connection_done()
866 * incoming connection - we need to leave the request on the in evhttp_connection_done()
869 evcon->state = EVCON_WRITING; in evhttp_connection_done()
873 (*req->cb)(req, req->cb_arg); in evhttp_connection_done()
886 if (free_evcon && TAILQ_FIRST(&evcon->requests) == NULL) { in evhttp_connection_done()
925 if (req->ntoread < 0) { in evhttp_handle_chunked_read()
949 if ((ev_uint64_t)ntoread > EV_SIZE_MAX - req->body_size) { in evhttp_handle_chunked_read()
953 if (req->body_size + (size_t)ntoread > req->evcon->max_body_size) { in evhttp_handle_chunked_read()
959 req->body_size += (size_t)ntoread; in evhttp_handle_chunked_read()
960 req->ntoread = ntoread; in evhttp_handle_chunked_read()
961 if (req->ntoread == 0) { in evhttp_handle_chunked_read()
968 /* req->ntoread is signed int64, len is ssize_t, based on arch, in evhttp_handle_chunked_read()
970 if (req->ntoread > EV_SSIZE_MAX) { in evhttp_handle_chunked_read()
975 if (req->ntoread > 0 && buflen < (ev_uint64_t)req->ntoread) in evhttp_handle_chunked_read()
979 evbuffer_remove_buffer(buf, req->input_buffer, (size_t)req->ntoread); in evhttp_handle_chunked_read()
980 req->ntoread = -1; in evhttp_handle_chunked_read()
981 if (req->chunk_cb != NULL) { in evhttp_handle_chunked_read()
982 req->flags |= EVHTTP_REQ_DEFER_FREE; in evhttp_handle_chunked_read()
983 (*req->chunk_cb)(req, req->cb_arg); in evhttp_handle_chunked_read()
984 evbuffer_drain(req->input_buffer, in evhttp_handle_chunked_read()
985 evbuffer_get_length(req->input_buffer)); in evhttp_handle_chunked_read()
986 req->flags &= ~EVHTTP_REQ_DEFER_FREE; in evhttp_handle_chunked_read()
987 if ((req->flags & EVHTTP_REQ_NEEDS_FREE) != 0) { in evhttp_handle_chunked_read()
999 struct evbuffer *buf = bufferevent_get_input(evcon->bufev); in evhttp_read_trailer()
1007 bufferevent_disable(evcon->bufev, EV_READ); in evhttp_read_trailer()
1021 struct evbuffer *buf = bufferevent_get_input(evcon->bufev); in evhttp_lingering_close()
1024 if (n > (size_t) req->ntoread) in evhttp_lingering_close()
1025 n = (size_t) req->ntoread; in evhttp_lingering_close()
1026 req->ntoread -= n; in evhttp_lingering_close()
1027 req->body_size += n; in evhttp_lingering_close()
1030 EV_I64_ARG(req->ntoread))); in evhttp_lingering_close()
1033 if (!req->ntoread) in evhttp_lingering_close()
1040 if (evcon->flags & EVHTTP_CON_LINGERING_CLOSE) in evhttp_lingering_fail()
1049 struct evbuffer *buf = bufferevent_get_input(evcon->bufev); in evhttp_read_body()
1051 if (req->chunked) { in evhttp_read_body()
1055 evcon->state = EVCON_READING_TRAILER; in evhttp_read_body()
1072 } else if (req->ntoread < 0) { in evhttp_read_body()
1074 if ((size_t)(req->body_size + evbuffer_get_length(buf)) < req->body_size) { in evhttp_read_body()
1079 req->body_size += evbuffer_get_length(buf); in evhttp_read_body()
1080 evbuffer_add_buffer(req->input_buffer, buf); in evhttp_read_body()
1081 } else if (req->chunk_cb != NULL || evbuffer_get_length(buf) >= (size_t)req->ntoread) { in evhttp_read_body()
1087 if (n > (size_t) req->ntoread) in evhttp_read_body()
1088 n = (size_t) req->ntoread; in evhttp_read_body()
1089 req->ntoread -= n; in evhttp_read_body()
1090 req->body_size += n; in evhttp_read_body()
1091 evbuffer_remove_buffer(buf, req->input_buffer, n); in evhttp_read_body()
1094 if (req->body_size > req->evcon->max_body_size || in evhttp_read_body()
1095 (!req->chunked && req->ntoread >= 0 && in evhttp_read_body()
1096 (size_t)req->ntoread > req->evcon->max_body_size)) { in evhttp_read_body()
1104 if (evbuffer_get_length(req->input_buffer) > 0 && req->chunk_cb != NULL) { in evhttp_read_body()
1105 req->flags |= EVHTTP_REQ_DEFER_FREE; in evhttp_read_body()
1106 (*req->chunk_cb)(req, req->cb_arg); in evhttp_read_body()
1107 req->flags &= ~EVHTTP_REQ_DEFER_FREE; in evhttp_read_body()
1108 evbuffer_drain(req->input_buffer, in evhttp_read_body()
1109 evbuffer_get_length(req->input_buffer)); in evhttp_read_body()
1110 if ((req->flags & EVHTTP_REQ_NEEDS_FREE) != 0) { in evhttp_read_body()
1116 if (!req->ntoread) { in evhttp_read_body()
1117 bufferevent_disable(evcon->bufev, EV_READ); in evhttp_read_body()
1125 ((evcon)->base)
1135 struct evhttp_request *req = TAILQ_FIRST(&evcon->requests); in evhttp_read_cb()
1139 &evcon->read_more_deferred_cb); in evhttp_read_cb()
1141 switch (evcon->state) { in evhttp_read_cb()
1166 input = bufferevent_get_input(evcon->bufev); in evhttp_read_cb()
1182 __func__, evcon->state); in evhttp_read_cb()
1190 struct bufferevent *bev = evcon->bufev; in evhttp_deferred_read_cb()
1191 if (bev->readcb) in evhttp_deferred_read_cb()
1192 (bev->readcb)(evcon->bufev, evcon); in evhttp_deferred_read_cb()
1199 struct evhttp_request *req = TAILQ_FIRST(&evcon->requests); in evhttp_write_connectioncb()
1200 struct evbuffer *output = bufferevent_get_output(evcon->bufev); in evhttp_write_connectioncb()
1203 EVUTIL_ASSERT(evcon->state == EVCON_WRITING); in evhttp_write_connectioncb()
1211 req->kind = EVHTTP_RESPONSE; in evhttp_write_connectioncb()
1227 if (evcon->fd != -1) { in evhttp_connection_free()
1228 if (evhttp_connected(evcon) && evcon->closecb != NULL) in evhttp_connection_free()
1229 (*evcon->closecb)(evcon, evcon->closecb_arg); in evhttp_connection_free()
1237 while ((req = TAILQ_FIRST(&evcon->requests)) != NULL) { in evhttp_connection_free()
1241 if (evcon->http_server != NULL) { in evhttp_connection_free()
1242 struct evhttp *http = evcon->http_server; in evhttp_connection_free()
1243 TAILQ_REMOVE(&http->connections, evcon, next); in evhttp_connection_free()
1246 if (event_initialized(&evcon->retry_ev)) { in evhttp_connection_free()
1247 event_del(&evcon->retry_ev); in evhttp_connection_free()
1248 event_debug_unassign(&evcon->retry_ev); in evhttp_connection_free()
1252 &evcon->read_more_deferred_cb); in evhttp_connection_free()
1254 if (evcon->bufev != NULL) { in evhttp_connection_free()
1256 !(bufferevent_get_options_(evcon->bufev) & BEV_OPT_CLOSE_ON_FREE); in evhttp_connection_free()
1257 if (evcon->fd == -1) in evhttp_connection_free()
1258 evcon->fd = bufferevent_getfd(evcon->bufev); in evhttp_connection_free()
1260 bufferevent_free(evcon->bufev); in evhttp_connection_free()
1263 if (evcon->fd != -1) { in evhttp_connection_free()
1264 shutdown(evcon->fd, EVUTIL_SHUT_WR); in evhttp_connection_free()
1266 evutil_closesocket(evcon->fd); in evhttp_connection_free()
1269 if (evcon->bind_address != NULL) in evhttp_connection_free()
1270 mm_free(evcon->bind_address); in evhttp_connection_free()
1272 if (evcon->address != NULL) in evhttp_connection_free()
1273 mm_free(evcon->address); in evhttp_connection_free()
1280 evcon->flags |= EVHTTP_CON_AUTOFREE; in evhttp_connection_free_on_completion()
1287 EVUTIL_ASSERT(evcon->state == EVCON_DISCONNECTED); in evhttp_connection_set_local_address()
1288 if (evcon->bind_address) in evhttp_connection_set_local_address()
1289 mm_free(evcon->bind_address); in evhttp_connection_set_local_address()
1290 if ((evcon->bind_address = mm_strdup(address)) == NULL) in evhttp_connection_set_local_address()
1298 EVUTIL_ASSERT(evcon->state == EVCON_DISCONNECTED); in evhttp_connection_set_local_port()
1299 evcon->bind_port = port; in evhttp_connection_set_local_port()
1305 struct evhttp_request *req = TAILQ_FIRST(&evcon->requests); in evhttp_request_dispatch()
1311 EVUTIL_ASSERT(req->kind == EVHTTP_REQUEST); in evhttp_request_dispatch()
1317 EVUTIL_ASSERT(evcon->state == EVCON_IDLE); in evhttp_request_dispatch()
1319 evcon->state = EVCON_WRITING; in evhttp_request_dispatch()
1335 bufferevent_setcb(evcon->bufev, NULL, NULL, NULL, NULL); in evhttp_connection_reset_()
1345 connect will never trigger, since we close the fd, but the timeout in evhttp_connection_reset_()
1348 bufferevent_disable_hard_(evcon->bufev, EV_READ|EV_WRITE); in evhttp_connection_reset_()
1350 if (evcon->fd == -1) in evhttp_connection_reset_()
1351 evcon->fd = bufferevent_getfd(evcon->bufev); in evhttp_connection_reset_()
1353 if (evcon->fd != -1) { in evhttp_connection_reset_()
1355 if (evhttp_connected(evcon) && evcon->closecb != NULL) in evhttp_connection_reset_()
1356 (*evcon->closecb)(evcon, evcon->closecb_arg); in evhttp_connection_reset_()
1358 shutdown(evcon->fd, EVUTIL_SHUT_WR); in evhttp_connection_reset_()
1359 evutil_closesocket(evcon->fd); in evhttp_connection_reset_()
1360 evcon->fd = -1; in evhttp_connection_reset_()
1362 err = bufferevent_setfd(evcon->bufev, -1); in evhttp_connection_reset_()
1366 tmp = bufferevent_get_output(evcon->bufev); in evhttp_connection_reset_()
1367 err = evbuffer_drain(tmp, -1); in evhttp_connection_reset_()
1369 tmp = bufferevent_get_input(evcon->bufev); in evhttp_connection_reset_()
1370 err = evbuffer_drain(tmp, -1); in evhttp_connection_reset_()
1373 evcon->flags &= ~EVHTTP_CON_READING_ERROR; in evhttp_connection_reset_()
1375 evcon->state = EVCON_DISCONNECTED; in evhttp_connection_reset_()
1381 evcon->flags |= EVHTTP_CON_CLOSEDETECT; in evhttp_connection_start_detectclose()
1382 bufferevent_enable(evcon->bufev, EV_READ); in evhttp_connection_start_detectclose()
1388 evcon->flags &= ~EVHTTP_CON_CLOSEDETECT; in evhttp_connection_stop_detectclose()
1389 bufferevent_disable(evcon->bufev, EV_READ); in evhttp_connection_stop_detectclose()
1397 evcon->state = EVCON_DISCONNECTED; in evhttp_connection_retry()
1407 if (evcon->retry_max < 0 || evcon->retry_cnt < evcon->retry_max) { in evhttp_connection_cb_cleanup()
1408 struct timeval tv_retry = evcon->initial_retry_timeout; in evhttp_connection_cb_cleanup()
1410 evtimer_assign(&evcon->retry_ev, evcon->base, evhttp_connection_retry, evcon); in evhttp_connection_cb_cleanup()
1412 for (i=0; i < evcon->retry_cnt; ++i) { in evhttp_connection_cb_cleanup()
1415 tv_retry.tv_usec -= 1000000; in evhttp_connection_cb_cleanup()
1424 event_add(&evcon->retry_ev, &tv_retry); in evhttp_connection_cb_cleanup()
1425 evcon->retry_cnt++; in evhttp_connection_cb_cleanup()
1431 * evcon so new request will be added to evcon->requests. To in evhttp_connection_cb_cleanup()
1436 while (TAILQ_FIRST(&evcon->requests) != NULL) { in evhttp_connection_cb_cleanup()
1437 struct evhttp_request *request = TAILQ_FIRST(&evcon->requests); in evhttp_connection_cb_cleanup()
1438 TAILQ_REMOVE(&evcon->requests, request, next); in evhttp_connection_cb_cleanup()
1446 request->evcon = NULL; in evhttp_connection_cb_cleanup()
1449 request->cb(request, request->cb_arg); in evhttp_connection_cb_cleanup()
1461 if (evcon->flags & EVHTTP_CON_READING_ERROR) { in evhttp_connection_read_on_write_error()
1462 evcon->flags &= ~EVHTTP_CON_READING_ERROR; in evhttp_connection_read_on_write_error()
1467 req->kind = EVHTTP_RESPONSE; in evhttp_connection_read_on_write_error()
1469 buf = bufferevent_get_output(evcon->bufev); in evhttp_connection_read_on_write_error()
1475 evcon->flags |= EVHTTP_CON_READING_ERROR; in evhttp_connection_read_on_write_error()
1482 struct evhttp_request *req = TAILQ_FIRST(&evcon->requests); in evhttp_error_cb()
1484 if (evcon->fd == -1) in evhttp_error_cb()
1485 evcon->fd = bufferevent_getfd(bufev); in evhttp_error_cb()
1487 switch (evcon->state) { in evhttp_error_cb()
1490 event_debug(("%s: connection timeout for \"%s:%d\" on " in evhttp_error_cb()
1492 __func__, evcon->address, evcon->port, in evhttp_error_cb()
1493 EV_SOCK_ARG(evcon->fd))); in evhttp_error_cb()
1500 if (!req->chunked && req->ntoread < 0 in evhttp_error_cb()
1521 if (evcon->flags & EVHTTP_CON_CLOSEDETECT) { in evhttp_error_cb()
1522 evcon->flags &= ~EVHTTP_CON_CLOSEDETECT; in evhttp_error_cb()
1523 EVUTIL_ASSERT(evcon->http_server == NULL); in evhttp_error_cb()
1528 EVUTIL_ASSERT(evcon->state == EVCON_IDLE); in evhttp_error_cb()
1533 * and we want to auto-free the connection when all in evhttp_error_cb()
1536 if (TAILQ_FIRST(&evcon->requests) == NULL in evhttp_error_cb()
1537 && (evcon->flags & EVHTTP_CON_OUTGOING) in evhttp_error_cb()
1538 && (evcon->flags & EVHTTP_CON_AUTOFREE)) { in evhttp_error_cb()
1548 evcon->flags & EVHTTP_CON_READ_ON_WRITE_ERROR) { in evhttp_error_cb()
1554 evcon->flags & EVHTTP_CON_READ_ON_WRITE_ERROR && in evhttp_error_cb()
1557 &evcon->read_more_deferred_cb); in evhttp_error_cb()
1578 if (evcon->fd == -1) in evhttp_connection_cb()
1579 evcon->fd = bufferevent_getfd(bufev); in evhttp_connection_cb()
1594 if (evcon->fd == -1) { in evhttp_connection_cb()
1595 event_debug(("%s: bufferevent_getfd returned -1", in evhttp_connection_cb()
1601 if (getsockopt(evcon->fd, SOL_SOCKET, SO_ERROR, (void*)&error, in evhttp_connection_cb()
1602 &errsz) == -1) { in evhttp_connection_cb()
1604 __func__, evcon->address, evcon->port, in evhttp_connection_cb()
1605 EV_SOCK_ARG(evcon->fd))); in evhttp_connection_cb()
1612 __func__, evcon->address, evcon->port, in evhttp_connection_cb()
1613 EV_SOCK_ARG(evcon->fd), in evhttp_connection_cb()
1620 __func__, evcon->address, evcon->port, in evhttp_connection_cb()
1621 EV_SOCK_ARG(evcon->fd))); in evhttp_connection_cb()
1624 evcon->retry_cnt = 0; in evhttp_connection_cb()
1625 evcon->state = EVCON_IDLE; in evhttp_connection_cb()
1628 bufferevent_setcb(evcon->bufev, in evhttp_connection_cb()
1634 if (!evutil_timerisset(&evcon->timeout)) { in evhttp_connection_cb()
1637 bufferevent_set_timeouts(evcon->bufev, &read_tv, &write_tv); in evhttp_connection_cb()
1639 bufferevent_set_timeouts(evcon->bufev, &evcon->timeout, &evcon->timeout); in evhttp_connection_cb()
1671 __func__, version, req, req->remote_host)); in evhttp_parse_http_version()
1672 return (-1); in evhttp_parse_http_version()
1674 req->major = major; in evhttp_parse_http_version()
1675 req->minor = minor; in evhttp_parse_http_version()
1690 return (-1); in evhttp_parse_response_line()
1696 return (-1); in evhttp_parse_response_line()
1698 req->response_code = atoi(number); in evhttp_parse_response_line()
1699 if (!evhttp_valid_response_code(req->response_code)) { in evhttp_parse_response_line()
1702 return (-1); in evhttp_parse_response_line()
1705 if (req->response_code_line != NULL) in evhttp_parse_response_line()
1706 mm_free(req->response_code_line); in evhttp_parse_response_line()
1707 if ((req->response_code_line = mm_strdup(readable)) == NULL) { in evhttp_parse_response_line()
1709 return (-1); in evhttp_parse_response_line()
1729 while (eos > line && *(eos-1) == ' ') { in evhttp_parse_request_line()
1730 *(eos-1) = '\0'; in evhttp_parse_request_line()
1731 --eos; in evhttp_parse_request_line()
1732 --len; in evhttp_parse_request_line()
1735 return -1; in evhttp_parse_request_line()
1740 return -1; in evhttp_parse_request_line()
1744 return -1; in evhttp_parse_request_line()
1748 method_len = (uri - method) - 1; in evhttp_parse_request_line()
1858 __func__, method, req, req->remote_host)); in evhttp_parse_request_line()
1860 * we see that req->type is unsupported. */ in evhttp_parse_request_line()
1863 req->type = type; in evhttp_parse_request_line()
1866 return -1; in evhttp_parse_request_line()
1868 if ((req->uri = mm_strdup(uri)) == NULL) { in evhttp_parse_request_line()
1870 return -1; in evhttp_parse_request_line()
1874 if ((req->uri_elems = evhttp_uri_parse_authority(req->uri)) == NULL) { in evhttp_parse_request_line()
1875 return -1; in evhttp_parse_request_line()
1878 if ((req->uri_elems = evhttp_uri_parse_with_flags(req->uri, in evhttp_parse_request_line()
1880 return -1; in evhttp_parse_request_line()
1884 /* If we have an absolute-URI, check to see if it is an http request in evhttp_parse_request_line()
1887 scheme = evhttp_uri_get_scheme(req->uri_elems); in evhttp_parse_request_line()
1888 hostname = evhttp_uri_get_host(req->uri_elems); in evhttp_parse_request_line()
1892 !evhttp_find_vhost(req->evcon->http_server, NULL, hostname)) in evhttp_parse_request_line()
1893 req->flags |= EVHTTP_PROXY_REQUEST; in evhttp_parse_request_line()
1904 if (evutil_ascii_strcasecmp(header->key, key) == 0) in evhttp_find_header()
1905 return (header->value); in evhttp_find_header()
1920 mm_free(header->key); in evhttp_clear_headers()
1921 mm_free(header->value); in evhttp_clear_headers()
1928 * Returns -1, if the header could not be found.
1937 if (evutil_ascii_strcasecmp(header->key, key) == 0) in evhttp_remove_header()
1942 return (-1); in evhttp_remove_header()
1946 mm_free(header->key); in evhttp_remove_header()
1947 mm_free(header->value); in evhttp_remove_header()
1977 return (-1); in evhttp_add_header()
1982 return (-1); in evhttp_add_header()
1995 return (-1); in evhttp_add_header_internal()
1997 if ((header->key = mm_strdup(key)) == NULL) { in evhttp_add_header_internal()
2000 return (-1); in evhttp_add_header_internal()
2002 if ((header->value = mm_strdup(value)) == NULL) { in evhttp_add_header_internal()
2003 mm_free(header->key); in evhttp_add_header_internal()
2006 return (-1); in evhttp_add_header_internal()
2034 if (req->evcon != NULL && in evhttp_parse_firstline_()
2035 evbuffer_get_length(buffer) > req->evcon->max_headers_size) in evhttp_parse_firstline_()
2041 if (req->evcon != NULL && len > req->evcon->max_headers_size) { in evhttp_parse_firstline_()
2046 req->headers_size = len; in evhttp_parse_firstline_()
2048 switch (req->kind) { in evhttp_parse_firstline_()
2050 if (evhttp_parse_request_line(req, line, len) == -1) in evhttp_parse_firstline_()
2054 if (evhttp_parse_response_line(req, line) == -1) in evhttp_parse_firstline_()
2073 return (-1); in evhttp_append_to_last_header()
2075 old_len = strlen(header->value); in evhttp_append_to_last_header()
2084 newval = mm_realloc(header->value, old_len + line_len + 2); in evhttp_append_to_last_header()
2086 return (-1); in evhttp_append_to_last_header()
2090 header->value = newval; in evhttp_append_to_last_header()
2102 struct evkeyvalq* headers = req->input_headers; in evhttp_parse_headers_()
2108 req->headers_size += len; in evhttp_parse_headers_()
2110 if (req->evcon != NULL && in evhttp_parse_headers_()
2111 req->headers_size > req->evcon->max_headers_size) { in evhttp_parse_headers_()
2116 if (*line == '\0') { /* Last header - Done */ in evhttp_parse_headers_()
2124 if (evhttp_append_to_last_header(headers, line) == -1) in evhttp_parse_headers_()
2139 if (evhttp_add_header(headers, skey, svalue) == -1) in evhttp_parse_headers_()
2146 if (req->evcon != NULL && in evhttp_parse_headers_()
2147 req->headers_size + evbuffer_get_length(buffer) > req->evcon->max_headers_size) in evhttp_parse_headers_()
2161 struct evkeyvalq *headers = req->input_headers; in evhttp_get_body_length()
2165 content_length = evhttp_find_header(headers, "Content-Length"); in evhttp_get_body_length()
2169 req->ntoread = -1; in evhttp_get_body_length()
2172 req->ntoread = 0; in evhttp_get_body_length()
2174 req->ntoread = -1; in evhttp_get_body_length()
2181 return (-1); in evhttp_get_body_length()
2183 req->ntoread = ntoread; in evhttp_get_body_length()
2187 __func__, EV_I64_ARG(req->ntoread), in evhttp_get_body_length()
2188 EV_SIZE_ARG(evbuffer_get_length(bufferevent_get_input(req->evcon->bufev))))); in evhttp_get_body_length()
2220 if (req->kind == EVHTTP_REQUEST && in evhttp_get_body()
2221 !evhttp_method_may_have_body(req->type)) { in evhttp_get_body()
2225 evcon->state = EVCON_READING_BODY; in evhttp_get_body()
2226 xfer_enc = evhttp_find_header(req->input_headers, "Transfer-Encoding"); in evhttp_get_body()
2228 req->chunked = 1; in evhttp_get_body()
2229 req->ntoread = -1; in evhttp_get_body()
2231 if (evhttp_get_body_length(req) == -1) { in evhttp_get_body()
2235 if (req->kind == EVHTTP_REQUEST && req->ntoread < 1) { in evhttp_get_body()
2236 /* An incoming request with no content-length and no in evhttp_get_body()
2237 * transfer-encoding has no body. */ in evhttp_get_body()
2252 if (req->ntoread > 0) { in evhttp_get_body()
2254 if ((req->evcon->max_body_size <= EV_INT64_MAX) && in evhttp_get_body()
2255 (ev_uint64_t)req->ntoread > req->evcon->max_body_size) { in evhttp_get_body()
2260 if (!evbuffer_get_length(bufferevent_get_input(evcon->bufev))) in evhttp_get_body()
2279 res = evhttp_parse_firstline_(req, bufferevent_get_input(evcon->bufev)); in evhttp_read_firstline()
2283 __func__, EV_SOCK_ARG(evcon->fd))); in evhttp_read_firstline()
2291 evcon->state = EVCON_READING_HEADERS; in evhttp_read_firstline()
2300 evutil_socket_t fd = evcon->fd; in evhttp_read_header()
2302 res = evhttp_parse_headers_(req, bufferevent_get_input(evcon->bufev)); in evhttp_read_header()
2315 if (req->header_cb != NULL) { in evhttp_read_header()
2316 if ((*req->header_cb)(req, req->cb_arg) < 0) { in evhttp_read_header()
2323 switch (req->kind) { in evhttp_read_header()
2333 if (req->response_code == 100) { in evhttp_read_header()
2334 struct evbuffer *output = bufferevent_get_output(evcon->bufev); in evhttp_read_header()
2335 evbuffer_add_buffer(output, req->output_buffer); in evhttp_read_header()
2341 __func__, req->response_code)); in evhttp_read_header()
2346 __func__, req->remote_host, EV_SOCK_ARG(fd))); in evhttp_read_header()
2368 * only numeric hostnames so that non-blocking DNS resolution can
2391 evcon->fd = -1; in evhttp_connection_base_bufferevent_new()
2392 evcon->port = port; in evhttp_connection_base_bufferevent_new()
2394 evcon->max_headers_size = EV_SIZE_MAX; in evhttp_connection_base_bufferevent_new()
2395 evcon->max_body_size = EV_SIZE_MAX; in evhttp_connection_base_bufferevent_new()
2397 evutil_timerclear(&evcon->timeout); in evhttp_connection_base_bufferevent_new()
2398 evcon->retry_cnt = evcon->retry_max = 0; in evhttp_connection_base_bufferevent_new()
2400 if ((evcon->address = mm_strdup(address)) == NULL) { in evhttp_connection_base_bufferevent_new()
2406 if (!(bev = bufferevent_socket_new(base, -1, 0))) { in evhttp_connection_base_bufferevent_new()
2413 evcon->bufev = bev; in evhttp_connection_base_bufferevent_new()
2415 evcon->state = EVCON_DISCONNECTED; in evhttp_connection_base_bufferevent_new()
2416 TAILQ_INIT(&evcon->requests); in evhttp_connection_base_bufferevent_new()
2418 evcon->initial_retry_timeout.tv_sec = 2; in evhttp_connection_base_bufferevent_new()
2419 evcon->initial_retry_timeout.tv_usec = 0; in evhttp_connection_base_bufferevent_new()
2422 evcon->base = base; in evhttp_connection_base_bufferevent_new()
2424 bufferevent_base_set(base, evcon->bufev); in evhttp_connection_base_bufferevent_new()
2428 &evcon->read_more_deferred_cb, in evhttp_connection_base_bufferevent_new()
2432 evcon->dns_base = dnsbase; in evhttp_connection_base_bufferevent_new()
2433 evcon->ai_family = AF_UNSPEC; in evhttp_connection_base_bufferevent_new()
2445 return evcon->bufev; in evhttp_connection_get_bufferevent()
2451 return evcon->http_server; in evhttp_connection_get_server()
2464 evcon->ai_family = family; in evhttp_connection_set_family()
2476 evcon->flags &= ~avail_flags; in evhttp_connection_set_flags()
2478 evcon->flags |= flags; in evhttp_connection_set_flags()
2487 EVUTIL_ASSERT(evcon->base == NULL); in evhttp_connection_set_base()
2488 EVUTIL_ASSERT(evcon->state == EVCON_DISCONNECTED); in evhttp_connection_set_base()
2489 evcon->base = base; in evhttp_connection_set_base()
2490 bufferevent_base_set(base, evcon->bufev); in evhttp_connection_set_base()
2497 if (timeout_in_secs == -1) in evhttp_connection_set_timeout()
2512 evcon->timeout = *tv; in evhttp_connection_set_timeout_tv()
2513 bufferevent_set_timeouts(evcon->bufev, &evcon->timeout, &evcon->timeout); in evhttp_connection_set_timeout_tv()
2517 evutil_timerclear(&evcon->timeout); in evhttp_connection_set_timeout_tv()
2518 bufferevent_set_timeouts(evcon->bufev, &read_tv, &write_tv); in evhttp_connection_set_timeout_tv()
2527 evcon->initial_retry_timeout = *tv; in evhttp_connection_set_initial_retry_tv()
2529 evutil_timerclear(&evcon->initial_retry_timeout); in evhttp_connection_set_initial_retry_tv()
2530 evcon->initial_retry_timeout.tv_sec = 2; in evhttp_connection_set_initial_retry_tv()
2538 evcon->retry_max = retry_max; in evhttp_connection_set_retries()
2545 evcon->closecb = cb; in evhttp_connection_set_closecb()
2546 evcon->closecb_arg = cbarg; in evhttp_connection_set_closecb()
2553 *address = evcon->address; in evhttp_connection_get_peer()
2554 *port = evcon->port; in evhttp_connection_get_peer()
2560 return bufferevent_socket_get_conn_address_(evcon->bufev); in evhttp_connection_get_addr()
2566 int old_state = evcon->state; in evhttp_connection_connect_()
2567 const char *address = evcon->address; in evhttp_connection_connect_()
2571 if (evcon->state == EVCON_CONNECTING) in evhttp_connection_connect_()
2576 EVUTIL_ASSERT(!(evcon->flags & EVHTTP_CON_INCOMING)); in evhttp_connection_connect_()
2577 evcon->flags |= EVHTTP_CON_OUTGOING; in evhttp_connection_connect_()
2579 if (evcon->bind_address || evcon->bind_port) { in evhttp_connection_connect_()
2580 evcon->fd = bind_socket( in evhttp_connection_connect_()
2581 evcon->bind_address, evcon->bind_port, 0 /*reuse*/); in evhttp_connection_connect_()
2582 if (evcon->fd == -1) { in evhttp_connection_connect_()
2584 __func__, evcon->bind_address)); in evhttp_connection_connect_()
2585 return (-1); in evhttp_connection_connect_()
2588 if (bufferevent_setfd(evcon->bufev, evcon->fd)) in evhttp_connection_connect_()
2589 return (-1); in evhttp_connection_connect_()
2591 if (bufferevent_setfd(evcon->bufev, -1)) in evhttp_connection_connect_()
2592 return (-1); in evhttp_connection_connect_()
2596 bufferevent_setcb(evcon->bufev, in evhttp_connection_connect_()
2601 if (!evutil_timerisset(&evcon->timeout)) { in evhttp_connection_connect_()
2603 bufferevent_set_timeouts(evcon->bufev, &conn_tv, &conn_tv); in evhttp_connection_connect_()
2605 bufferevent_set_timeouts(evcon->bufev, &evcon->timeout, &evcon->timeout); in evhttp_connection_connect_()
2608 if (bufferevent_enable(evcon->bufev, EV_WRITE)) in evhttp_connection_connect_()
2609 return (-1); in evhttp_connection_connect_()
2611 evcon->state = EVCON_CONNECTING; in evhttp_connection_connect_()
2613 if (evcon->flags & EVHTTP_CON_REUSE_CONNECTED_ADDR && in evhttp_connection_connect_()
2615 (sa->sa_family == AF_INET || sa->sa_family == AF_INET6)) { in evhttp_connection_connect_()
2617 if (sa->sa_family == AF_INET6) { in evhttp_connection_connect_()
2620 ret = bufferevent_socket_connect(evcon->bufev, sa, socklen); in evhttp_connection_connect_()
2622 ret = bufferevent_socket_connect_hostname(evcon->bufev, in evhttp_connection_connect_()
2623 evcon->dns_base, evcon->ai_family, address, evcon->port); in evhttp_connection_connect_()
2627 evcon->state = old_state; in evhttp_connection_connect_()
2628 event_sock_warn(evcon->fd, "%s: connection to \"%s\" failed", in evhttp_connection_connect_()
2629 __func__, evcon->address); in evhttp_connection_connect_()
2653 req->kind = EVHTTP_REQUEST; in evhttp_make_request()
2654 req->type = type; in evhttp_make_request()
2655 if (req->uri != NULL) in evhttp_make_request()
2656 mm_free(req->uri); in evhttp_make_request()
2657 if ((req->uri = mm_strdup(uri)) == NULL) { in evhttp_make_request()
2660 return (-1); in evhttp_make_request()
2664 if (!req->major && !req->minor) { in evhttp_make_request()
2665 req->major = 1; in evhttp_make_request()
2666 req->minor = 1; in evhttp_make_request()
2669 EVUTIL_ASSERT(req->evcon == NULL); in evhttp_make_request()
2670 req->evcon = evcon; in evhttp_make_request()
2671 EVUTIL_ASSERT(!(req->flags & EVHTTP_REQ_OWN_CONNECTION)); in evhttp_make_request()
2673 TAILQ_INSERT_TAIL(&evcon->requests, req, next); in evhttp_make_request()
2676 if (evcon->retry_cnt) in evhttp_make_request()
2684 * evcon->requests. Thus, enqueue the request in advance and in evhttp_make_request()
2687 TAILQ_REMOVE(&evcon->requests, req, next); in evhttp_make_request()
2697 if (TAILQ_FIRST(&evcon->requests) == req) in evhttp_make_request()
2706 struct evhttp_connection *evcon = req->evcon; in evhttp_cancel_request()
2709 if (TAILQ_FIRST(&evcon->requests) == req) { in evhttp_cancel_request()
2722 TAILQ_REMOVE(&evcon->requests, req, next); in evhttp_cancel_request()
2737 bufferevent_disable(evcon->bufev, EV_WRITE); in evhttp_start_read_()
2738 bufferevent_enable(evcon->bufev, EV_READ); in evhttp_start_read_()
2740 evcon->state = EVCON_READING_FIRSTLINE; in evhttp_start_read_()
2742 bufferevent_setcb(evcon->bufev, in evhttp_start_read_()
2750 if (evbuffer_get_length(bufferevent_get_input(evcon->bufev))) { in evhttp_start_read_()
2752 &evcon->read_more_deferred_cb); in evhttp_start_read_()
2759 bufferevent_disable(evcon->bufev, EV_WRITE); in evhttp_start_write_()
2760 bufferevent_enable(evcon->bufev, EV_READ); in evhttp_start_write_()
2762 evcon->state = EVCON_WRITING; in evhttp_start_write_()
2770 struct evhttp_request *req = TAILQ_FIRST(&evcon->requests); in evhttp_send_done()
2771 TAILQ_REMOVE(&evcon->requests, req, next); in evhttp_send_done()
2773 if (req->on_complete_cb != NULL) { in evhttp_send_done()
2774 req->on_complete_cb(req, req->on_complete_cb_arg); in evhttp_send_done()
2779 !evhttp_is_connection_keepalive(req->input_headers)) || in evhttp_send_done()
2782 EVUTIL_ASSERT(req->flags & EVHTTP_REQ_OWN_CONNECTION); in evhttp_send_done()
2791 if (evhttp_associate_new_request_with_connection(evcon) == -1) { in evhttp_send_done()
2813 evhttp_connection_free(req->evcon); in evhttp_send_error()
2835 struct evhttp_connection *evcon = req->evcon; in evhttp_send()
2842 EVUTIL_ASSERT(TAILQ_FIRST(&evcon->requests) == req); in evhttp_send()
2845 req->userdone = 1; in evhttp_send()
2849 evbuffer_add_buffer(req->output_buffer, databuf); in evhttp_send()
2872 if (req->evcon == NULL) in evhttp_send_reply_start()
2875 if (evhttp_find_header(req->output_headers, "Content-Length") == NULL && in evhttp_send_reply_start()
2880 * note RFC 2616 section 4.4 forbids it with Content-Length: in evhttp_send_reply_start()
2883 evhttp_add_header(req->output_headers, "Transfer-Encoding", in evhttp_send_reply_start()
2885 req->chunked = 1; in evhttp_send_reply_start()
2887 req->chunked = 0; in evhttp_send_reply_start()
2889 evhttp_make_header(req->evcon, req); in evhttp_send_reply_start()
2890 evhttp_write_buffer(req->evcon, NULL, NULL); in evhttp_send_reply_start()
2897 struct evhttp_connection *evcon = req->evcon; in evhttp_send_reply_chunk_with_cb()
2903 output = bufferevent_get_output(evcon->bufev); in evhttp_send_reply_chunk_with_cb()
2909 if (req->chunked) { in evhttp_send_reply_chunk_with_cb()
2914 if (req->chunked) { in evhttp_send_reply_chunk_with_cb()
2928 struct evhttp_connection *evcon = req->evcon; in evhttp_send_reply_end()
2936 output = bufferevent_get_output(evcon->bufev); in evhttp_send_reply_end()
2939 req->userdone = 1; in evhttp_send_reply_end()
2941 if (req->chunked) { in evhttp_send_reply_end()
2943 evhttp_write_buffer(req->evcon, evhttp_send_done, NULL); in evhttp_send_reply_end()
2944 req->chunked = 0; in evhttp_send_reply_end()
2950 evcon->cb = evhttp_send_done; in evhttp_send_reply_end()
2951 evcon->cb_arg = NULL; in evhttp_send_reply_end()
2964 /* 203 */ "Non-Authoritative Information",
2989 /* 408 */ "Request Time-out",
2993 /* 412 */ "Precondition Failed",
2995 /* 414 */ "Request-URI Too Large",
3006 /* 504 */ "Gateway Time-out",
3031 int klass = code / 100 - 1; in evhttp_response_phrase_internal()
3034 /* Unknown class - can't do any better here */ in evhttp_response_phrase_internal()
3038 /* Unknown sub-code, return class name at least */ in evhttp_response_phrase_internal()
3048 req->kind = EVHTTP_RESPONSE; in evhttp_response_code_()
3049 req->response_code = code; in evhttp_response_code_()
3050 if (req->response_code_line != NULL) in evhttp_response_code_()
3051 mm_free(req->response_code_line); in evhttp_response_code_()
3054 req->response_code_line = mm_strdup(reason); in evhttp_response_code_()
3055 if (req->response_code_line == NULL) { in evhttp_response_code_()
3064 if (!req->major || !req->minor) { in evhttp_send_page_()
3065 req->major = 1; in evhttp_send_page_()
3066 req->minor = 1; in evhttp_send_page_()
3069 if (req->kind != EVHTTP_RESPONSE) in evhttp_send_page_()
3072 evhttp_clear_headers(req->output_headers); in evhttp_send_page_()
3073 evhttp_add_header(req->output_headers, "Content-Type", "text/html"); in evhttp_send_page_()
3074 evhttp_add_header(req->output_headers, "Connection", "close"); in evhttp_send_page_()
3151 evbuffer_add(buf, "", 1); /* NUL-terminator. */ in evhttp_uriencode()
3166 return evhttp_uriencode(str, -1, 0); in evhttp_encode_uri()
3171 * If -1, when true we transform plus to space only after we've seen
3172 * a ?. -1 is deprecated.
3220 ret, -1 /*always_decode_plus*/); in evhttp_decode_uri()
3261 int result = -1; in evhttp_parse_query_impl()
3275 /* No arguments - we are done */ in evhttp_parse_query_impl()
3304 event_debug(("Query Param: %s -> %s\n", key, decoded_value)); in evhttp_parse_query_impl()
3343 path = evhttp_uri_get_path(req->uri_elems); in evhttp_dispatch_callback()
3351 if (!strcmp(cb->what, translated)) { in evhttp_dispatch_callback()
3394 matching hostname. If a match is found, and outhttp is non-null,
3405 TAILQ_FOREACH(alias, &http->aliases, next) { in evhttp_find_alias()
3407 if (!evutil_ascii_strcasecmp(alias->alias, hostname)) { in evhttp_find_alias()
3416 TAILQ_FOREACH(vhost, &http->virtualhosts, next_vhost) { in evhttp_find_alias()
3430 If an alias or vhost is matched, 1 is returned, and outhttp, if non-null,
3448 TAILQ_FOREACH(vhost, &http->virtualhosts, next_vhost) { in evhttp_find_vhost()
3449 if (prefix_suffix_match(vhost->vhost_pattern, in evhttp_find_vhost()
3472 req->userdone = 0; in evhttp_handle_request()
3474 bufferevent_disable(req->evcon->bufev, EV_READ); in evhttp_handle_request()
3476 if (req->type == 0 || req->uri == NULL) { in evhttp_handle_request()
3477 evhttp_send_error(req, req->response_code, NULL); in evhttp_handle_request()
3481 if ((http->allowed_methods & req->type) == 0) { in evhttp_handle_request()
3483 (unsigned)req->type, (unsigned)http->allowed_methods)); in evhttp_handle_request()
3494 if ((cb = evhttp_dispatch_callback(&http->callbacks, req)) != NULL) { in evhttp_handle_request()
3495 (*cb->cb)(req, cb->cbarg); in evhttp_handle_request()
3500 if (http->gencb) { in evhttp_handle_request()
3501 (*http->gencb)(req, http->gencbarg); in evhttp_handle_request()
3515 if ((escaped_html = evhttp_htmlescape(req->uri)) == NULL) { in evhttp_handle_request()
3516 evhttp_connection_free(req->evcon); in evhttp_handle_request()
3522 evhttp_connection_free(req->evcon); in evhttp_handle_request()
3554 return (-1); in evhttp_bind_socket()
3565 if ((fd = bind_socket(address, port, 1 /*reuse*/)) == -1) in evhttp_bind_socket_with_handle()
3568 if (listen(fd, 128) == -1) { in evhttp_bind_socket_with_handle()
3579 event_debug(("Bound to port %d - Awaiting connections ... ", in evhttp_bind_socket_with_handle()
3593 return (-1); in evhttp_accept_socket()
3604 TAILQ_FOREACH(bound, &http->sockets, next) in evhttp_foreach_bound_socket()
3616 listener = evconnlistener_new(http->base, NULL, NULL, in evhttp_accept_socket_with_handle()
3640 bound->listener = listener; in evhttp_bind_listener()
3641 TAILQ_INSERT_TAIL(&http->sockets, bound, next); in evhttp_bind_listener()
3650 return evconnlistener_get_fd(bound->listener); in evhttp_bound_socket_get_fd()
3656 return bound->listener; in evhttp_bound_socket_get_listener()
3662 TAILQ_REMOVE(&http->sockets, bound, next); in evhttp_del_accept_socket()
3663 evconnlistener_free(bound->listener); in evhttp_del_accept_socket()
3677 evutil_timerclear(&http->timeout); in evhttp_new_object()
3680 evhttp_set_default_content_type(http, "text/html; charset=ISO-8859-1"); in evhttp_new_object()
3688 TAILQ_INIT(&http->sockets); in evhttp_new_object()
3689 TAILQ_INIT(&http->callbacks); in evhttp_new_object()
3690 TAILQ_INIT(&http->connections); in evhttp_new_object()
3691 TAILQ_INIT(&http->virtualhosts); in evhttp_new_object()
3692 TAILQ_INIT(&http->aliases); in evhttp_new_object()
3705 http->base = base; in evhttp_new()
3722 if (evhttp_bind_socket(http, address, port) == -1) { in evhttp_start()
3740 while ((bound = TAILQ_FIRST(&http->sockets)) != NULL) { in evhttp_free()
3741 TAILQ_REMOVE(&http->sockets, bound, next); in evhttp_free()
3743 evconnlistener_free(bound->listener); in evhttp_free()
3748 while ((evcon = TAILQ_FIRST(&http->connections)) != NULL) { in evhttp_free()
3753 while ((http_cb = TAILQ_FIRST(&http->callbacks)) != NULL) { in evhttp_free()
3754 TAILQ_REMOVE(&http->callbacks, http_cb, next); in evhttp_free()
3755 mm_free(http_cb->what); in evhttp_free()
3759 while ((vhost = TAILQ_FIRST(&http->virtualhosts)) != NULL) { in evhttp_free()
3760 TAILQ_REMOVE(&http->virtualhosts, vhost, next_vhost); in evhttp_free()
3765 if (http->vhost_pattern != NULL) in evhttp_free()
3766 mm_free(http->vhost_pattern); in evhttp_free()
3768 while ((alias = TAILQ_FIRST(&http->aliases)) != NULL) { in evhttp_free()
3769 TAILQ_REMOVE(&http->aliases, alias, next); in evhttp_free()
3770 mm_free(alias->alias); in evhttp_free()
3782 if (vhost->vhost_pattern != NULL || in evhttp_add_virtual_host()
3783 TAILQ_FIRST(&vhost->sockets) != NULL) in evhttp_add_virtual_host()
3784 return (-1); in evhttp_add_virtual_host()
3786 vhost->vhost_pattern = mm_strdup(pattern); in evhttp_add_virtual_host()
3787 if (vhost->vhost_pattern == NULL) in evhttp_add_virtual_host()
3788 return (-1); in evhttp_add_virtual_host()
3790 TAILQ_INSERT_TAIL(&http->virtualhosts, vhost, next_vhost); in evhttp_add_virtual_host()
3798 if (vhost->vhost_pattern == NULL) in evhttp_remove_virtual_host()
3799 return (-1); in evhttp_remove_virtual_host()
3801 TAILQ_REMOVE(&http->virtualhosts, vhost, next_vhost); in evhttp_remove_virtual_host()
3803 mm_free(vhost->vhost_pattern); in evhttp_remove_virtual_host()
3804 vhost->vhost_pattern = NULL; in evhttp_remove_virtual_host()
3816 return -1; in evhttp_add_server_alias()
3818 evalias->alias = mm_strdup(alias); in evhttp_add_server_alias()
3819 if (!evalias->alias) { in evhttp_add_server_alias()
3821 return -1; in evhttp_add_server_alias()
3824 TAILQ_INSERT_TAIL(&http->aliases, evalias, next); in evhttp_add_server_alias()
3834 TAILQ_FOREACH(evalias, &http->aliases, next) { in evhttp_remove_server_alias()
3835 if (evutil_ascii_strcasecmp(evalias->alias, alias) == 0) { in evhttp_remove_server_alias()
3836 TAILQ_REMOVE(&http->aliases, evalias, next); in evhttp_remove_server_alias()
3837 mm_free(evalias->alias); in evhttp_remove_server_alias()
3843 return -1; in evhttp_remove_server_alias()
3849 if (timeout_in_secs == -1) { in evhttp_set_timeout()
3863 http->timeout = *tv; in evhttp_set_timeout_tv()
3865 evutil_timerclear(&http->timeout); in evhttp_set_timeout_tv()
3876 http->flags &= ~avail_flags; in evhttp_set_flags()
3878 http->flags |= flags; in evhttp_set_flags()
3887 http->default_max_headers_size = EV_SIZE_MAX; in evhttp_set_max_headers_size()
3889 http->default_max_headers_size = max_headers_size; in evhttp_set_max_headers_size()
3896 http->default_max_body_size = EV_UINT64_MAX; in evhttp_set_max_body_size()
3898 http->default_max_body_size = max_body_size; in evhttp_set_max_body_size()
3904 http->default_content_type = content_type; in evhttp_set_default_content_type()
3910 http->allowed_methods = methods; in evhttp_set_allowed_methods()
3919 TAILQ_FOREACH(http_cb, &http->callbacks, next) { in evhttp_set_cb()
3920 if (strcmp(http_cb->what, uri) == 0) in evhttp_set_cb()
3921 return (-1); in evhttp_set_cb()
3926 return (-2); in evhttp_set_cb()
3929 http_cb->what = mm_strdup(uri); in evhttp_set_cb()
3930 if (http_cb->what == NULL) { in evhttp_set_cb()
3933 return (-3); in evhttp_set_cb()
3935 http_cb->cb = cb; in evhttp_set_cb()
3936 http_cb->cbarg = cbarg; in evhttp_set_cb()
3938 TAILQ_INSERT_TAIL(&http->callbacks, http_cb, next); in evhttp_set_cb()
3948 TAILQ_FOREACH(http_cb, &http->callbacks, next) { in evhttp_del_cb()
3949 if (strcmp(http_cb->what, uri) == 0) in evhttp_del_cb()
3953 return (-1); in evhttp_del_cb()
3955 TAILQ_REMOVE(&http->callbacks, http_cb, next); in evhttp_del_cb()
3956 mm_free(http_cb->what); in evhttp_del_cb()
3966 http->gencb = cb; in evhttp_set_gencb()
3967 http->gencbarg = cbarg; in evhttp_set_gencb()
3974 http->bevcb = cb; in evhttp_set_bevcb()
3975 http->bevcbarg = cbarg; in evhttp_set_bevcb()
3993 req->headers_size = 0; in evhttp_request_new()
3994 req->body_size = 0; in evhttp_request_new()
3996 req->kind = EVHTTP_RESPONSE; in evhttp_request_new()
3997 req->input_headers = mm_calloc(1, sizeof(struct evkeyvalq)); in evhttp_request_new()
3998 if (req->input_headers == NULL) { in evhttp_request_new()
4002 TAILQ_INIT(req->input_headers); in evhttp_request_new()
4004 req->output_headers = mm_calloc(1, sizeof(struct evkeyvalq)); in evhttp_request_new()
4005 if (req->output_headers == NULL) { in evhttp_request_new()
4009 TAILQ_INIT(req->output_headers); in evhttp_request_new()
4011 if ((req->input_buffer = evbuffer_new()) == NULL) { in evhttp_request_new()
4016 if ((req->output_buffer = evbuffer_new()) == NULL) { in evhttp_request_new()
4021 req->cb = cb; in evhttp_request_new()
4022 req->cb_arg = arg; in evhttp_request_new()
4035 if ((req->flags & EVHTTP_REQ_DEFER_FREE) != 0) { in evhttp_request_free()
4036 req->flags |= EVHTTP_REQ_NEEDS_FREE; in evhttp_request_free()
4040 if (req->remote_host != NULL) in evhttp_request_free()
4041 mm_free(req->remote_host); in evhttp_request_free()
4042 if (req->uri != NULL) in evhttp_request_free()
4043 mm_free(req->uri); in evhttp_request_free()
4044 if (req->uri_elems != NULL) in evhttp_request_free()
4045 evhttp_uri_free(req->uri_elems); in evhttp_request_free()
4046 if (req->response_code_line != NULL) in evhttp_request_free()
4047 mm_free(req->response_code_line); in evhttp_request_free()
4048 if (req->host_cache != NULL) in evhttp_request_free()
4049 mm_free(req->host_cache); in evhttp_request_free()
4051 evhttp_clear_headers(req->input_headers); in evhttp_request_free()
4052 mm_free(req->input_headers); in evhttp_request_free()
4054 evhttp_clear_headers(req->output_headers); in evhttp_request_free()
4055 mm_free(req->output_headers); in evhttp_request_free()
4057 if (req->input_buffer != NULL) in evhttp_request_free()
4058 evbuffer_free(req->input_buffer); in evhttp_request_free()
4060 if (req->output_buffer != NULL) in evhttp_request_free()
4061 evbuffer_free(req->output_buffer); in evhttp_request_free()
4069 req->flags |= EVHTTP_USER_OWNED; in evhttp_request_own()
4075 return (req->flags & EVHTTP_USER_OWNED) != 0; in evhttp_request_is_owned()
4081 return req->evcon; in evhttp_request_get_connection()
4087 return conn->base; in evhttp_connection_get_base()
4094 req->chunk_cb = cb; in evhttp_request_set_chunked_cb()
4101 req->header_cb = cb; in evhttp_request_set_header_cb()
4108 req->error_cb = cb; in evhttp_request_set_error_cb()
4115 req->on_complete_cb = cb; in evhttp_request_set_on_complete_cb()
4116 req->on_complete_cb_arg = cb_arg; in evhttp_request_set_on_complete_cb()
4125 if (req->uri == NULL) in evhttp_request_get_uri()
4127 return (req->uri); in evhttp_request_get_uri()
4132 if (req->uri_elems == NULL) in evhttp_request_get_evhttp_uri()
4135 return (req->uri_elems); in evhttp_request_get_evhttp_uri()
4143 if (req->host_cache) in evhttp_request_get_host()
4144 return req->host_cache; in evhttp_request_get_host()
4146 if (req->uri_elems) in evhttp_request_get_host()
4147 host = evhttp_uri_get_host(req->uri_elems); in evhttp_request_get_host()
4148 if (!host && req->input_headers) { in evhttp_request_get_host()
4152 host = evhttp_find_header(req->input_headers, "Host"); in evhttp_request_get_host()
4156 p = host + strlen(host) - 1; in evhttp_request_get_host()
4158 --p; in evhttp_request_get_host()
4160 len = p - host; in evhttp_request_get_host()
4161 req->host_cache = mm_malloc(len + 1); in evhttp_request_get_host()
4162 if (!req->host_cache) { in evhttp_request_get_host()
4166 memcpy(req->host_cache, host, len); in evhttp_request_get_host()
4167 req->host_cache[len] = '\0'; in evhttp_request_get_host()
4168 host = req->host_cache; in evhttp_request_get_host()
4178 return (req->type); in evhttp_request_get_command()
4184 return req->response_code; in evhttp_request_get_response_code()
4190 return req->response_code_line; in evhttp_request_get_response_code_line()
4196 return (req->input_headers); in evhttp_request_get_input_headers()
4202 return (req->output_headers); in evhttp_request_get_output_headers()
4208 return (req->input_buffer); in evhttp_request_get_input_buffer()
4214 return (req->output_buffer); in evhttp_request_get_output_buffer()
4233 if (sa->sa_family == AF_UNIX) { in evhttp_get_request_connection()
4235 sa_un->sun_path[0] = '\0'; in evhttp_get_request_connection()
4250 if (http->bevcb != NULL) { in evhttp_get_request_connection()
4251 bev = (*http->bevcb)(http->base, http->bevcbarg); in evhttp_get_request_connection()
4254 http->base, NULL, bev, hostname, atoi(portname)); in evhttp_get_request_connection()
4260 evcon->max_headers_size = http->default_max_headers_size; in evhttp_get_request_connection()
4261 evcon->max_body_size = http->default_max_body_size; in evhttp_get_request_connection()
4262 if (http->flags & EVHTTP_SERVER_LINGERING_CLOSE) in evhttp_get_request_connection()
4263 evcon->flags |= EVHTTP_CON_LINGERING_CLOSE; in evhttp_get_request_connection()
4265 evcon->flags |= EVHTTP_CON_INCOMING; in evhttp_get_request_connection()
4266 evcon->state = EVCON_READING_FIRSTLINE; in evhttp_get_request_connection()
4268 evcon->fd = fd; in evhttp_get_request_connection()
4270 if (bufferevent_setfd(evcon->bufev, fd)) in evhttp_get_request_connection()
4272 if (bufferevent_enable(evcon->bufev, EV_READ)) in evhttp_get_request_connection()
4274 if (bufferevent_disable(evcon->bufev, EV_WRITE)) in evhttp_get_request_connection()
4276 bufferevent_socket_set_conn_address_(evcon->bufev, sa, salen); in evhttp_get_request_connection()
4288 struct evhttp *http = evcon->http_server; in evhttp_associate_new_request_with_connection()
4291 return (-1); in evhttp_associate_new_request_with_connection()
4293 if ((req->remote_host = mm_strdup(evcon->address)) == NULL) { in evhttp_associate_new_request_with_connection()
4296 return (-1); in evhttp_associate_new_request_with_connection()
4298 req->remote_port = evcon->port; in evhttp_associate_new_request_with_connection()
4300 req->evcon = evcon; /* the request ends up owning the connection */ in evhttp_associate_new_request_with_connection()
4301 req->flags |= EVHTTP_REQ_OWN_CONNECTION; in evhttp_associate_new_request_with_connection()
4308 req->userdone = 1; in evhttp_associate_new_request_with_connection()
4310 TAILQ_INSERT_TAIL(&evcon->requests, req, next); in evhttp_associate_new_request_with_connection()
4312 req->kind = EVHTTP_REQUEST; in evhttp_associate_new_request_with_connection()
4334 /* the timeout can be used by the server to close idle connections */ in evhttp_get_request()
4335 if (evutil_timerisset(&http->timeout)) in evhttp_get_request()
4336 evhttp_connection_set_timeout_tv(evcon, &http->timeout); in evhttp_get_request()
4342 evcon->http_server = http; in evhttp_get_request()
4343 TAILQ_INSERT_TAIL(&http->connections, evcon, next); in evhttp_get_request()
4345 if (evhttp_associate_new_request_with_connection(evcon) == -1) in evhttp_get_request()
4390 /* Create a non-blocking socket and bind it */
4400 fd = evutil_socket_(ai ? ai->ai_family : AF_INET, in create_bind_socket_nonblock()
4402 if (fd == -1) { in create_bind_socket_nonblock()
4403 event_sock_warn(-1, "socket"); in create_bind_socket_nonblock()
4404 return (-1); in create_bind_socket_nonblock()
4415 r = bind(fd, ai->ai_addr, (ev_socklen_t)ai->ai_addrlen); in create_bind_socket_nonblock()
4416 if (r == -1) in create_bind_socket_nonblock()
4426 return (-1); in create_bind_socket_nonblock()
4471 return (-1); in bind_socket()
4496 uri->port = -1; in evhttp_uri_new()
4503 uri->flags = flags; in evhttp_uri_set_flags()
4512 /* scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) */ in scheme_ok()
4520 *s != '+' && *s != '-' && *s != '.') in scheme_ok()
4570 return -1; in parse_port()
4571 portnum = (portnum * 10) + (*s - '0'); in parse_port()
4573 return -1; in parse_port()
4575 return -1; in parse_port()
4585 if (s + 3 > eos || *s != '[' || *(eos-1) != ']') in bracket_addr_ok()
4589 "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" ) in bracket_addr_ok()
4592 --eos; in bracket_addr_ok()
4616 ev_ssize_t n_chars = eos-s-2; in bracket_addr_ok()
4632 uri->host = mm_strdup(""); in parse_authority()
4633 if (uri->host == NULL) { in parse_authority()
4635 return -1; in parse_authority()
4645 return -1; in parse_authority()
4647 uri->userinfo = mm_strdup(s); in parse_authority()
4648 if (uri->userinfo == NULL) { in parse_authority()
4650 return -1; in parse_authority()
4656 for (port=eos-1; port >= cp && EVUTIL_ISDIGIT_(*port); --port) in parse_authority()
4661 uri->port = -1; in parse_authority()
4662 else if ((uri->port = parse_port(port+1, eos))<0) in parse_authority()
4663 return -1; in parse_authority()
4667 * an IP-Literal, or a reg-name */ in parse_authority()
4669 if (*cp == '[' && eos >= cp+2 && *(eos-1) == ']') { in parse_authority()
4670 /* IPv6address, IP-Literal, or junk. */ in parse_authority()
4672 return -1; in parse_authority()
4675 if (! regname_ok(cp,eos)) /* Match IPv4Address or reg-name */ in parse_authority()
4676 return -1; in parse_authority()
4678 uri->host = mm_malloc(eos-cp+1); in parse_authority()
4679 if (uri->host == NULL) { in parse_authority()
4681 return -1; in parse_authority()
4683 memcpy(uri->host, cp, eos-cp); in parse_authority()
4684 uri->host[eos-cp] = '\0'; in parse_authority()
4782 uri->port = -1; in evhttp_uri_parse_with_flags()
4783 uri->flags = flags; in evhttp_uri_parse_with_flags()
4797 URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] in evhttp_uri_parse_with_flags()
4799 relative-ref = relative-part [ "?" query ] [ "#" fragment ] in evhttp_uri_parse_with_flags()
4806 uri->scheme = mm_strdup(readp); in evhttp_uri_parse_with_flags()
4807 if (uri->scheme == NULL) { in evhttp_uri_parse_with_flags()
4826 /* 3. Query: path-abempty, path-absolute, path-rootless, or path-empty in evhttp_uri_parse_with_flags()
4858 /* (End of maybe-unreachable cases) */ in evhttp_uri_parse_with_flags()
4862 if (! uri->scheme && !path_matches_noscheme(path)) in evhttp_uri_parse_with_flags()
4866 uri->path = mm_strdup(path); in evhttp_uri_parse_with_flags()
4867 if (uri->path == NULL) { in evhttp_uri_parse_with_flags()
4873 uri->query = mm_strdup(query); in evhttp_uri_parse_with_flags()
4874 if (uri->query == NULL) { in evhttp_uri_parse_with_flags()
4880 uri->fragment = mm_strdup(fragment); in evhttp_uri_parse_with_flags()
4881 if (uri->fragment == NULL) { in evhttp_uri_parse_with_flags()
4908 uri->port = -1; in evhttp_uri_parse_authority()
4909 uri->flags = 0; in evhttp_uri_parse_authority()
4915 uri->path = mm_strdup(""); in evhttp_uri_parse_authority()
4916 if (uri->path == NULL) { in evhttp_uri_parse_authority()
4932 if (uri->f) { \ in evhttp_uri_free()
4933 mm_free(uri->f); \ in evhttp_uri_free()
4954 #define URI_ADD_(f) evbuffer_add(tmp, uri->f, strlen(uri->f)) in evhttp_uri_join()
4963 if (uri->scheme) { in evhttp_uri_join()
4967 if (uri->host) { in evhttp_uri_join()
4969 if (uri->userinfo) in evhttp_uri_join()
4970 evbuffer_add_printf(tmp,"%s@", uri->userinfo); in evhttp_uri_join()
4972 if (uri->port >= 0) in evhttp_uri_join()
4973 evbuffer_add_printf(tmp,":%d", uri->port); in evhttp_uri_join()
4975 if (uri->path && uri->path[0] != '/' && uri->path[0] != '\0') in evhttp_uri_join()
4979 if (uri->path) in evhttp_uri_join()
4982 if (uri->query) { in evhttp_uri_join()
4987 if (uri->fragment) { in evhttp_uri_join()
5014 return uri->scheme; in evhttp_uri_get_scheme()
5019 return uri->userinfo; in evhttp_uri_get_userinfo()
5024 return uri->host; in evhttp_uri_get_host()
5029 return uri->port; in evhttp_uri_get_port()
5034 return uri->path; in evhttp_uri_get_path()
5039 return uri->query; in evhttp_uri_get_query()
5044 return uri->fragment; in evhttp_uri_get_fragment()
5048 if (uri->f) \
5049 mm_free(uri->f); \
5051 if ((uri->f = mm_strdup(f)) == NULL) { \
5053 return -1; \
5056 uri->f = NULL; \
5064 return -1; in evhttp_uri_set_scheme()
5073 return -1; in evhttp_uri_set_userinfo()
5083 return -1; in evhttp_uri_set_host()
5086 return -1; in evhttp_uri_set_host()
5096 if (port < -1) in evhttp_uri_set_port()
5097 return -1; in evhttp_uri_set_port()
5098 uri->port = port; in evhttp_uri_set_port()
5107 if (path && end_of_cpath(path, PART_PATH, uri->flags) != path+strlen(path)) in evhttp_uri_set_path()
5108 return -1; in evhttp_uri_set_path()
5116 if (query && end_of_cpath(query, PART_QUERY, uri->flags) != query+strlen(query)) in evhttp_uri_set_query()
5117 return -1; in evhttp_uri_set_query()
5124 if (fragment && end_of_cpath(fragment, PART_FRAGMENT, uri->flags) != fragment+strlen(fragment)) in evhttp_uri_set_fragment()
5125 return -1; in evhttp_uri_set_fragment()