1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
#ifndef SQUID_HTTPHEADERTOOLS_H
#define SQUID_HTTPHEADERTOOLS_H
#include "acl/forward.h"
#include "format/Format.h"
#include "HttpHeader.h"
#include "typedefs.h"
#if HAVE_FUNCTIONAL
#include <functional>
#endif
#if HAVE_LIST
#include <list>
#endif
#if HAVE_MAP
#include <map>
#endif
#if HAVE_STRING
#include <string>
#endif
#if HAVE_STRINGS_H
#include <strings.h>
#endif
class HeaderWithAcl;
class HttpHeader;
class HttpHeaderFieldInfo;
class HttpRequest;
class StoreEntry;
class String;
typedef std::list<HeaderWithAcl> HeaderWithAclList;
// Currently a POD
class headerMangler
{
public:
acl_access *access_list;
char *replacement;
};
/// A collection of headerMangler objects for a given message kind.
class HeaderManglers
{
public:
HeaderManglers();
~HeaderManglers();
/// returns a header mangler for field e or nil if none was specified
const headerMangler *find(const HttpHeaderEntry &e) const;
/// returns a mangler for the named header (known or custom)
headerMangler *track(const char *name);
/// updates mangler for the named header with a replacement value
void setReplacement(const char *name, const char *replacementValue);
/// report the *_header_access part of the configuration
void dumpAccess(StoreEntry *entry, const char *optionName) const;
/// report the *_header_replace part of the configuration
void dumpReplacement(StoreEntry *entry, const char *optionName) const;
private:
/// Case-insensitive std::string "less than" comparison functor.
/// Fast version recommended by Meyers' "Effective STL" for ASCII c-strings.
class NoCaseLessThan: 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, NoCaseLessThan> ManglersByName;
/// one mangler for each known header
headerMangler known[HDR_ENUM_END];
/// one mangler for each custom header
ManglersByName custom;
/// configured if some mangling ACL applies to all header names
headerMangler all;
private:
/* not implemented */
HeaderManglers(const HeaderManglers &);
HeaderManglers &operator =(const HeaderManglers &);
};
class HeaderWithAcl
{
public:
HeaderWithAcl() : aclList(NULL), valueFormat(NULL), fieldId(HDR_BAD_HDR), quoted(false) {}
/// HTTP header field name
std::string fieldName;
/// HTTP header field value, possibly with macros
std::string fieldValue;
/// when the header field should be added (always if nil)
ACLList *aclList;
/// compiled HTTP header field value (no macros)
Format::Format *valueFormat;
/// internal ID for "known" headers or HDR_OTHER
http_hdr_type fieldId;
/// whether fieldValue may contain macros
bool quoted;
};
int httpHeaderParseOffset(const char *start, int64_t * off);
HttpHeaderFieldInfo *httpHeaderBuildFieldsInfo(const HttpHeaderFieldAttrs * attrs, int count);
void httpHeaderDestroyFieldsInfo(HttpHeaderFieldInfo * info, int count);
http_hdr_type httpHeaderIdByName(const char *name, size_t name_len, const HttpHeaderFieldInfo * attrs, int end);
http_hdr_type httpHeaderIdByNameDef(const char *name, int name_len);
const char *httpHeaderNameById(int id);
int httpHeaderHasConnDir(const HttpHeader * hdr, const char *directive);
int httpHeaderParseInt(const char *start, int *val);
void httpHeaderPutStrf(HttpHeader * hdr, http_hdr_type id, const char *fmt,...) PRINTF_FORMAT_ARG3;
const char *getStringPrefix(const char *str, const char *end);
void httpHdrMangleList(HttpHeader *, HttpRequest *, int req_or_rep);
#endif
|