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"