Lines Matching refs:con
45 static void connection_reset(connection *con);
48 connection *con; in connections_get_new_connection() local
51 con = srv->conns_pool; in connections_get_new_connection()
52 srv->conns_pool = con->next; in connections_get_new_connection()
55 con = connection_init(srv); in connections_get_new_connection()
56 connection_reset(con); in connections_get_new_connection()
59 if ((con->next = srv->conns)) in connections_get_new_connection()
60 con->next->prev = con; in connections_get_new_connection()
61 return (srv->conns = con); in connections_get_new_connection()
64 static void connection_del(server *srv, connection *con) { in connection_del() argument
65 if (con->next) in connection_del()
66 con->next->prev = con->prev; in connection_del()
67 if (con->prev) in connection_del()
68 con->prev->next = con->next; in connection_del()
70 srv->conns = con->next; in connection_del()
71 con->prev = NULL; in connection_del()
72 con->next = srv->conns_pool; in connection_del()
73 srv->conns_pool = con; in connection_del()
77 static void connection_close(connection *con) { in connection_close() argument
78 if (con->fd < 0) con->fd = -con->fd; in connection_close()
80 plugins_call_handle_connection_close(con); in connection_close()
82 server * const srv = con->srv; in connection_close()
83 request_st * const r = &con->request; in connection_close()
87 chunkqueue_reset(con->read_queue); in connection_close()
88 con->request_count = 0; in connection_close()
89 con->is_ssl_sock = 0; in connection_close()
90 con->revents_err = 0; in connection_close()
92 fdevent_fdnode_event_del(srv->ev, con->fdn); in connection_close()
93 fdevent_unregister(srv->ev, con->fdn); in connection_close()
94 con->fdn = NULL; in connection_close()
96 if (0 == closesocket(con->fd)) in connection_close()
98 if (0 == close(con->fd)) in connection_close()
103 "(warning) close: %d", con->fd); in connection_close()
107 "connection closed for fd %d", con->fd); in connection_close()
109 con->fd = -1; in connection_close()
111 connection_del(srv, con); in connection_close()
114 static void connection_read_for_eos_plain(connection * const con) { in connection_read_for_eos_plain() argument
121 const int type = sock_addr_get_family(&con->dst_addr); in connection_read_for_eos_plain()
124 len = fdevent_socket_read_discard(con->fd, buf, sizeof(buf), in connection_read_for_eos_plain()
134 con->close_timeout_ts = log_monotonic_secs - (HTTP_LINGER_TIMEOUT+1); in connection_read_for_eos_plain()
137 static void connection_read_for_eos_ssl(connection * const con) { in connection_read_for_eos_ssl() argument
138 if (con->network_read(con, con->read_queue, MAX_READ_LIMIT) < 0) in connection_read_for_eos_ssl()
139 con->close_timeout_ts = log_monotonic_secs - (HTTP_LINGER_TIMEOUT+1); in connection_read_for_eos_ssl()
140 chunkqueue_reset(con->read_queue); in connection_read_for_eos_ssl()
143 static void connection_read_for_eos(connection * const con) { in connection_read_for_eos() argument
144 !con->is_ssl_sock in connection_read_for_eos()
145 ? connection_read_for_eos_plain(con) in connection_read_for_eos()
146 : connection_read_for_eos_ssl(con); in connection_read_for_eos()
149 static void connection_handle_close_state(connection *con) { in connection_handle_close_state() argument
150 connection_read_for_eos(con); in connection_handle_close_state()
152 if (log_monotonic_secs - con->close_timeout_ts > HTTP_LINGER_TIMEOUT) { in connection_handle_close_state()
153 connection_close(con); in connection_handle_close_state()
157 static void connection_handle_shutdown(connection *con) { in connection_handle_shutdown() argument
158 plugins_call_handle_connection_shut_wr(con); in connection_handle_shutdown()
160 connection_reset(con); in connection_handle_shutdown()
163 if (con->fd >= 0 in connection_handle_shutdown()
164 && (con->is_ssl_sock || 0 == shutdown(con->fd, SHUT_WR))) { in connection_handle_shutdown()
165 con->close_timeout_ts = log_monotonic_secs; in connection_handle_shutdown()
167 request_st * const r = &con->request; in connection_handle_shutdown()
171 "shutdown for fd %d", con->fd); in connection_handle_shutdown()
174 connection_close(con); in connection_handle_shutdown()
179 static void connection_handle_response_end_state(request_st * const r, connection * const con) { in connection_handle_response_end_state() argument
181 h2_retire_con(r, con); in connection_handle_response_end_state()
197 if (&r->write_queue != con->write_queue) { /*(for HTTP/1.1)*/ in connection_handle_response_end_state()
198 chunkqueue_free(con->write_queue); in connection_handle_response_end_state()
199 con->write_queue = &r->write_queue; in connection_handle_response_end_state()
205 con->is_readable = 1; /* potentially trigger optimistic read */ in connection_handle_response_end_state()
212 con->read_idle_ts = log_monotonic_secs; in connection_handle_response_end_state()
216 connection_handle_shutdown(con); in connection_handle_response_end_state()
223 connection_write_throttled (const connection * const con, off_t max_bytes) in connection_write_throttled() argument
225 const request_config * const restrict rconf = &con->request.conf; in connection_write_throttled()
238 - con->bytes_written_cur_second; in connection_write_throttled()
248 connection_write_throttle (connection * const con, off_t max_bytes) in connection_write_throttle() argument
251 max_bytes = connection_write_throttled(con, max_bytes); in connection_write_throttle()
252 if (0 == max_bytes) con->traffic_limit_reached = 1; in connection_write_throttle()
258 connection_write_chunkqueue (connection * const con, chunkqueue * const restrict cq, off_t max_byte… in connection_write_chunkqueue() argument
262 con->write_request_ts = log_monotonic_secs; in connection_write_chunkqueue()
264 max_bytes = connection_write_throttle(con, max_bytes); in connection_write_chunkqueue()
290 if (NULL != c || (con->is_ssl_sock && chunkqueue_length(cq) > 16384)) { in connection_write_chunkqueue()
291 const int sa_family = sock_addr_get_family(&con->srv_socket->addr); in connection_write_chunkqueue()
294 (void)setsockopt(con->fd, IPPROTO_TCP, TCP_CORK, in connection_write_chunkqueue()
301 ret = con->network_write(con, cq, max_bytes); in connection_write_chunkqueue()
309 (void)setsockopt(con->fd, IPPROTO_TCP, TCP_CORK, in connection_write_chunkqueue()
315 con->bytes_written_cur_second += written; in connection_write_chunkqueue()
316 request_st * const r = &con->request; in connection_write_chunkqueue()
325 connection_write_1xx_info (request_st * const r, connection * const con) in connection_write_1xx_info() argument
330 chunkqueue * const cq = con->write_queue; in connection_write_1xx_info()
333 int rc = con->network_write(con, cq, MAX_WRITE_LIMIT); in connection_write_1xx_info()
336 con->bytes_written_cur_second += written; in connection_write_1xx_info()
346 con->is_writable = 0; in connection_write_1xx_info()
351 con->write_queue = chunkqueue_init(NULL); in connection_write_1xx_info()
353 con->write_queue->bytes_in = cq->bytes_out; /*(yes, bytes_out)*/ in connection_write_1xx_info()
354 con->write_queue->bytes_out = cq->bytes_out; in connection_write_1xx_info()
355 chunkqueue_append_chunkqueue(con->write_queue, cq); in connection_write_1xx_info()
378 connection_send_1xx (request_st * const r, connection * const con) in connection_send_1xx() argument
388 chunkqueue * const cq = con->write_queue; /*(bypass r->write_queue)*/ in connection_send_1xx()
404 if (con->traffic_limit_reached) in connection_send_1xx()
407 return connection_write_1xx_info(r, con); in connection_send_1xx()
412 connection_write_100_continue (request_st * const r, connection * const con) in connection_write_100_continue() argument
417 if (con->traffic_limit_reached) in connection_write_100_continue()
420 chunkqueue * const cq = con->write_queue; /*(bypass r->write_queue)*/ in connection_write_100_continue()
422 return connection_write_1xx_info(r, con); in connection_write_100_continue()
426 static int connection_handle_write(request_st * const r, connection * const con) { in connection_handle_write() argument
429 if (con->is_writable <= 0) return CON_STATE_WRITE; in connection_handle_write()
430 int rc = connection_write_chunkqueue(con, con->write_queue, MAX_WRITE_LIMIT); in connection_handle_write()
440 "connection closed: write failed on fd %d", con->fd); in connection_handle_write()
448 if (con->write_queue->bytes_out) in connection_handle_write()
449 con->is_writable = 0; in connection_handle_write()
458 static int connection_handle_write_state(request_st * const r, connection * const con) { in connection_handle_write_state() argument
463 int rc = connection_handle_write(r, con); in connection_handle_write_state()
483 con->fd, rc); in connection_handle_write_state()
492 ? con->is_writable > 0 && 0 == con->traffic_limit_reached in connection_handle_write_state()
501 connection * const con = ck_calloc(1, sizeof(*con)); in connection_init() local
503 con->srv = srv; in connection_init()
504 con->plugin_slots = srv->plugin_slots; in connection_init()
505 con->config_data_base = srv->config_data_base; in connection_init()
507 request_st * const r = &con->request; in connection_init()
508 request_init_data(r, con, srv); in connection_init()
509 con->write_queue = &r->write_queue; in connection_init()
510 con->read_queue = &r->read_queue; in connection_init()
513 con->plugin_ctx = ck_calloc(srv->plugins.used + 1, sizeof(void *)); in connection_init()
515 return con; in connection_init()
519 static void connection_free(connection * const con) { in connection_free() argument
520 request_st * const r = &con->request; in connection_free()
522 connection_reset(con); in connection_free()
523 if (con->write_queue != &r->write_queue) in connection_free()
524 chunkqueue_free(con->write_queue); in connection_free()
525 if (con->read_queue != &r->read_queue) in connection_free()
526 chunkqueue_free(con->read_queue); in connection_free()
529 free(con->plugin_ctx); in connection_free()
530 free(con->dst_addr_buf.ptr); in connection_free()
531 free(con); in connection_free()
535 connection *con; in connections_pool_clear() local
536 while ((con = srv->conns_pool)) { in connections_pool_clear()
537 srv->conns_pool = con->next; in connections_pool_clear()
538 connection_free(con); in connections_pool_clear()
545 connection *con; in connections_free() local
546 while ((con = srv->conns)) { in connections_free()
547 srv->conns = con->next; in connections_free()
548 connection_free(con); in connections_free()
553 static void connection_reset(connection *con) { in connection_reset() argument
554 request_st * const r = &con->request; in connection_reset()
558 con->is_readable = 1; in connection_reset()
559 con->bytes_written_cur_second = 0; in connection_reset()
573 static chunk * connection_read_header_more(connection *con, chunkqueue *cq, chunk *c, const size_t … in connection_read_header_more() argument
579 if ((NULL == c || NULL == c->next) && con->is_readable > 0) { in connection_read_header_more()
580 con->read_idle_ts = log_monotonic_secs; in connection_read_header_more()
581 if (0 != con->network_read(con, cq, MAX_READ_LIMIT)) { in connection_read_header_more()
582 request_st * const r = &con->request; in connection_read_header_more()
586 request_st * const r = &con->request; in connection_read_header_more()
607 connection_transition_h2 (request_st * const h2r, connection * const con) in connection_transition_h2() argument
625 con->fdn->handler = connection_handle_fdevent_h2; in connection_transition_h2()
628 if (NULL == con->h2) /*(not yet transitioned to HTTP/2; not Upgrade: h2c)*/ in connection_transition_h2()
629 h2_init_con(h2r, con, NULL); in connection_transition_h2()
639 static int connection_handle_read_state(connection * const con) { in connection_handle_read_state() argument
641 chunkqueue * const cq = con->read_queue; in connection_handle_read_state()
645 request_st * const r = &con->request; in connection_handle_read_state()
651 if (con->request_count > 1) { in connection_handle_read_state()
660 con->is_readable = 1; in connection_handle_read_state()
718 con->dst_addr_buf.ptr); in connection_handle_read_state()
723 } while ((c = connection_read_header_more(con, cq, c, clen))); in connection_handle_read_state()
734 con->read_idle_ts = log_monotonic_secs; in connection_handle_read_state()
747 if (con->request_count > 1) { in connection_handle_read_state()
761 else if (!con->is_ssl_sock && r->conf.h2proto in connection_handle_read_state()
771 hdrs, header_len, "fd:%d rqst: ", con->fd); in connection_handle_read_state()
772 http_request_headers_process(r, hdrs, hoff, con->proto_default_port); in connection_handle_read_state()
791 connection * restrict con = context; in connection_handle_fdevent() local
792 const int is_ssl_sock = con->is_ssl_sock; in connection_handle_fdevent()
794 joblist_append(con); in connection_handle_fdevent()
797 con->revents_err |= (revents & ~(FDEVENT_IN | FDEVENT_OUT)); in connection_handle_fdevent()
801 con->is_readable = con->is_writable = 1; in connection_handle_fdevent()
804 con->is_readable = 1; in connection_handle_fdevent()
806 con->is_writable = 1; in connection_handle_fdevent()
815 static int connection_read_cq_err(connection *con) { in connection_read_cq_err() argument
816 request_st * const r = &con->request; in connection_read_cq_err()
824 con->is_readable = 1; in connection_read_cq_err()
840 con->is_readable = 1; in connection_read_cq_err()
858 static int connection_read_cq(connection *con, chunkqueue *cq, off_t max_bytes) { in connection_read_cq() argument
872 len = recv(con->fd, mem, mem_len, 0); in connection_read_cq()
874 len = read(con->fd, mem, mem_len); in connection_read_cq()
881 con->is_readable = 0; in connection_read_cq()
882 return len > 0 ? 0 : 0 == len ? -2 : connection_read_cq_err(con); in connection_read_cq()
888 mem_len = (0 == fdevent_ioctl_fionread(con->fd, S_IFSOCK, &frd)) in connection_read_cq()
896 static int connection_write_cq(connection *con, chunkqueue *cq, off_t max_bytes) { in connection_write_cq() argument
897 request_st * const r = &con->request; in connection_write_cq()
898 return con->srv->network_backend_write(con->fd,cq,max_bytes,r->conf.errh); in connection_write_cq()
905 connection *con; in connection_accepted() local
914 con = connections_get_new_connection(srv); in connection_accepted()
916 con->fd = cnt; in connection_accepted()
917 con->fdn = fdevent_register(srv->ev, con->fd, connection_handle_fdevent, con); in connection_accepted()
918 con->network_read = connection_read_cq; in connection_accepted()
919 con->network_write = connection_write_cq; in connection_accepted()
920 con->reqbody_read = connection_handle_read_post_state; in connection_accepted()
922 request_st * const r = &con->request; in connection_accepted()
925 con->connection_start = log_monotonic_secs; in connection_accepted()
926 con->dst_addr = *cnt_addr; in connection_accepted()
927 sock_addr_cache_inet_ntop_copy_buffer(&con->dst_addr_buf, in connection_accepted()
928 &con->dst_addr); in connection_accepted()
929 con->srv_socket = srv_socket; in connection_accepted()
930 con->is_ssl_sock = srv_socket->is_ssl; in connection_accepted()
931 con->proto_default_port = 80; /* "http" */ in connection_accepted()
937 if (HANDLER_GO_ON != plugins_call_handle_connection_accept(con)) { in connection_accepted()
938 connection_reset(con); in connection_accepted()
939 connection_close(con); in connection_accepted()
943 return con; in connection_accepted()
957 "fd:%d id:%d state:%s%s", r->con->fd, r->h2id, tb->ptr, tag); in __attribute_nonnull__()
961 static void connection_state_machine_h2 (connection * const con);
965 connection_state_machine_loop (request_st * const r, connection * const con) in connection_state_machine_loop() argument
976 con->read_idle_ts = log_monotonic_secs; in connection_state_machine_loop()
980 con->request_count++; in connection_state_machine_loop()
987 if (!connection_handle_read_state(con)) { in connection_state_machine_loop()
989 connection_transition_h2(r, con); in connection_state_machine_loop()
990 connection_state_machine_h2(con); in connection_state_machine_loop()
1020 h2_send_headers(r, con); in connection_state_machine_loop()
1026 if (connection_handle_write_state(r, con) == CON_STATE_WRITE) in connection_state_machine_loop()
1031 if (r->http_version > HTTP_VERSION_1_1 && r != &con->request) in connection_state_machine_loop()
1033 connection_handle_response_end_state(r, con); in connection_state_machine_loop()
1039 connection_handle_close_state(con); in connection_state_machine_loop()
1053 connection_revents_err (request_st * const r, connection * const con) in connection_revents_err() argument
1058 const int revents = (int)con->revents_err; in connection_revents_err()
1059 con->revents_err = 0; in connection_revents_err()
1062 con->close_timeout_ts = log_monotonic_secs - (HTTP_LINGER_TIMEOUT+1); in connection_revents_err()
1066 int events = fdevent_fdnode_interest(con->fdn); in connection_revents_err()
1071 con->is_readable = 1; /*(can read 0 for end-of-stream)*/ in connection_revents_err()
1072 if (chunkqueue_is_empty(con->read_queue)) r->keep_alive = 0; in connection_revents_err()
1075 if (sock_addr_get_family(&con->dst_addr) == AF_UNIX) { in connection_revents_err()
1077 fdevent_fdnode_event_set(con->srv->ev, con->fdn, events); in connection_revents_err()
1079 else if (fdevent_is_tcp_half_closed(con->fd)) { in connection_revents_err()
1090 fdevent_fdnode_event_set(con->srv->ev, con->fdn, events); in connection_revents_err()
1108 connection_set_fdevent_interest (request_st * const r, connection * const con) in connection_set_fdevent_interest() argument
1110 if (con->fd < 0) return; in connection_set_fdevent_interest()
1112 if (con->revents_err && r->state != CON_STATE_ERROR) { in connection_set_fdevent_interest()
1113 connection_revents_err(r, con); /* resets con->revents_err = 0 */ in connection_set_fdevent_interest()
1114 connection_state_machine(con); in connection_set_fdevent_interest()
1128 if (!chunkqueue_is_empty(con->write_queue) in connection_set_fdevent_interest()
1129 && 0 == con->is_writable && 0 == con->traffic_limit_reached) in connection_set_fdevent_interest()
1147 const int events = fdevent_fdnode_interest(con->fdn); in connection_set_fdevent_interest()
1148 if (con->is_readable < 0) { in connection_set_fdevent_interest()
1149 con->is_readable = 0; in connection_set_fdevent_interest()
1152 if (con->is_writable < 0) { in connection_set_fdevent_interest()
1153 con->is_writable = 0; in connection_set_fdevent_interest()
1163 con->read_idle_ts = log_monotonic_secs; in connection_set_fdevent_interest()
1165 con->write_request_ts = log_monotonic_secs; in connection_set_fdevent_interest()
1166 fdevent_fdnode_event_set(con->srv->ev, con->fdn, n); in connection_set_fdevent_interest()
1172 connection_request_end_h2 (request_st * const h2r, connection * const con) in connection_request_end_h2() argument
1176 h2_send_goaway(con, H2_E_NO_ERROR); in connection_request_end_h2()
1177 http_response_delay(con); in connection_request_end_h2()
1180 h2_send_goaway(con, H2_E_ENHANCE_YOUR_CALM); in connection_request_end_h2()
1185 connection_state_machine_h2 (connection * const con) in connection_state_machine_h2() argument
1187 h2con * const h2c = con->h2; in connection_state_machine_h2()
1188 request_st * const h2r = &con->request; in connection_state_machine_h2()
1191 && (chunkqueue_is_empty(con->read_queue) || h2_parse_frames(con)) in connection_state_machine_h2()
1192 && con->is_readable > 0) { in connection_state_machine_h2()
1193 chunkqueue * const cq = con->read_queue; in connection_state_machine_h2()
1195 if (0 == con->network_read(con, cq, MAX_READ_LIMIT)) { in connection_state_machine_h2()
1197 h2_parse_frames(con); in connection_state_machine_h2()
1214 off_t max_bytes = con->is_writable > 0 in connection_state_machine_h2()
1215 ? connection_write_throttle(con, MAX_WRITE_LIMIT) in connection_state_machine_h2()
1217 const off_t cqlen = chunkqueue_length(con->write_queue); in connection_state_machine_h2()
1231 connection_state_machine_loop(r, con); in connection_state_machine_h2()
1254 dlen = h2_send_cqdata(r, con, &r->write_queue, dlen); in connection_state_machine_h2()
1273 && !chunkqueue_is_empty(con->read_queue)) in connection_state_machine_h2()
1275 h2_send_end_stream(r, con); in connection_state_machine_h2()
1277 h2_retire_stream(r, con);/*r invalidated;removed from h2c->r[]*/ in connection_state_machine_h2()
1284 connection_request_end_h2(h2r, con); in connection_state_machine_h2()
1299 h2_retire_stream(r, con);/*r invalidated;removed from h2c->r[]*/ in connection_state_machine_h2()
1308 if (!chunkqueue_is_empty(con->write_queue)) in connection_state_machine_h2()
1309 connection_handle_write(h2r, con); in connection_state_machine_h2()
1311 if (chunkqueue_is_empty(con->write_queue) in connection_state_machine_h2()
1321 if (((resched & 1) && con->is_writable>0 && !con->traffic_limit_reached) in connection_state_machine_h2()
1323 joblist_append(con); in connection_state_machine_h2()
1325 if (h2_want_read(con)) in connection_state_machine_h2()
1331 connection_state_machine_loop(h2r, con); in connection_state_machine_h2()
1333 connection_set_fdevent_interest(h2r, con); in connection_state_machine_h2()
1338 connection_state_machine_h1 (connection * const con) in connection_state_machine_h1() argument
1340 request_st * const r = &con->request; in connection_state_machine_h1()
1341 connection_state_machine_loop(r, con); in connection_state_machine_h1()
1346 connection_set_fdevent_interest(r, con); in connection_state_machine_h1()
1351 connection_state_machine (connection * const con) in connection_state_machine() argument
1353 if (con->h2) in connection_state_machine()
1354 connection_state_machine_h2(con); in connection_state_machine()
1356 connection_state_machine_h1(con); in connection_state_machine()
1360 static void connection_check_timeout (connection * const con, const unix_time64_t cur_ts) { in connection_check_timeout() argument
1361 const int waitevents = fdevent_fdnode_interest(con->fdn); in connection_check_timeout()
1365 request_st * const r = &con->request; in connection_check_timeout()
1367 if (cur_ts - con->close_timeout_ts > HTTP_LINGER_TIMEOUT) { in connection_check_timeout()
1371 else if (con->h2 && r->state == CON_STATE_WRITE) { in connection_check_timeout()
1372 h2con * const h2c = con->h2; in connection_check_timeout()
1386 if (cur_ts - con->read_idle_ts > rr->conf.max_read_idle) { in connection_check_timeout()
1390 "request aborted - read timeout: %d", con->fd); in connection_check_timeout()
1398 && con->write_request_ts != 0) { in connection_check_timeout()
1402 if (cur_ts - con->write_request_ts in connection_check_timeout()
1424 if (cur_ts - con->read_idle_ts > con->keep_alive_idle) { in connection_check_timeout()
1429 con->fd); in connection_check_timeout()
1437 con->is_readable = 0; in connection_check_timeout()
1440 if (con->request_count == 1 || r->state != CON_STATE_READ) { in connection_check_timeout()
1442 if (cur_ts - con->read_idle_ts > r->conf.max_read_idle) { in connection_check_timeout()
1446 "connection closed - read timeout: %d", con->fd); in connection_check_timeout()
1453 if (cur_ts - con->read_idle_ts > con->keep_alive_idle) { in connection_check_timeout()
1458 con->fd); in connection_check_timeout()
1480 && r->state == CON_STATE_WRITE && con->write_request_ts != 0) { in connection_check_timeout()
1482 if (cur_ts - con->write_request_ts > 60) { in connection_check_timeout()
1485 con->fd, cur_ts - con->write_request_ts); in connection_check_timeout()
1489 if (cur_ts - con->write_request_ts > r->conf.max_write_idle) { in connection_check_timeout()
1498 (long long)con->write_queue->bytes_out, in connection_check_timeout()
1510 if (0 == (t_diff = cur_ts - con->connection_start)) t_diff = 1; in connection_check_timeout()
1512 if (con->traffic_limit_reached && in connection_check_timeout()
1514 || con->write_queue->bytes_out in connection_check_timeout()
1517 con->traffic_limit_reached = 0; in connection_check_timeout()
1522 con->bytes_written_cur_second = 0; in connection_check_timeout()
1525 connection_state_machine(con); in connection_check_timeout()
1531 for (connection *con = srv->conns, *tc; con; con = tc) { in connection_periodic_maint() local
1532 tc = con->next; in connection_periodic_maint()
1533 connection_check_timeout(con, cur_ts); in connection_periodic_maint()
1540 for (connection *con = srv->conns, *tc; con; con = tc) { in connection_graceful_shutdown_maint() local
1541 tc = con->next; in connection_graceful_shutdown_maint()
1544 request_st * const r = &con->request; in connection_graceful_shutdown_maint()
1549 con->close_timeout_ts -= (HTTP_LINGER_TIMEOUT - 1); in connection_graceful_shutdown_maint()
1550 if (log_monotonic_secs - con->close_timeout_ts > HTTP_LINGER_TIMEOUT) in connection_graceful_shutdown_maint()
1553 else if (con->h2 && r->state == CON_STATE_WRITE) { in connection_graceful_shutdown_maint()
1554 h2_send_goaway(con, H2_E_NO_ERROR); in connection_graceful_shutdown_maint()
1555 if (0 == con->h2->rused && chunkqueue_is_empty(con->write_queue)) { in connection_graceful_shutdown_maint()
1560 else if (r->state == CON_STATE_READ && con->request_count > 1 in connection_graceful_shutdown_maint()
1561 && chunkqueue_is_empty(con->read_queue)) { in connection_graceful_shutdown_maint()
1576 if (con->traffic_limit_reached) { in connection_graceful_shutdown_maint()
1577 con->traffic_limit_reached = 0; in connection_graceful_shutdown_maint()
1582 connection_state_machine(con); in connection_graceful_shutdown_maint()
1822 connection_check_expect_100 (request_st * const r, connection * const con) in connection_check_expect_100() argument
1824 if (con->is_writable <= 0) in connection_check_expect_100()
1846 h2_send_100_continue(r, con); in connection_check_expect_100()
1848 return connection_write_100_continue(r, con); in connection_check_expect_100()
1857 connection * const con = r->con; in connection_handle_read_post_state() local
1868 else if (con->is_readable > 0) { in connection_handle_read_post_state()
1869 con->read_idle_ts = log_monotonic_secs; in connection_handle_read_post_state()
1877 switch(con->network_read(con, cq, max_per_read)) { in connection_handle_read_post_state()
1893 && !connection_check_expect_100(r, con)) in connection_handle_read_post_state()