Use case-insensitive comparison for header names in *_header_access
and *_header_replace directives.

=== modified file 'src/HttpHeaderTools.h'
--- src/HttpHeaderTools.h	2012-07-13 11:53:18 +0000
+++ src/HttpHeaderTools.h	2013-05-15 17:01:55 +0000
@@ -1,12 +1,18 @@
 #ifndef SQUID_HTTPHEADERTOOLS_H
 #define SQUID_HTTPHEADERTOOLS_H
 
+#if HAVE_FUNCTIONAL
+#include <functional>
+#endif
 #if HAVE_MAP
 #include <map>
 #endif
 #if HAVE_STRING
 #include <string>
 #endif
+#if HAVE_STRINGS_H
+#include <strings.h>
+#endif
 
 class acl_access;
 struct _header_mangler {
@@ -39,8 +45,17 @@
     void dumpReplacement(StoreEntry *entry, const char *optionName) const;
 
 private:
+    /// Case-insensitive std::string comparison functor.
+    /// Fast version recommended by Meyers' "Effective STL" for ASCII c-strings.
+    class NoCaseLess: public std::binary_function<std::string, std::string, bool> {
+    public:
+        bool operator()(const std::string &lhs, const std::string &rhs) const {
+            return strcasecmp(lhs.c_str(), rhs.c_str()) < 0;
+        }
+    };
+
     /// a name:mangler map; optimize: use unordered map or some such
-    typedef std::map<std::string, header_mangler> ManglersByName;
+    typedef std::map<std::string, header_mangler, NoCaseLess> ManglersByName;
 
     /// one mangler for each known header
     header_mangler known[HDR_ENUM_END];


