Lines Matching refs:req

166 #define REQ_VERSION_BEFORE(req, major_v, minor_v)			\  argument
167 ((req)->major < (major_v) || \
168 ((req)->major == (major_v) && (req)->minor < (minor_v)))
170 #define REQ_VERSION_ATLEAST(req, major_v, minor_v) \ argument
171 ((req)->major > (major_v) || \
172 ((req)->major == (major_v) && (req)->minor >= (minor_v)))
192 struct evhttp_request *req);
194 struct evhttp_request *req);
356 evhttp_response_needs_body(struct evhttp_request *req) in evhttp_response_needs_body() argument
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()
399 struct evhttp_request *req) in evhttp_send_continue() argument
404 req->major, req->minor); in evhttp_send_continue()
439 struct evhttp_request *req) in evhttp_make_header_request() argument
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()
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()
480 evhttp_is_request_connection_close(struct evhttp_request *req) in evhttp_is_request_connection_close() argument
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()
532 struct evhttp_request *req) in evhttp_make_header_response() argument
534 int is_keepalive = evhttp_is_connection_keepalive(req->input_headers); 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()
548 if (req->minor == 0 && is_keepalive) in evhttp_make_header_response()
549 evhttp_add_header(req->output_headers, in evhttp_make_header_response()
552 if ((req->minor >= 1 || is_keepalive) && in evhttp_make_header_response()
553 evhttp_response_needs_body(req)) { 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()
566 if (evhttp_response_needs_body(req)) { in evhttp_make_header_response()
567 if (evhttp_find_header(req->output_headers, in evhttp_make_header_response()
570 evhttp_add_header(req->output_headers, 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()
586 static enum expect evhttp_have_expect(struct evhttp_request *req, int input) in evhttp_have_expect() argument
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()
606 evhttp_make_header(struct evhttp_connection *evcon, struct evhttp_request *req) in evhttp_make_header() argument
615 if (req->kind == EVHTTP_REQUEST) { in evhttp_make_header()
616 evhttp_make_header_request(evcon, req); in evhttp_make_header()
618 evhttp_make_header_response(evcon, req); in evhttp_make_header()
621 TAILQ_FOREACH(header, req->output_headers, next) { in evhttp_make_header()
627 if (evhttp_have_expect(req, 0) != CONTINUE && 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()
657 evhttp_connection_incoming_fail(struct evhttp_request *req, in evhttp_connection_incoming_fail() argument
662 req->response_code = HTTP_ENTITYTOOLARGE; in evhttp_connection_incoming_fail()
665 req->response_code = HTTP_BADREQUEST; 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()
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()
716 evhttp_request_free_auto(struct evhttp_request *req) in evhttp_request_free_auto() argument
718 if (!(req->flags & EVHTTP_USER_OWNED)) in evhttp_request_free_auto()
719 evhttp_request_free(req); in evhttp_request_free_auto()
723 evhttp_request_free_(struct evhttp_connection *evcon, struct evhttp_request *req) in evhttp_request_free_() argument
725 TAILQ_REMOVE(&evcon->requests, req, next); in evhttp_request_free_()
726 evhttp_request_free_auto(req); in evhttp_request_free_()
738 struct evhttp_request* req = TAILQ_FIRST(&evcon->requests); in evhttp_connection_fail_() local
743 EVUTIL_ASSERT(req != NULL); 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_()
777 evhttp_request_free_(evcon, req); in evhttp_connection_fail_()
826 struct evhttp_request *req = TAILQ_FIRST(&evcon->requests); in evhttp_connection_done() local
832 int need_close = evhttp_is_request_connection_close(req); in evhttp_connection_done()
833 TAILQ_REMOVE(&evcon->requests, req, next); in evhttp_connection_done()
834 req->evcon = NULL; in evhttp_connection_done()
873 (*req->cb)(req, req->cb_arg); in evhttp_connection_done()
877 evhttp_request_free_auto(req); in evhttp_connection_done()
906 evhttp_handle_chunked_read(struct evhttp_request *req, struct evbuffer *buf) in evhttp_handle_chunked_read() argument
908 if (req == NULL || buf == NULL) { in evhttp_handle_chunked_read()
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()
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()
997 evhttp_read_trailer(struct evhttp_connection *evcon, struct evhttp_request *req) in evhttp_read_trailer() argument
1001 switch (evhttp_parse_headers_(req, buf)) { in evhttp_read_trailer()
1019 struct evhttp_request *req) in evhttp_lingering_close() argument
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()
1038 struct evhttp_request *req) in evhttp_lingering_fail() argument
1041 evhttp_lingering_close(evcon, req); in evhttp_lingering_fail()
1047 evhttp_read_body(struct evhttp_connection *evcon, struct evhttp_request *req) in evhttp_read_body() argument
1051 if (req->chunked) { in evhttp_read_body()
1052 switch (evhttp_handle_chunked_read(req, buf)) { in evhttp_read_body()
1056 evhttp_read_trailer(evcon, req); in evhttp_read_body()
1066 evhttp_request_free_auto(req); 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()
1100 evhttp_lingering_fail(evcon, req); 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()
1111 evhttp_request_free_auto(req); in evhttp_read_body()
1116 if (!req->ntoread) { in evhttp_read_body()
1135 struct evhttp_request *req = TAILQ_FIRST(&evcon->requests); in evhttp_read_cb() local
1143 evhttp_read_firstline(evcon, req); in evhttp_read_cb()
1148 evhttp_read_header(evcon, req); in evhttp_read_cb()
1153 evhttp_read_body(evcon, req); in evhttp_read_cb()
1158 evhttp_read_trailer(evcon, req); in evhttp_read_cb()
1199 struct evhttp_request *req = TAILQ_FIRST(&evcon->requests); in evhttp_write_connectioncb() local
1201 EVUTIL_ASSERT(req != NULL); in evhttp_write_connectioncb()
1211 req->kind = EVHTTP_RESPONSE; in evhttp_write_connectioncb()
1223 struct evhttp_request *req; in evhttp_connection_free() local
1237 while ((req = TAILQ_FIRST(&evcon->requests)) != NULL) { in evhttp_connection_free()
1238 evhttp_request_free_(evcon, req); in evhttp_connection_free()
1305 struct evhttp_request *req = TAILQ_FIRST(&evcon->requests); in evhttp_request_dispatch() local
1308 if (req == NULL) in evhttp_request_dispatch()
1311 EVUTIL_ASSERT(req->kind == EVHTTP_REQUEST); in evhttp_request_dispatch()
1322 evhttp_make_header(evcon, req); in evhttp_request_dispatch()
1456 struct evhttp_request *req) in evhttp_connection_read_on_write_error() argument
1467 req->kind = EVHTTP_RESPONSE; in evhttp_connection_read_on_write_error()
1482 struct evhttp_request *req = TAILQ_FIRST(&evcon->requests); in evhttp_error_cb() local
1500 if (!req->chunked && req->ntoread < 0 in evhttp_error_cb()
1549 evhttp_connection_read_on_write_error(evcon, req); in evhttp_error_cb()
1664 evhttp_parse_http_version(const char *version, struct evhttp_request *req) in evhttp_parse_http_version() argument
1671 __func__, version, req, req->remote_host)); in evhttp_parse_http_version()
1674 req->major = major; in evhttp_parse_http_version()
1675 req->minor = minor; in evhttp_parse_http_version()
1682 evhttp_parse_response_line(struct evhttp_request *req, char *line) in evhttp_parse_response_line() argument
1695 if (evhttp_parse_http_version(protocol, req) < 0) 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()
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()
1718 evhttp_parse_request_line(struct evhttp_request *req, char *line, size_t len) in evhttp_parse_request_line() argument
1858 __func__, method, req, req->remote_host)); in evhttp_parse_request_line()
1863 req->type = type; in evhttp_parse_request_line()
1865 if (evhttp_parse_http_version(version, req) < 0) in evhttp_parse_request_line()
1868 if ((req->uri = mm_strdup(uri)) == NULL) { in evhttp_parse_request_line()
1874 if ((req->uri_elems = evhttp_uri_parse_authority(req->uri)) == NULL) { in evhttp_parse_request_line()
1878 if ((req->uri_elems = evhttp_uri_parse_with_flags(req->uri, 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()
2025 evhttp_parse_firstline_(struct evhttp_request *req, struct evbuffer *buffer) in evhttp_parse_firstline_() argument
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_()
2096 evhttp_parse_headers_(struct evhttp_request *req, struct evbuffer* buffer) in evhttp_parse_headers_() argument
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_()
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_()
2159 evhttp_get_body_length(struct evhttp_request *req) in evhttp_get_body_length() argument
2161 struct evkeyvalq *headers = req->input_headers; 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()
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()
2215 evhttp_get_body(struct evhttp_connection *evcon, struct evhttp_request *req) in evhttp_get_body() argument
2220 if (req->kind == EVHTTP_REQUEST && in evhttp_get_body()
2221 !evhttp_method_may_have_body(req->type)) { 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()
2244 switch (evhttp_have_expect(req, 1)) { 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()
2256 evhttp_lingering_fail(evcon, req); in evhttp_get_body()
2261 evhttp_send_continue(evcon, req); in evhttp_get_body()
2264 evhttp_send_error(req, HTTP_EXPECTATIONFAILED, NULL); in evhttp_get_body()
2269 evhttp_read_body(evcon, req); in evhttp_get_body()
2275 struct evhttp_request *req) in evhttp_read_firstline() argument
2279 res = evhttp_parse_firstline_(req, bufferevent_get_input(evcon->bufev)); in evhttp_read_firstline()
2292 evhttp_read_header(evcon, req); in evhttp_read_firstline()
2297 struct evhttp_request *req) in evhttp_read_header() argument
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()
2327 evhttp_get_body(evcon, req); in evhttp_read_header()
2333 if (req->response_code == 100) { in evhttp_read_header()
2335 evbuffer_add_buffer(output, req->output_buffer); in evhttp_read_header()
2339 if (!evhttp_response_needs_body(req)) { 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()
2347 evhttp_get_body(evcon, req); in evhttp_read_header()
2649 struct evhttp_request *req, in evhttp_make_request() argument
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()
2659 evhttp_request_free_auto(req); 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()
2687 TAILQ_REMOVE(&evcon->requests, req, next); in evhttp_make_request()
2697 if (TAILQ_FIRST(&evcon->requests) == req) in evhttp_make_request()
2704 evhttp_cancel_request(struct evhttp_request *req) in evhttp_cancel_request() argument
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()
2726 evhttp_request_free_auto(req); in evhttp_cancel_request()
2770 struct evhttp_request *req = TAILQ_FIRST(&evcon->requests); in evhttp_send_done() local
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()
2778 (REQ_VERSION_BEFORE(req, 1, 1) && in evhttp_send_done()
2779 !evhttp_is_connection_keepalive(req->input_headers)) || in evhttp_send_done()
2780 evhttp_is_request_connection_close(req); in evhttp_send_done()
2782 EVUTIL_ASSERT(req->flags & EVHTTP_REQ_OWN_CONNECTION); in evhttp_send_done()
2783 evhttp_request_free(req); in evhttp_send_done()
2801 evhttp_send_error(struct evhttp_request *req, int error, const char *reason) in evhttp_send_error() argument
2813 evhttp_connection_free(req->evcon); in evhttp_send_error()
2820 evhttp_response_code_(req, error, reason); in evhttp_send_error()
2824 evhttp_send_page_(req, buf); in evhttp_send_error()
2833 evhttp_send(struct evhttp_request *req, struct evbuffer *databuf) in evhttp_send() argument
2835 struct evhttp_connection *evcon = req->evcon; in evhttp_send()
2838 evhttp_request_free(req); 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()
2852 evhttp_make_header(evcon, req); in evhttp_send()
2858 evhttp_send_reply(struct evhttp_request *req, int code, const char *reason, in evhttp_send_reply() argument
2861 evhttp_response_code_(req, code, reason); in evhttp_send_reply()
2863 evhttp_send(req, databuf); in evhttp_send_reply()
2867 evhttp_send_reply_start(struct evhttp_request *req, int code, in evhttp_send_reply_start() argument
2870 evhttp_response_code_(req, code, reason); in evhttp_send_reply_start()
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()
2876 REQ_VERSION_ATLEAST(req, 1, 1) && in evhttp_send_reply_start()
2877 evhttp_response_needs_body(req)) { 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()
2894 evhttp_send_reply_chunk_with_cb(struct evhttp_request *req, struct evbuffer *databuf, in evhttp_send_reply_chunk_with_cb() argument
2897 struct evhttp_connection *evcon = req->evcon; in evhttp_send_reply_chunk_with_cb()
2907 if (!evhttp_response_needs_body(req)) 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()
2921 evhttp_send_reply_chunk(struct evhttp_request *req, struct evbuffer *databuf) in evhttp_send_reply_chunk() argument
2923 evhttp_send_reply_chunk_with_cb(req, databuf, NULL, NULL); in evhttp_send_reply_chunk()
2926 evhttp_send_reply_end(struct evhttp_request *req) in evhttp_send_reply_end() argument
2928 struct evhttp_connection *evcon = req->evcon; in evhttp_send_reply_end()
2932 evhttp_request_free(req); 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()
3046 evhttp_response_code_(struct evhttp_request *req, int code, const char *reason) in evhttp_response_code_() argument
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_()
3062 evhttp_send_page_(struct evhttp_request *req, struct evbuffer *databuf) in evhttp_send_page_() argument
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_()
3070 evhttp_response_code_(req, 200, "OK"); 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_()
3076 evhttp_send(req, databuf); in evhttp_send_page_()
3335 evhttp_dispatch_callback(struct httpcbq *callbacks, struct evhttp_request *req) in evhttp_dispatch_callback() argument
3343 path = evhttp_uri_get_path(req->uri_elems); in evhttp_dispatch_callback()
3465 evhttp_handle_request(struct evhttp_request *req, void *arg) in evhttp_handle_request() argument
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()
3484 evhttp_send_error(req, HTTP_NOTIMPLEMENTED, NULL); in evhttp_handle_request()
3489 hostname = evhttp_request_get_host(req); 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()
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()
3526 evhttp_response_code_(req, HTTP_NOTFOUND, "Not Found"); in evhttp_handle_request()
3532 evhttp_send_page_(req, buf); in evhttp_handle_request()
3985 struct evhttp_request *req = NULL; in evhttp_request_new() local
3988 if ((req = mm_calloc(1, sizeof(struct evhttp_request))) == NULL) { in evhttp_request_new()
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()
4024 return (req); in evhttp_request_new()
4027 if (req != NULL) in evhttp_request_new()
4028 evhttp_request_free(req); in evhttp_request_new()
4033 evhttp_request_free(struct evhttp_request *req) in evhttp_request_free() argument
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()
4063 mm_free(req); in evhttp_request_free()
4067 evhttp_request_own(struct evhttp_request *req) in evhttp_request_own() argument
4069 req->flags |= EVHTTP_USER_OWNED; in evhttp_request_own()
4073 evhttp_request_is_owned(struct evhttp_request *req) in evhttp_request_is_owned() argument
4075 return (req->flags & EVHTTP_USER_OWNED) != 0; in evhttp_request_is_owned()
4079 evhttp_request_get_connection(struct evhttp_request *req) in evhttp_request_get_connection() argument
4081 return req->evcon; in evhttp_request_get_connection()
4091 evhttp_request_set_chunked_cb(struct evhttp_request *req, in evhttp_request_set_chunked_cb() argument
4094 req->chunk_cb = cb; in evhttp_request_set_chunked_cb()
4098 evhttp_request_set_header_cb(struct evhttp_request *req, in evhttp_request_set_header_cb() argument
4101 req->header_cb = cb; in evhttp_request_set_header_cb()
4105 evhttp_request_set_error_cb(struct evhttp_request *req, in evhttp_request_set_error_cb() argument
4108 req->error_cb = cb; in evhttp_request_set_error_cb()
4112 evhttp_request_set_on_complete_cb(struct evhttp_request *req, in evhttp_request_set_on_complete_cb() argument
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()
4124 evhttp_request_get_uri(const struct evhttp_request *req) { in evhttp_request_get_uri() argument
4125 if (req->uri == NULL) in evhttp_request_get_uri()
4126 event_debug(("%s: request %p has no uri\n", __func__, req)); in evhttp_request_get_uri()
4127 return (req->uri); in evhttp_request_get_uri()
4131 evhttp_request_get_evhttp_uri(const struct evhttp_request *req) { in evhttp_request_get_evhttp_uri() argument
4132 if (req->uri_elems == NULL) in evhttp_request_get_evhttp_uri()
4134 __func__, req)); in evhttp_request_get_evhttp_uri()
4135 return (req->uri_elems); in evhttp_request_get_evhttp_uri()
4139 evhttp_request_get_host(struct evhttp_request *req) in evhttp_request_get_host() argument
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()
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()
4177 evhttp_request_get_command(const struct evhttp_request *req) { in evhttp_request_get_command() argument
4178 return (req->type); in evhttp_request_get_command()
4182 evhttp_request_get_response_code(const struct evhttp_request *req) in evhttp_request_get_response_code() argument
4184 return req->response_code; in evhttp_request_get_response_code()
4188 evhttp_request_get_response_code_line(const struct evhttp_request *req) in evhttp_request_get_response_code_line() argument
4190 return req->response_code_line; in evhttp_request_get_response_code_line()
4194 struct evkeyvalq *evhttp_request_get_input_headers(struct evhttp_request *req) in evhttp_request_get_input_headers() argument
4196 return (req->input_headers); in evhttp_request_get_input_headers()
4200 struct evkeyvalq *evhttp_request_get_output_headers(struct evhttp_request *req) in evhttp_request_get_output_headers() argument
4202 return (req->output_headers); in evhttp_request_get_output_headers()
4206 struct evbuffer *evhttp_request_get_input_buffer(struct evhttp_request *req) in evhttp_request_get_input_buffer() argument
4208 return (req->input_buffer); in evhttp_request_get_input_buffer()
4212 struct evbuffer *evhttp_request_get_output_buffer(struct evhttp_request *req) in evhttp_request_get_output_buffer() argument
4214 return (req->output_buffer); in evhttp_request_get_output_buffer()
4289 struct evhttp_request *req; in evhttp_associate_new_request_with_connection() local
4290 if ((req = evhttp_request_new(evhttp_handle_request, http)) == NULL) in evhttp_associate_new_request_with_connection()
4293 if ((req->remote_host = mm_strdup(evcon->address)) == NULL) { in evhttp_associate_new_request_with_connection()
4295 evhttp_request_free(req); 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()