1
0
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:
Doug MacEachern
2001-11-22 02:23:09 +00:00
parent a2965c7c77
commit 451e81d5d1
2 changed files with 45 additions and 9 deletions

View File

@@ -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

View File

@@ -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;
} }