From: Doug MacEachern Date: Thu, 22 Nov 2001 02:23:09 +0000 (+0000) Subject: optimize lookup of ssl-{unclean,accurate}-shutdown flags: X-Git-Tag: 2.0.29~50 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=451e81d5d1f123a326f100840d73c93de59cb7b6;p=apache optimize lookup of ssl-{unclean,accurate}-shutdown flags: - only look through the table once, rather than 2 apr_table_gets() - case-sensitive and use strcmp() as little as possible - only lookup once per-connection, as the flags will not change across keepalive requests PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@92121 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/ssl/mod_ssl.h b/modules/ssl/mod_ssl.h index 84a86e4511..e9be23bde6 100644 --- a/modules/ssl/mod_ssl.h +++ b/modules/ssl/mod_ssl.h @@ -446,6 +446,7 @@ typedef struct { } SSLFilterRec; typedef enum { + SSL_SHUTDOWN_TYPE_UNSET, SSL_SHUTDOWN_TYPE_STANDARD, SSL_SHUTDOWN_TYPE_UNCLEAN, SSL_SHUTDOWN_TYPE_ACCURATE diff --git a/modules/ssl/ssl_engine_kernel.c b/modules/ssl/ssl_engine_kernel.c index 0ac1225b3c..697892bb05 100644 --- a/modules/ssl/ssl_engine_kernel.c +++ b/modules/ssl/ssl_engine_kernel.c @@ -122,6 +122,7 @@ apr_status_t ssl_hook_CloseConnection(SSLFilterRec *filter) * to force the type of handshake via SetEnvIf directive */ switch (sslconn->shutdown_type) { + case SSL_SHUTDOWN_TYPE_UNSET: case SSL_SHUTDOWN_TYPE_STANDARD: /* send close notify, but don't wait for clients close notify (standard compliant and safe, so it's the DEFAULT!) */ @@ -191,6 +192,43 @@ int ssl_hook_ReadReq(request_rec *r) return DECLINED; } +/* + * Move SetEnvIf information from request_rec to conn_rec/BUFF + * to allow the close connection handler to use them. + */ + +static void ssl_configure_env(request_rec *r, SSLConnRec *sslconn) +{ + int i; + const apr_array_header_t *arr = apr_table_elts(r->subprocess_env); + const apr_table_entry_t *elts = (const apr_table_entry_t *)arr->elts; + + sslconn->shutdown_type = SSL_SHUTDOWN_TYPE_STANDARD; + + for (i = 0; i < arr->nelts; i++) { + const char *key = elts[i].key; + + switch (*key) { + case 's': + /* being case-sensitive here. + * and not checking for the -shutdown since these are the only + * SetEnvIf "flags" we support + */ + if (!strncmp(key+1, "sl-", 3)) { + key += 4; + if (!strncmp(key, "unclean", 7)) { + sslconn->shutdown_type = SSL_SHUTDOWN_TYPE_UNCLEAN; + } + else if (!strncmp(key, "accurate", 8)) { + sslconn->shutdown_type = SSL_SHUTDOWN_TYPE_ACCURATE; + } + return; /* should only ever be one ssl-*-shutdown */ + } + break; + } + } +} + /* * URL Translation Handler */ @@ -214,16 +252,13 @@ int ssl_hook_Translate(request_rec *r) r->connection->id, ssl_util_vhostid(r->pool, r->server)); - /* - * Move SetEnvIf information from request_rec to conn_rec/BUFF - * to allow the close connection handler to use them. + /* SetEnvIf ssl-*-shutdown flags can only be per-server, + * so they won't change across keepalive requests */ - if (apr_table_get(r->subprocess_env, "ssl-unclean-shutdown") != NULL) - sslconn->shutdown_type = SSL_SHUTDOWN_TYPE_UNCLEAN; - else if (apr_table_get(r->subprocess_env, "ssl-accurate-shutdown") != NULL) - sslconn->shutdown_type = SSL_SHUTDOWN_TYPE_ACCURATE; - else - sslconn->shutdown_type = SSL_SHUTDOWN_TYPE_STANDARD; + if (sslconn->shutdown_type == SSL_SHUTDOWN_TYPE_UNSET) { + ssl_configure_env(r, sslconn); + } + return DECLINED; }