Author: wrowe
Date: Sat Jan  1 15:41:21 2005
New Revision: 123859

URL: http://svn.apache.org/viewcvs?view=rev&rev=123859
Log:

  Track unknown and known headers by a lowercase index, for performance,
  and make header key comparisons case-insensitive per RFC 2616.

Bug: 32863



Modified:
   httpd/mod_aspdotnet/trunk/Apache.Web/WorkerRequest.cpp
   httpd/mod_aspdotnet/trunk/Apache.Web/WorkerRequest.h
   httpd/mod_aspdotnet/trunk/Apache.Web/http_header_arrays.h

Modified: httpd/mod_aspdotnet/trunk/Apache.Web/WorkerRequest.cpp
Url: 
http://svn.apache.org/viewcvs/httpd/mod_aspdotnet/trunk/Apache.Web/WorkerRequest.cpp?view=diff&rev=123859&p1=httpd/mod_aspdotnet/trunk/Apache.Web/WorkerRequest.cpp&r1=123858&p2=httpd/mod_aspdotnet/trunk/Apache.Web/WorkerRequest.cpp&r2=123859
==============================================================================
--- httpd/mod_aspdotnet/trunk/Apache.Web/WorkerRequest.cpp      (original)
+++ httpd/mod_aspdotnet/trunk/Apache.Web/WorkerRequest.cpp      Sat Jan  1 
15:41:21 2005
@@ -38,6 +38,7 @@
     // Initialize empty placeholders
     known_req_header_value = new String* [RequestHeaderMaximum];
     unk_req_header_name = new ArrayList();
+    unk_req_header_index = new ArrayList();
     unk_req_header_value = new ArrayList();
     env_var = new ArrayList();
     env_value = new ArrayList();
@@ -79,12 +80,14 @@
         apr_table_entry_t __nogc* pair = (apr_table_entry_t *)(void*)(elt);
         String* key(pair->key);
         String* val(pair->val);
-        int ent = Array::IndexOf(request_headers_s, key);
+        String* key_index(key->ToLower(nullCulture));
+        int ent = Array::IndexOf(request_headers_s, key_index);
         if (ent >= 0) {
             known_req_header_value[ent] = val;
         }
         else {
             unk_req_header_name->Add(key);
+            unk_req_header_index->Add(key_index);
             unk_req_header_value->Add(val);
         }
     }

Modified: httpd/mod_aspdotnet/trunk/Apache.Web/WorkerRequest.h
Url: 
http://svn.apache.org/viewcvs/httpd/mod_aspdotnet/trunk/Apache.Web/WorkerRequest.h?view=diff&rev=123859&p1=httpd/mod_aspdotnet/trunk/Apache.Web/WorkerRequest.h&r1=123858&p2=httpd/mod_aspdotnet/trunk/Apache.Web/WorkerRequest.h&r2=123859
==============================================================================
--- httpd/mod_aspdotnet/trunk/Apache.Web/WorkerRequest.h        (original)
+++ httpd/mod_aspdotnet/trunk/Apache.Web/WorkerRequest.h        Sat Jan  1 
15:41:21 2005
@@ -26,6 +26,7 @@
 
 using namespace Apache::Web::Helpers;
 using namespace System::Collections;
+using namespace System::Globalization;
 
 namespace Apache
 {
@@ -49,9 +50,18 @@
         static String* request_headers_s[] = {
             request_headers_m(L)
         };
+        static String* response_headers_index_s[] = {
+            response_headers_index_m(L)
+        };
+        static String* request_headers_index_s[] = {
+            request_headers_index_m(L)
+        };
 
         // Create our utf8-encoding to handle utf8->unicode names
         static Encoding *utf8_encoding = new UTF8Encoding(false);
+
+        // Create our invariant culture for handling ASCII case
+        static CultureInfo *nullCulture = CultureInfo::InvariantCulture;
     
         String* uri;
         String* unparsed_uri;
@@ -64,6 +74,7 @@
 
         String* known_req_header_value[];
         ArrayList* unk_req_header_name;
+        ArrayList* unk_req_header_index;
         ArrayList* unk_req_header_value;
         ArrayList* env_var;
         ArrayList* env_value;
@@ -89,17 +100,25 @@
         static bool CodeValidate() {
             if (response_headers_s->get_Length() != ResponseHeaderMaximum)
                 return false;
+            if (response_headers_index_s->get_Length() != 
ResponseHeaderMaximum)
+                return false;
             for (int i = 0; i < ResponseHeaderMaximum; ++i) {
                 String *s = HttpWorkerRequest::GetKnownResponseHeaderName(i);
                 if (response_headers_s[i]->CompareTo(s) != 0)
                     return false;
+                if 
(response_headers_index_s[i]->CompareTo(s->ToLower(nullCulture)) != 0)
+                    return false;
             }
             if (request_headers_s->get_Length() != RequestHeaderMaximum)
                 return false;
+            if (request_headers_index_s->get_Length() != RequestHeaderMaximum)
+                return false;
             for (int i = 0; i < RequestHeaderMaximum; ++i) {
                 String *s = HttpWorkerRequest::GetKnownRequestHeaderName(i);
                 if (request_headers_s[i]->CompareTo(s) != 0)
                     return false;
+                if 
(request_headers_index_s[i]->CompareTo(s->ToLower(nullCulture)) != 0)
+                    return false;
             }
             return true;
         }
@@ -364,7 +383,7 @@
     
         virtual String* GetUnknownRequestHeader(String* name) 
         {
-            int ent = unk_req_header_name->IndexOf(name);
+            int ent = 
unk_req_header_index->IndexOf(name->ToLower(nullCulture));
             if (ent >= 0) {
                 String *val = 
static_cast<String*>(unk_req_header_value->get_Item(ent));
 #ifdef _DEBUG
@@ -393,12 +412,7 @@
 
         static int GetKnownRequestHeaderIndex(String *header)
         {
-            for (int i = 0; i < RequestHeaderMaximum; ++i) {
-                if (String::Compare(header, request_headers_s[i]) == 0) {
-                    return i;
-                }
-            }
-            return -1;
+            return Array::IndexOf(request_headers_index_s, 
header->ToLower(nullCulture));
         }
 
         static String *GetKnownRequestHeaderName(int header)
@@ -411,11 +425,7 @@
 
         static int GetKnownResponseHeaderIndex(String *header)
         {
-            for (int i = 0; i < ResponseHeaderMaximum; ++i) {
-                if (String::Compare(header, response_headers_s[i]) == 0)
-                    return i;
-            }
-            return -1;
+            return Array::IndexOf(response_headers_index_s, 
header->ToLower(nullCulture));
         }
 
         static String *GetKnownResponseHeaderName(int header)
@@ -518,7 +528,7 @@
             if (index >= 0 && index < ResponseHeaderMaximum) {
 #ifdef _DEBUG
                 String *res = String::Concat(L"SendKnownResponseHeader: ", 
-                                             response_headers_c[index], 
+                                             response_headers_s[index], 
                                              L" as ", value);
                 LogRequestError(res, APLOG_DEBUG, 0);
 #endif

Modified: httpd/mod_aspdotnet/trunk/Apache.Web/http_header_arrays.h
Url: 
http://svn.apache.org/viewcvs/httpd/mod_aspdotnet/trunk/Apache.Web/http_header_arrays.h?view=diff&rev=123859&p1=httpd/mod_aspdotnet/trunk/Apache.Web/http_header_arrays.h&r1=123858&p2=httpd/mod_aspdotnet/trunk/Apache.Web/http_header_arrays.h&r2=123859
==============================================================================
--- httpd/mod_aspdotnet/trunk/Apache.Web/http_header_arrays.h   (original)
+++ httpd/mod_aspdotnet/trunk/Apache.Web/http_header_arrays.h   Sat Jan  1 
15:41:21 2005
@@ -77,3 +77,61 @@
     t##"Range",                \
     t##"TE",                   \
     t##"User-Agent"
+
+#define common_headers_index_m(t) \
+    t##"cache-control",        \
+    t##"connection",           \
+    t##"date",                 \
+    t##"keep-alive",           \
+    t##"pragma",               \
+    t##"trailer",              \
+    t##"transfer-encoding",    \
+    t##"upgrade",              \
+    t##"via",                  \
+    t##"warning",              \
+    t##"allow",                \
+    t##"content-length",       \
+    t##"content-type",         \
+    t##"content-encoding",     \
+    t##"content-language",     \
+    t##"content-location",     \
+    t##"content-md5",          \
+    t##"content-range",        \
+    t##"expires",              \
+    t##"last-modified"
+
+#define response_headers_index_m(t) \
+    common_headers_index_m(t), \
+    t##"accept-ranges",        \
+    t##"age",                  \
+    t##"etag",                 \
+    t##"location",             \
+    t##"proxy-authenticate",   \
+    t##"retry-after",          \
+    t##"server",               \
+    t##"set-cookie",           \
+    t##"vary",                 \
+    t##"www-authenticate"
+
+#define request_headers_index_m(t) \
+    common_headers_index_m(t), \
+    t##"accept",               \
+    t##"accept-charset",       \
+    t##"accept-encoding",      \
+    t##"accept-language",      \
+    t##"authorization",        \
+    t##"cookie",               \
+    t##"expect",               \
+    t##"from",                 \
+    t##"host",                 \
+    t##"if-match",             \
+    t##"if-modified-since",    \
+    t##"if-none-match",        \
+    t##"if-range",             \
+    t##"if-unmodified-since",  \
+    t##"max-forwards",         \
+    t##"proxy-authorization",  \
+    t##"referer",              \
+    t##"range",                \
+    t##"te",                   \
+    t##"user-agent"

Reply via email to