1 /* 2 * Copyright (C) 1996-2021 The Squid Software Foundation and contributors 3 * 4 * Squid software is distributed under GPLv2+ license and includes 5 * contributions from numerous individuals and organizations. 6 * Please see the COPYING and CONTRIBUTORS files for details. 7 */ 8 9 #ifndef SQUID_ESIVARSTATE_H 10 #define SQUID_ESIVARSTATE_H 11 12 #include "esi/Segment.h" 13 #include "HttpHeader.h" 14 #include "libTrie/Trie.h" 15 16 #include <vector> 17 18 class HttpReply; 19 20 /* esi variable replacement logic */ 21 22 typedef enum { 23 ESI_BROWSER_MSIE, 24 ESI_BROWSER_MOZILLA, 25 ESI_BROWSER_OTHER 26 } esiBrowser_t; 27 28 extern char const * esiBrowsers[]; 29 30 /* Recursive uses are not supported by design */ 31 32 struct _query_elem {char *var, *val;}; 33 34 class ESIVarState 35 { 36 CBDATA_CLASS(ESIVarState); 37 38 public: 39 ESIVarState(HttpHeader const *hdr, char const *uri); 40 ~ESIVarState(); 41 42 ESISegment::Pointer extractList(); 43 char *extractChar(); 44 void feedData (const char *buf, size_t len); 45 void buildVary (HttpReply *rep); 46 47 class Variable; 48 void addVariable (char const *, size_t, Variable *); 49 void removeVariable (String const &); 50 51 /* For Variables */ 52 void cookieUsed(); 53 void hostUsed(); 54 void languageUsed(); 55 void refererUsed(); 56 void useragentUsed(); 57 ESISegment::Pointer &getOutput(); 58 HttpHeader &header(); 59 60 private: 61 ESISegment::Pointer input; 62 ESISegment::Pointer output; 63 HttpHeader hdr; 64 65 struct { 66 int language:1; 67 int cookie:1; 68 int host:1; 69 int referer:1; 70 int useragent:1; 71 } flags; 72 73 public: 74 75 class Variable 76 { 77 78 public: Variable()79 Variable () {} 80 ~Variable()81 virtual ~Variable() {} 82 83 /* prevent synthetics */ Variable(Variable const &)84 Variable (Variable const &) {} 85 86 Variable &operator= (Variable const &); 87 virtual void eval (ESIVarState &state, char const *, char const *) const; 88 }; 89 90 Variable* GetVar(char const *s, int len); 91 92 private: 93 void doIt (); 94 void setupUserAgent(); 95 Trie variables; 96 std::vector<Variable*> variablesForCleanup; 97 Variable *defaultVariable; 98 }; 99 100 class ESIVariableCookie : public ESIVarState::Variable 101 { 102 103 public: 104 virtual void eval (ESIVarState &state, char const *, char const *) const; 105 }; 106 107 class ESIVariableHost : public ESIVarState::Variable 108 { 109 110 public: 111 virtual void eval (ESIVarState &state, char const *, char const *) const; 112 }; 113 114 class ESIVariableLanguage : public ESIVarState::Variable 115 { 116 117 public: 118 virtual void eval (ESIVarState &state, char const *, char const *) const; 119 }; 120 121 class ESIVariableQuery : public ESIVarState::Variable 122 { 123 124 public: 125 ESIVariableQuery(char const *uri); 126 ~ESIVariableQuery(); 127 virtual void eval (ESIVarState &state, char const *, char const *) const; 128 char const *queryString() const; 129 130 struct _query_elem const *queryVector() const; 131 size_t const &queryElements() const; 132 133 struct _query_elem *query; 134 size_t query_sz; 135 size_t query_elements; 136 char *query_string; 137 }; 138 139 class ESIVariableReferer : public ESIVarState::Variable 140 { 141 142 public: 143 virtual void eval (ESIVarState &state, char const *, char const *) const; 144 }; 145 146 class ESIVariableUserAgent : public ESIVarState::Variable 147 { 148 149 public: 150 ~ESIVariableUserAgent(); 151 ESIVariableUserAgent (ESIVarState &state); 152 virtual void eval (ESIVarState &state, char const *, char const *) const; 153 154 private: 155 static char const * esiUserOs[]; 156 enum esiUserOs_t { 157 ESI_OS_WIN, 158 ESI_OS_MAC, 159 ESI_OS_UNIX, 160 ESI_OS_OTHER 161 }; 162 esiUserOs_t identifyOs(char const *) const; browserVersion()163 char const *browserVersion() const {return browserversion;} 164 165 char *getProductVersion (char const *s); 166 esiUserOs_t UserOs; 167 esiBrowser_t browser; 168 char *browserversion; 169 }; 170 171 #endif /* SQUID_ESIVARSTATE_H */ 172 173