Lines Matching refs:evcon

204 	struct evhttp_connection *evcon);
206 struct evhttp_connection *evcon);
208 struct evhttp_connection *evcon);
209 static void evhttp_request_dispatch(struct evhttp_connection* evcon);
210 static void evhttp_read_firstline(struct evhttp_connection *evcon,
212 static void evhttp_read_header(struct evhttp_connection *evcon,
338 evhttp_write_buffer(struct evhttp_connection *evcon,
344 evcon->cb = cb;
345 evcon->cb_arg = arg;
348 if (event_pending(&evcon->ev, EV_WRITE|EV_TIMEOUT, NULL))
349 event_del(&evcon->ev);
351 event_set(&evcon->ev, evcon->fd, EV_WRITE, evhttp_write, evcon);
352 EVHTTP_BASE_SET(evcon, &evcon->ev);
353 evhttp_add_event(&evcon->ev, evcon->timeout, HTTP_WRITE_TIMEOUT);
357 evhttp_connected(struct evhttp_connection *evcon)
359 switch (evcon->state) {
378 evhttp_make_header_request(struct evhttp_connection *evcon,
387 evbuffer_add_printf(evcon->output_buffer, "%s %s HTTP/%d.%d\r\n",
461 evhttp_make_header_response(struct evhttp_connection *evcon,
465 evbuffer_add_printf(evcon->output_buffer, "HTTP/%d.%d %d %s\r\n",
512 evhttp_make_header(struct evhttp_connection *evcon, struct evhttp_request *req)
521 evhttp_make_header_request(evcon, req);
523 evhttp_make_header_response(evcon, req);
527 evbuffer_add_printf(evcon->output_buffer, "%s: %s\r\n",
530 evbuffer_add(evcon->output_buffer, "\r\n", 2);
537 evbuffer_add_buffer(evcon->output_buffer, req->output_buffer);
631 evhttp_connection_fail(struct evhttp_connection *evcon,
634 struct evhttp_request* req = TAILQ_FIRST(&evcon->requests);
639 if (evcon->flags & EVHTTP_CON_INCOMING) {
649 evhttp_connection_free(evcon);
657 TAILQ_REMOVE(&evcon->requests, req, next);
663 evhttp_connection_reset(evcon);
666 if (TAILQ_FIRST(&evcon->requests) != NULL)
667 evhttp_connection_connect(evcon);
677 struct evhttp_connection *evcon = arg;
681 evhttp_connection_fail(evcon, EVCON_HTTP_TIMEOUT);
685 n = evbuffer_write(evcon->output_buffer, fd);
688 evhttp_connection_fail(evcon, EVCON_HTTP_EOF);
694 evhttp_connection_fail(evcon, EVCON_HTTP_EOF);
698 if (EVBUFFER_LENGTH(evcon->output_buffer) != 0) {
699 evhttp_add_event(&evcon->ev,
700 evcon->timeout, HTTP_WRITE_TIMEOUT);
705 if (evcon->cb != NULL)
706 (*evcon->cb)(evcon, evcon->cb_arg);
717 evhttp_connection_done(struct evhttp_connection *evcon)
719 struct evhttp_request *req = TAILQ_FIRST(&evcon->requests);
720 int con_outgoing = evcon->flags & EVHTTP_CON_OUTGOING;
725 TAILQ_REMOVE(&evcon->requests, req, next);
726 req->evcon = NULL;
728 evcon->state = EVCON_IDLE;
736 evhttp_connection_reset(evcon);
738 if (TAILQ_FIRST(&evcon->requests) != NULL) {
743 if (!evhttp_connected(evcon))
744 evhttp_connection_connect(evcon);
746 evhttp_request_dispatch(evcon);
752 evhttp_connection_start_detectclose(evcon);
759 evcon->state = EVCON_WRITING;
839 evhttp_read_trailer(struct evhttp_connection *evcon, struct evhttp_request *req)
841 struct evbuffer *buf = evcon->input_buffer;
845 evhttp_connection_fail(evcon, EVCON_HTTP_INVALID_HEADER);
848 event_del(&evcon->ev);
849 evhttp_connection_done(evcon);
853 evhttp_add_event(&evcon->ev, evcon->timeout,
860 evhttp_read_body(struct evhttp_connection *evcon, struct evhttp_request *req)
862 struct evbuffer *buf = evcon->input_buffer;
868 evcon->state = EVCON_READING_TRAILER;
869 evhttp_read_trailer(evcon, req);
873 evhttp_connection_fail(evcon,
893 evhttp_connection_done(evcon);
897 event_set(&evcon->ev, evcon->fd, EV_READ, evhttp_read, evcon);
898 EVHTTP_BASE_SET(evcon, &evcon->ev);
899 evhttp_add_event(&evcon->ev, evcon->timeout, HTTP_READ_TIMEOUT);
912 struct evhttp_connection *evcon = arg;
913 struct evhttp_request *req = TAILQ_FIRST(&evcon->requests);
914 struct evbuffer *buf = evcon->input_buffer;
918 evhttp_connection_fail(evcon, EVCON_HTTP_TIMEOUT);
928 evhttp_connection_fail(evcon, EVCON_HTTP_EOF);
930 evhttp_add_event(&evcon->ev, evcon->timeout,
936 evhttp_connection_done(evcon);
940 switch (evcon->state) {
942 evhttp_read_firstline(evcon, req);
945 evhttp_read_header(evcon, req);
948 evhttp_read_body(evcon, req);
951 evhttp_read_trailer(evcon, req);
959 __func__, evcon->state);
964 evhttp_write_connectioncb(struct evhttp_connection *evcon, void *arg)
967 struct evhttp_request *req = TAILQ_FIRST(&evcon->requests);
970 assert(evcon->state == EVCON_WRITING);
975 evhttp_start_read(evcon);
983 evhttp_connection_free(struct evhttp_connection *evcon)
988 if (evcon->fd != -1) {
989 if (evhttp_connected(evcon) && evcon->closecb != NULL)
990 (*evcon->closecb)(evcon, evcon->closecb_arg);
994 while ((req = TAILQ_FIRST(&evcon->requests)) != NULL) {
995 TAILQ_REMOVE(&evcon->requests, req, next);
999 if (evcon->http_server != NULL) {
1000 struct evhttp *http = evcon->http_server;
1001 TAILQ_REMOVE(&http->connections, evcon, next);
1004 if (event_initialized(&evcon->close_ev))
1005 event_del(&evcon->close_ev);
1007 if (event_initialized(&evcon->ev))
1008 event_del(&evcon->ev);
1010 if (evcon->fd != -1)
1011 EVUTIL_CLOSESOCKET(evcon->fd);
1013 if (evcon->bind_address != NULL)
1014 free(evcon->bind_address);
1016 if (evcon->address != NULL)
1017 free(evcon->address);
1019 if (evcon->input_buffer != NULL)
1020 evbuffer_free(evcon->input_buffer);
1022 if (evcon->output_buffer != NULL)
1023 evbuffer_free(evcon->output_buffer);
1025 free(evcon);
1029 evhttp_connection_set_local_address(struct evhttp_connection *evcon,
1032 assert(evcon->state == EVCON_DISCONNECTED);
1033 if (evcon->bind_address)
1034 free(evcon->bind_address);
1035 if ((evcon->bind_address = strdup(address)) == NULL)
1040 evhttp_connection_set_local_port(struct evhttp_connection *evcon,
1043 assert(evcon->state == EVCON_DISCONNECTED);
1044 evcon->bind_port = port;
1048 evhttp_request_dispatch(struct evhttp_connection* evcon)
1050 struct evhttp_request *req = TAILQ_FIRST(&evcon->requests);
1057 evhttp_connection_stop_detectclose(evcon);
1060 assert(evcon->state == EVCON_IDLE);
1062 evcon->state = EVCON_WRITING;
1065 evhttp_make_header(evcon, req);
1067 evhttp_write_buffer(evcon, evhttp_write_connectioncb, NULL);
1072 evhttp_connection_reset(struct evhttp_connection *evcon)
1074 if (event_initialized(&evcon->ev))
1075 event_del(&evcon->ev);
1077 if (evcon->fd != -1) {
1079 if (evhttp_connected(evcon) && evcon->closecb != NULL)
1080 (*evcon->closecb)(evcon, evcon->closecb_arg);
1082 EVUTIL_CLOSESOCKET(evcon->fd);
1083 evcon->fd = -1;
1085 evcon->state = EVCON_DISCONNECTED;
1087 evbuffer_drain(evcon->input_buffer,
1088 EVBUFFER_LENGTH(evcon->input_buffer));
1089 evbuffer_drain(evcon->output_buffer,
1090 EVBUFFER_LENGTH(evcon->output_buffer));
1096 struct evhttp_connection *evcon = arg;
1097 evhttp_connection_reset(evcon);
1101 evhttp_connection_start_detectclose(struct evhttp_connection *evcon)
1103 evcon->flags |= EVHTTP_CON_CLOSEDETECT;
1105 if (event_initialized(&evcon->close_ev))
1106 event_del(&evcon->close_ev);
1107 event_set(&evcon->close_ev, evcon->fd, EV_READ,
1108 evhttp_detect_close_cb, evcon);
1109 EVHTTP_BASE_SET(evcon, &evcon->close_ev);
1110 event_add(&evcon->close_ev, NULL);
1114 evhttp_connection_stop_detectclose(struct evhttp_connection *evcon)
1116 evcon->flags &= ~EVHTTP_CON_CLOSEDETECT;
1117 event_del(&evcon->close_ev);
1123 struct evhttp_connection *evcon = arg;
1125 evcon->state = EVCON_DISCONNECTED;
1126 evhttp_connection_connect(evcon);
1136 struct evhttp_connection *evcon = arg;
1142 __func__, evcon->address, evcon->port, evcon->fd));
1147 if (getsockopt(evcon->fd, SOL_SOCKET, SO_ERROR, (void*)&error,
1150 __func__, evcon->address, evcon->port, evcon->fd));
1156 __func__, evcon->address, evcon->port, evcon->fd,
1163 __func__, evcon->address, evcon->port, evcon->fd));
1166 evcon->retry_cnt = 0;
1167 evcon->state = EVCON_IDLE;
1170 evhttp_request_dispatch(evcon);
1174 if (evcon->retry_max < 0 || evcon->retry_cnt < evcon->retry_max) {
1175 evtimer_set(&evcon->ev, evhttp_connection_retry, evcon);
1176 EVHTTP_BASE_SET(evcon, &evcon->ev);
1177 evhttp_add_event(&evcon->ev, MIN(3600, 2 << evcon->retry_cnt),
1179 evcon->retry_cnt++;
1182 evhttp_connection_reset(evcon);
1185 while (TAILQ_FIRST(&evcon->requests) != NULL) {
1186 struct evhttp_request *request = TAILQ_FIRST(&evcon->requests);
1187 TAILQ_REMOVE(&evcon->requests, request, next);
1188 request->evcon = NULL;
1564 EVBUFFER_LENGTH(req->evcon->input_buffer)));
1570 evhttp_get_body(struct evhttp_connection *evcon, struct evhttp_request *req)
1576 evhttp_connection_done(evcon);
1579 evcon->state = EVCON_READING_BODY;
1586 evhttp_connection_fail(evcon,
1591 evhttp_read_body(evcon, req);
1595 evhttp_read_firstline(struct evhttp_connection *evcon,
1600 res = evhttp_parse_firstline(req, evcon->input_buffer);
1604 __func__, evcon->fd));
1605 evhttp_connection_fail(evcon, EVCON_HTTP_INVALID_HEADER);
1609 evhttp_add_event(&evcon->ev,
1610 evcon->timeout, HTTP_READ_TIMEOUT);
1614 evcon->state = EVCON_READING_HEADERS;
1615 evhttp_read_header(evcon, req);
1619 evhttp_read_header(struct evhttp_connection *evcon, struct evhttp_request *req)
1622 int fd = evcon->fd;
1624 res = evhttp_parse_headers(req, evcon->input_buffer);
1628 evhttp_connection_fail(evcon, EVCON_HTTP_INVALID_HEADER);
1632 evhttp_add_event(&evcon->ev,
1633 evcon->timeout, HTTP_READ_TIMEOUT);
1642 evhttp_get_body(evcon, req);
1651 evhttp_connection_done(evcon);
1655 evhttp_get_body(evcon, req);
1661 evhttp_connection_fail(evcon, EVCON_HTTP_INVALID_HEADER);
1679 struct evhttp_connection *evcon = NULL;
1683 if ((evcon = calloc(1, sizeof(struct evhttp_connection))) == NULL) {
1688 evcon->fd = -1;
1689 evcon->port = port;
1691 evcon->timeout = -1;
1692 evcon->retry_cnt = evcon->retry_max = 0;
1694 if ((evcon->address = strdup(address)) == NULL) {
1699 if ((evcon->input_buffer = evbuffer_new()) == NULL) {
1704 if ((evcon->output_buffer = evbuffer_new()) == NULL) {
1709 evcon->state = EVCON_DISCONNECTED;
1710 TAILQ_INIT(&evcon->requests);
1712 return (evcon);
1715 if (evcon != NULL)
1716 evhttp_connection_free(evcon);
1720 void evhttp_connection_set_base(struct evhttp_connection *evcon,
1723 assert(evcon->base == NULL);
1724 assert(evcon->state == EVCON_DISCONNECTED);
1725 evcon->base = base;
1729 evhttp_connection_set_timeout(struct evhttp_connection *evcon,
1732 evcon->timeout = timeout_in_secs;
1736 evhttp_connection_set_retries(struct evhttp_connection *evcon,
1739 evcon->retry_max = retry_max;
1743 evhttp_connection_set_closecb(struct evhttp_connection *evcon,
1746 evcon->closecb = cb;
1747 evcon->closecb_arg = cbarg;
1751 evhttp_connection_get_peer(struct evhttp_connection *evcon,
1754 *address = evcon->address;
1755 *port = evcon->port;
1759 evhttp_connection_connect(struct evhttp_connection *evcon)
1761 if (evcon->state == EVCON_CONNECTING)
1764 evhttp_connection_reset(evcon);
1766 assert(!(evcon->flags & EVHTTP_CON_INCOMING));
1767 evcon->flags |= EVHTTP_CON_OUTGOING;
1769 evcon->fd = bind_socket(
1770 evcon->bind_address, evcon->bind_port, 0 /*reuse*/);
1771 if (evcon->fd == -1) {
1773 __func__, evcon->bind_address));
1777 if (socket_connect(evcon->fd, evcon->address, evcon->port) == -1) {
1778 EVUTIL_CLOSESOCKET(evcon->fd); evcon->fd = -1;
1783 event_set(&evcon->ev, evcon->fd, EV_WRITE, evhttp_connectioncb, evcon);
1784 EVHTTP_BASE_SET(evcon, &evcon->ev);
1785 evhttp_add_event(&evcon->ev, evcon->timeout, HTTP_CONNECT_TIMEOUT);
1787 evcon->state = EVCON_CONNECTING;
1799 evhttp_make_request(struct evhttp_connection *evcon,
1817 assert(req->evcon == NULL);
1818 req->evcon = evcon;
1821 TAILQ_INSERT_TAIL(&evcon->requests, req, next);
1824 if (!evhttp_connected(evcon))
1825 return (evhttp_connection_connect(evcon));
1832 if (TAILQ_FIRST(&evcon->requests) == req)
1833 evhttp_request_dispatch(evcon);
1844 evhttp_start_read(struct evhttp_connection *evcon)
1847 if (event_initialized(&evcon->ev))
1848 event_del(&evcon->ev);
1849 event_set(&evcon->ev, evcon->fd, EV_READ, evhttp_read, evcon);
1850 EVHTTP_BASE_SET(evcon, &evcon->ev);
1852 evhttp_add_event(&evcon->ev, evcon->timeout, HTTP_READ_TIMEOUT);
1853 evcon->state = EVCON_READING_FIRSTLINE;
1857 evhttp_send_done(struct evhttp_connection *evcon, void *arg)
1860 struct evhttp_request *req = TAILQ_FIRST(&evcon->requests);
1861 TAILQ_REMOVE(&evcon->requests, req, next);
1864 evhttp_connection_stop_detectclose(evcon);
1876 evhttp_connection_free(evcon);
1881 if (evhttp_associate_new_request_with_connection(evcon) == -1)
1882 evhttp_connection_free(evcon);
1919 struct evhttp_connection *evcon = req->evcon;
1921 assert(TAILQ_FIRST(&evcon->requests) == req);
1928 evhttp_make_header(evcon, req);
1930 evhttp_write_buffer(evcon, evhttp_send_done, NULL);
1953 evhttp_make_header(req->evcon, req);
1954 evhttp_write_buffer(req->evcon, NULL, NULL);
1961 evbuffer_add_printf(req->evcon->output_buffer, "%x\r\n",
1964 evbuffer_add_buffer(req->evcon->output_buffer, databuf);
1966 evbuffer_add(req->evcon->output_buffer, "\r\n", 2);
1968 evhttp_write_buffer(req->evcon, NULL, NULL);
1974 struct evhttp_connection *evcon = req->evcon;
1977 evbuffer_add(req->evcon->output_buffer, "0\r\n\r\n", 5);
1978 evhttp_write_buffer(req->evcon, evhttp_send_done, NULL);
1980 } else if (!event_pending(&evcon->ev, EV_WRITE|EV_TIMEOUT, NULL)) {
1982 evhttp_send_done(evcon, NULL);
1985 evcon->cb = evhttp_send_done;
1986 evcon->cb_arg = NULL;
2354 struct evhttp_connection *evcon;
2369 while ((evcon = TAILQ_FIRST(&http->connections)) != NULL) {
2371 evhttp_connection_free(evcon);
2536 struct evhttp_connection *evcon;
2550 evcon = evhttp_connection_new(hostname, atoi(portname));
2553 if (evcon == NULL)
2557 evhttp_connection_set_base(evcon, http->base);
2559 evcon->flags |= EVHTTP_CON_INCOMING;
2560 evcon->state = EVCON_READING_FIRSTLINE;
2562 evcon->fd = fd;
2564 return (evcon);
2568 evhttp_associate_new_request_with_connection(struct evhttp_connection *evcon)
2570 struct evhttp *http = evcon->http_server;
2575 req->evcon = evcon; /* the request ends up owning the connection */
2578 TAILQ_INSERT_TAIL(&evcon->requests, req, next);
2582 if ((req->remote_host = strdup(evcon->address)) == NULL)
2584 req->remote_port = evcon->port;
2586 evhttp_start_read(evcon);
2595 struct evhttp_connection *evcon;
2597 evcon = evhttp_get_request_connection(http, fd, sa, salen);
2598 if (evcon == NULL)
2603 evhttp_connection_set_timeout(evcon, http->timeout);
2609 evcon->http_server = http;
2610 TAILQ_INSERT_TAIL(&http->connections, evcon, next);
2612 if (evhttp_associate_new_request_with_connection(evcon) == -1)
2613 evhttp_connection_free(evcon);