From: Jim Jagielski Date: Thu, 3 Mar 2016 15:08:24 +0000 (+0000) Subject: Merge r1727603 from trunk: X-Git-Tag: 2.4.19~107 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9ea9f2bf99ad2468c614c876031a6c7fb3c1ef98;p=apache Merge r1727603 from trunk: event: slave connection init, vhost early config Submitted by: icing Reviewed/backported by: jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1733473 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index d92c65a6f1..ad38a9d890 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,11 @@ Changes with Apache 2.4.19 + *) event: use pre_connection hook to properly initialize connection state for + slave connections. use protocol_switch hook to initialize server config + early based on SNI selected vhost. + [Stefan Eissing] + *) hostname: Test and log useragent_host per-request across various modules, including the scoreboard, expression and rewrite engines, setenvif, authz_host, access_compat, custom logging, ssl and REMOTE_HOST variables. diff --git a/STATUS b/STATUS index 95476634da..156b025286 100644 --- a/STATUS +++ b/STATUS @@ -112,14 +112,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - *) Use pre_connection hook in event.c to properly setup connection state - of slave connections (eliminates hacks in mod_http2). - Trunk patch: - http://svn.apache.org/r1727603 - 2.4.x patch: - Trunk version of patch works modulo CHANGES - +1: icing, ylavic, jim - *) mod_proxy: Play/restore the TLS-SNI on new backend connections which had to be issued because the remote closed the previous/reusable one during idle (keep-alive) time. diff --git a/server/mpm/event/event.c b/server/mpm/event/event.c index e76dee3441..23368c7618 100644 --- a/server/mpm/event/event.c +++ b/server/mpm/event/event.c @@ -3000,6 +3000,55 @@ static int event_run(apr_pool_t * _pconf, apr_pool_t * plog, server_rec * s) return OK; } +static void setup_slave_conn(conn_rec *c, void *csd) +{ + event_conn_state_t *mcs; + event_conn_state_t *cs; + + mcs = ap_get_module_config(c->master->conn_config, &mpm_event_module); + + cs = apr_pcalloc(c->pool, sizeof(*cs)); + cs->c = c; + cs->r = NULL; + cs->sc = mcs->sc; + cs->suspended = 0; + cs->p = c->pool; + cs->bucket_alloc = c->bucket_alloc; + cs->pfd = mcs->pfd; + cs->pub = mcs->pub; + cs->pub.state = CONN_STATE_READ_REQUEST_LINE; + cs->pub.sense = CONN_SENSE_DEFAULT; + + c->cs = &(cs->pub); + ap_set_module_config(c->conn_config, &mpm_event_module, cs); +} + +static int event_pre_connection(conn_rec *c, void *csd) +{ + if (c->master && (!c->cs || c->cs == c->master->cs)) { + setup_slave_conn(c, csd); + } + return OK; +} + +static int event_protocol_switch(conn_rec *c, request_rec *r, server_rec *s, + const char *protocol) +{ + if (!r && s) { + /* connection based switching of protocol, set the correct server + * configuration, so that timeouts, keepalives and such are used + * for the server that the connection was switched on. + * Normally, we set this on post_read_request, but on a protocol + * other than http/1.1, this might never happen. + */ + event_conn_state_t *cs; + + cs = ap_get_module_config(c->conn_config, &mpm_event_module); + cs->sc = ap_get_module_config(s->module_config, &mpm_event_module); + } + return DECLINED; +} + /* This really should be a post_config hook, but the error log is already * redirected by that point, so we need to do this in the open_logs phase. */ @@ -3491,6 +3540,9 @@ static void event_hooks(apr_pool_t * p) ap_hook_pre_read_request(event_pre_read_request, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_post_read_request(event_post_read_request, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_mpm_get_name(event_get_name, NULL, NULL, APR_HOOK_MIDDLE); + + ap_hook_pre_connection(event_pre_connection, NULL, NULL, APR_HOOK_REALLY_FIRST); + ap_hook_protocol_switch(event_protocol_switch, NULL, NULL, APR_HOOK_REALLY_FIRST); } static const char *set_daemons_to_start(cmd_parms *cmd, void *dummy,