|
|
|
@ -13,7 +13,8 @@ static void parse_request_body(liConnection *con) {
|
|
|
|
|
li_ev_io_add_events(con->wrk->loop, &con->sock_watcher, EV_READ); |
|
|
|
|
if (con->mainvr->request.content_length == -1) { |
|
|
|
|
/* TODO: parse chunked encoded request body, filters */ |
|
|
|
|
li_chunkqueue_steal_all(con->in, con->raw_in); |
|
|
|
|
/* li_chunkqueue_steal_all(con->in, con->raw_in); */ |
|
|
|
|
con->in->is_closed = TRUE; |
|
|
|
|
} else { |
|
|
|
|
if (con->in->bytes_in < con->mainvr->request.content_length) { |
|
|
|
|
li_chunkqueue_steal_len(con->in, con->raw_in, con->mainvr->request.content_length - con->in->bytes_in); |
|
|
|
@ -587,24 +588,28 @@ void li_connection_reset(liConnection *con) {
|
|
|
|
|
|
|
|
|
|
static void li_connection_reset_keep_alive(liConnection *con) { |
|
|
|
|
liVRequest *vr = con->mainvr; |
|
|
|
|
ev_timer_stop(con->wrk->loop, &con->keep_alive_data.watcher); |
|
|
|
|
{ |
|
|
|
|
con->keep_alive_data.max_idle = CORE_OPTION(LI_CORE_OPTION_MAX_KEEP_ALIVE_IDLE).number; |
|
|
|
|
if (con->keep_alive_data.max_idle == 0) { |
|
|
|
|
worker_con_put(con); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if (con->keep_alive_data.max_idle >= con->srv->keep_alive_queue_timeout) { |
|
|
|
|
/* queue is sorted by con->keep_alive_data.timeout */ |
|
|
|
|
gboolean need_start = (0 == con->wrk->keep_alive_queue.length); |
|
|
|
|
con->keep_alive_data.timeout = ev_now(con->wrk->loop) + con->srv->keep_alive_queue_timeout; |
|
|
|
|
g_queue_push_tail(&con->wrk->keep_alive_queue, con); |
|
|
|
|
con->keep_alive_data.link = g_queue_peek_tail_link(&con->wrk->keep_alive_queue); |
|
|
|
|
if (need_start) |
|
|
|
|
li_worker_check_keepalive(con->wrk); |
|
|
|
|
} else { |
|
|
|
|
ev_timer_set(&con->keep_alive_data.watcher, con->keep_alive_data.max_idle, 0); |
|
|
|
|
ev_timer_start(con->wrk->loop, &con->keep_alive_data.watcher); |
|
|
|
|
|
|
|
|
|
/* only start keep alive watcher if there isn't more input data already */ |
|
|
|
|
if (con->raw_in->length == 0) { |
|
|
|
|
ev_timer_stop(con->wrk->loop, &con->keep_alive_data.watcher); |
|
|
|
|
{ |
|
|
|
|
con->keep_alive_data.max_idle = CORE_OPTION(LI_CORE_OPTION_MAX_KEEP_ALIVE_IDLE).number; |
|
|
|
|
if (con->keep_alive_data.max_idle == 0) { |
|
|
|
|
worker_con_put(con); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if (con->keep_alive_data.max_idle >= con->srv->keep_alive_queue_timeout) { |
|
|
|
|
/* queue is sorted by con->keep_alive_data.timeout */ |
|
|
|
|
gboolean need_start = (0 == con->wrk->keep_alive_queue.length); |
|
|
|
|
con->keep_alive_data.timeout = ev_now(con->wrk->loop) + con->srv->keep_alive_queue_timeout; |
|
|
|
|
g_queue_push_tail(&con->wrk->keep_alive_queue, con); |
|
|
|
|
con->keep_alive_data.link = g_queue_peek_tail_link(&con->wrk->keep_alive_queue); |
|
|
|
|
if (need_start) |
|
|
|
|
li_worker_check_keepalive(con->wrk); |
|
|
|
|
} else { |
|
|
|
|
ev_timer_set(&con->keep_alive_data.watcher, con->keep_alive_data.max_idle, 0); |
|
|
|
|
ev_timer_start(con->wrk->loop, &con->keep_alive_data.watcher); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -669,6 +674,11 @@ static void li_connection_reset_keep_alive(liConnection *con) {
|
|
|
|
|
con->throttle.ip.magazine = 0; |
|
|
|
|
con->throttle.con.magazine = 0; |
|
|
|
|
con->throttled = FALSE; |
|
|
|
|
|
|
|
|
|
if (con->raw_in->length != 0) { |
|
|
|
|
/* start handling next request if data is already available */ |
|
|
|
|
connection_handle_read(con); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void li_connection_free(liConnection *con) { |
|
|
|
|