On 05/15/2013 07:41 AM, Amos Jeffries wrote:
> On 16/05/2013 1:06 a.m., Martin Sperl wrote:
>> Hi!
>>
>> We came across a strange "bug" in squid in regards to icap and
>> request_header access.
>
> It is a bug alright. Header names are supposed to be case-insensitive.
The attached patches fix this bug in Squid v3.2 and trunk.
Disclaimers: I only tested the trunk patch. I do not think this is
related to ICAP (the bug affects all Squid configurations that use
header_access directives).
HTH,
Alex.
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];
Use case-insensitive comparison for header names in *_header_access
and *_header_replace directives.
=== modified file 'src/HttpHeaderTools.h'
--- src/HttpHeaderTools.h 2013-02-17 09:31:18 +0000
+++ src/HttpHeaderTools.h 2013-05-15 16:31:39 +0000
@@ -5,6 +5,9 @@
#include "HttpHeader.h"
#include "typedefs.h"
+#if HAVE_FUNCTIONAL
+#include <functional>
+#endif
#if HAVE_LIST
#include <list>
#endif
@@ -14,6 +17,9 @@
#if HAVE_STRING
#include <string>
#endif
+#if HAVE_STRINGS_H
+#include <strings.h>
+#endif
class acl_access;
class ACLList;
@@ -56,8 +62,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, headerMangler> ManglersByName;
+ typedef std::map<std::string, headerMangler, NoCaseLess> ManglersByName;
/// one mangler for each known header
headerMangler known[HDR_ENUM_END];