mirror of
https://github.com/apache/httpd.git
synced 2025-08-07 04:02:58 +03:00
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
This commit is contained in:
@@ -446,6 +446,7 @@ typedef struct {
|
|||||||
} SSLFilterRec;
|
} SSLFilterRec;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
SSL_SHUTDOWN_TYPE_UNSET,
|
||||||
SSL_SHUTDOWN_TYPE_STANDARD,
|
SSL_SHUTDOWN_TYPE_STANDARD,
|
||||||
SSL_SHUTDOWN_TYPE_UNCLEAN,
|
SSL_SHUTDOWN_TYPE_UNCLEAN,
|
||||||
SSL_SHUTDOWN_TYPE_ACCURATE
|
SSL_SHUTDOWN_TYPE_ACCURATE
|
||||||
|
@@ -122,6 +122,7 @@ apr_status_t ssl_hook_CloseConnection(SSLFilterRec *filter)
|
|||||||
* to force the type of handshake via SetEnvIf directive
|
* to force the type of handshake via SetEnvIf directive
|
||||||
*/
|
*/
|
||||||
switch (sslconn->shutdown_type) {
|
switch (sslconn->shutdown_type) {
|
||||||
|
case SSL_SHUTDOWN_TYPE_UNSET:
|
||||||
case SSL_SHUTDOWN_TYPE_STANDARD:
|
case SSL_SHUTDOWN_TYPE_STANDARD:
|
||||||
/* send close notify, but don't wait for clients close notify
|
/* send close notify, but don't wait for clients close notify
|
||||||
(standard compliant and safe, so it's the DEFAULT!) */
|
(standard compliant and safe, so it's the DEFAULT!) */
|
||||||
@@ -191,6 +192,43 @@ int ssl_hook_ReadReq(request_rec *r)
|
|||||||
return DECLINED;
|
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
|
* URL Translation Handler
|
||||||
*/
|
*/
|
||||||
@@ -214,16 +252,13 @@ int ssl_hook_Translate(request_rec *r)
|
|||||||
r->connection->id,
|
r->connection->id,
|
||||||
ssl_util_vhostid(r->pool, r->server));
|
ssl_util_vhostid(r->pool, r->server));
|
||||||
|
|
||||||
/*
|
/* SetEnvIf ssl-*-shutdown flags can only be per-server,
|
||||||
* Move SetEnvIf information from request_rec to conn_rec/BUFF
|
* so they won't change across keepalive requests
|
||||||
* to allow the close connection handler to use them.
|
|
||||||
*/
|
*/
|
||||||
if (apr_table_get(r->subprocess_env, "ssl-unclean-shutdown") != NULL)
|
if (sslconn->shutdown_type == SSL_SHUTDOWN_TYPE_UNSET) {
|
||||||
sslconn->shutdown_type = SSL_SHUTDOWN_TYPE_UNCLEAN;
|
ssl_configure_env(r, sslconn);
|
||||||
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;
|
|
||||||
return DECLINED;
|
return DECLINED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user