]> git.ipfire.org Git - thirdparty/squid.git/blob - src/esi/VarState.h
SourceFormat Enforcement
[thirdparty/squid.git] / src / esi / VarState.h
1 /*
2 * Copyright (C) 1996-2015 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
37 public:
38 ESISegment::Pointer extractList();
39 char *extractChar();
40 void feedData (const char *buf, size_t len);
41 void buildVary (HttpReply *rep);
42
43 class Variable;
44 void addVariable (char const *, size_t, Variable *);
45 void removeVariable (String const &);
46
47 void *operator new (size_t byteCount);
48 void operator delete (void *address);
49 void freeResources();
50 ESIVarState (HttpHeader const *hdr, char const *uri);
51 ~ESIVarState();
52
53 /* For Variables */
54 void cookieUsed();
55 void hostUsed();
56 void languageUsed();
57 void refererUsed();
58 void useragentUsed();
59 ESISegment::Pointer &getOutput();
60 HttpHeader &header();
61
62 private:
63 ESISegment::Pointer input;
64 ESISegment::Pointer output;
65 HttpHeader hdr;
66
67 struct {
68 int language:1;
69 int cookie:1;
70 int host:1;
71 int referer:1;
72 int useragent:1;
73 } flags;
74
75 public:
76
77 class Variable
78 {
79
80 public:
81 Variable () {}
82
83 virtual ~Variable() {}
84
85 /* prevent synthetics */
86 Variable (Variable const &) {}
87
88 Variable &operator= (Variable const &);
89 virtual void eval (ESIVarState &state, char const *, char const *) const;
90 };
91
92 Variable* GetVar(char const *s, int len);
93
94 private:
95 void doIt ();
96 void setupUserAgent();
97 Trie variables;
98 std::vector<Variable*> variablesForCleanup;
99 Variable *defaultVariable;
100 };
101
102 class ESIVariableCookie : public ESIVarState::Variable
103 {
104
105 public:
106 virtual void eval (ESIVarState &state, char const *, char const *) const;
107 };
108
109 class ESIVariableHost : public ESIVarState::Variable
110 {
111
112 public:
113 virtual void eval (ESIVarState &state, char const *, char const *) const;
114 };
115
116 class ESIVariableLanguage : public ESIVarState::Variable
117 {
118
119 public:
120 virtual void eval (ESIVarState &state, char const *, char const *) const;
121 };
122
123 class ESIVariableQuery : public ESIVarState::Variable
124 {
125
126 public:
127 ESIVariableQuery(char const *uri);
128 ~ESIVariableQuery();
129 virtual void eval (ESIVarState &state, char const *, char const *) const;
130 char const *queryString() const;
131
132 struct _query_elem const *queryVector() const;
133 size_t const &queryElements() const;
134
135 struct _query_elem *query;
136 size_t query_sz;
137 size_t query_elements;
138 char *query_string;
139 };
140
141 class ESIVariableReferer : public ESIVarState::Variable
142 {
143
144 public:
145 virtual void eval (ESIVarState &state, char const *, char const *) const;
146 };
147
148 class ESIVariableUserAgent : public ESIVarState::Variable
149 {
150
151 public:
152 ~ESIVariableUserAgent();
153 ESIVariableUserAgent (ESIVarState &state);
154 virtual void eval (ESIVarState &state, char const *, char const *) const;
155
156 private:
157 static char const * esiUserOs[];
158 enum esiUserOs_t {
159 ESI_OS_WIN,
160 ESI_OS_MAC,
161 ESI_OS_UNIX,
162 ESI_OS_OTHER
163 };
164 esiUserOs_t identifyOs(char const *) const;
165 char const *browserVersion() const {return browserversion;}
166
167 char *getProductVersion (char const *s);
168 esiUserOs_t UserOs;
169 esiBrowser_t browser;
170 char *browserversion;
171 };
172
173 #endif /* SQUID_ESIVARSTATE_H */
174