]> granicus.if.org Git - apache/commitdiff
optimize lookup of ssl-{unclean,accurate}-shutdown flags:
authorDoug MacEachern <dougm@apache.org>
Thu, 22 Nov 2001 02:23:09 +0000 (02:23 +0000)
committerDoug MacEachern <dougm@apache.org>
Thu, 22 Nov 2001 02:23:09 +0000 (02:23 +0000)
- 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

modules/ssl/mod_ssl.h
modules/ssl/ssl_engine_kernel.c

index 84a86e4511692465126e78bb208d26a31f46a7f0..e9be23bde6e6dd501a24c3a8fd13d3e7dd8a6673 100644 (file)
@@ -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
index 0ac1225b3c7a520eeb974f56c9c05da5ae029abb..697892bb05c6d1aa29273502e1b4abb2366c3a47 100644 (file)
@@ -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;
 }