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