From: Brian Pane Date: Sun, 23 Oct 2005 22:20:59 +0000 (+0000) Subject: Add new connection states for handler and write completion X-Git-Tag: 2.3.0~2848 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4db6998015141f3efb32912e1931f3b48f8630f8;p=thirdparty%2Fapache%2Fhttpd.git Add new connection states for handler and write completion (backport from async-dev branch to 2.3 trunk) git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@327870 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 2d816f7a6e4..106cf3e91dd 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,9 @@ Changes with Apache 2.3.0 [Remove entries to the current 2.0 and 2.2 section below, when backported] + *) Added new connection states for handler and write completion + [Brian Pane] + *) mod_proxy_ajp: Do not spool the entire response from AJP backend before sending it up the filter chain. PR37100. [Ruediger Pluem] diff --git a/include/httpd.h b/include/httpd.h index 7f08b92d1dd..0cb68df8471 100644 --- a/include/httpd.h +++ b/include/httpd.h @@ -1074,6 +1074,8 @@ struct conn_rec { typedef enum { CONN_STATE_CHECK_REQUEST_LINE_READABLE, CONN_STATE_READ_REQUEST_LINE, + CONN_STATE_HANDLER, + CONN_STATE_WRITE_COMPLETION, CONN_STATE_LINGER, } conn_state_e; diff --git a/modules/http/http_core.c b/modules/http/http_core.c index db0dc4fd158..c74b3ef791a 100644 --- a/modules/http/http_core.c +++ b/modules/http/http_core.c @@ -135,10 +135,12 @@ static int ap_process_http_async_connection(conn_rec *c) else if (!c->data_in_input_filters) { cs->state = CONN_STATE_CHECK_REQUEST_LINE_READABLE; } - - /* else we are pipelining. Stay in READ_REQUEST_LINE state - * and stay in the loop - */ + else { + /* else we are pipelining. Stay in READ_REQUEST_LINE state + * and stay in the loop + */ + cs->state = CONN_STATE_READ_REQUEST_LINE; + } apr_pool_destroy(r->pool); } @@ -153,6 +155,7 @@ static int ap_process_http_async_connection(conn_rec *c) static int ap_process_http_connection(conn_rec *c) { request_rec *r; + conn_state_t *cs = c->cs; apr_socket_t *csd = NULL; /* @@ -167,8 +170,10 @@ static int ap_process_http_connection(conn_rec *c) /* process the request if it was read without error */ ap_update_child_status(c->sbh, SERVER_BUSY_WRITE, r); - if (r->status == HTTP_OK) + if (r->status == HTTP_OK) { + cs->state = CONN_STATE_HANDLER; ap_process_request(r); + } if (ap_extended_status) ap_increment_counts(c->sbh, r); diff --git a/server/core.c b/server/core.c index dc8adeffb87..9d2778acec0 100644 --- a/server/core.c +++ b/server/core.c @@ -3809,6 +3809,14 @@ static conn_rec *core_create_conn(apr_pool_t *ptrans, server_rec *server, c->id = id; c->bucket_alloc = alloc; + c->cs = (conn_state_t *)apr_pcalloc(ptrans, sizeof(conn_state_t)); + APR_RING_INIT(&(c->cs->timeout_list), conn_state_t, timeout_list); + c->cs->expiration_time = 0; + c->cs->state = CONN_STATE_CHECK_REQUEST_LINE_READABLE; + c->cs->c = c; + c->cs->p = ptrans; + c->cs->bucket_alloc = alloc; + return c; }