]> git.ipfire.org Git - thirdparty/squid.git/blame - src/esi/Assign.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / esi / Assign.cc
CommitLineData
924f73bc 1/*
4ac4a490 2 * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
924f73bc 3 *
bbc27441
AJ
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.
924f73bc 7 */
8
bbc27441
AJ
9/* DEBUG: section 86 ESI processing */
10
582c2af2 11#include "squid.h"
3db19d36 12
454e8283 13/* MS Visual Studio Projects are monolithic, so we need the following
14 * #if to exclude the ESI code from compile process when not needed.
15 */
16#if (USE_SQUID_ESI == 1)
17
f99c2cfe
AR
18#include "esi/Assign.h"
19#include "esi/Context.h"
20#include "esi/Sequence.h"
f522f9b5 21#include "HttpReply.h"
924f73bc 22
924f73bc 23ESIAssign::~ESIAssign()
24{
25 if (value)
26 delete value;
27}
28
29ESIAssign::ESIAssign (ESIAssign const &old) : parent (NULL), varState (NULL), name (old.name), value (old.value ? new ESIVariableExpression (*old.value): NULL), variable (NULL), unevaluatedVariable(old.unevaluatedVariable)
30{}
31
32ESIAssign::ESIAssign (esiTreeParentPtr aParent, int attrcount, char const **attr, ESIContext *aContext) : parent (aParent), varState (NULL), name(), value (NULL), variable (NULL), unevaluatedVariable()
33{
34 /* TODO: grab content IFF no value was specified */
35 assert (aContext);
36
37 for (int i = 0; i < attrcount && attr[i]; i += 2) {
38 if (!strcmp(attr[i],"name")) {
39 /* the variables name is ... */
bf8fe701 40 debugs(86, 5, "ESIAssign::ESIAssign: Variable name '" << attr[i+1] << "'");
924f73bc 41 /* If there are duplicate name attributes, we simply use the
42 * last one
43 */
44 name = attr[i+1];
45 } else if (!strcmp(attr[i],"value")) {
46 /* short form assignment: */
bf8fe701 47 debugs(86, 5, "ESIAssign::ESIAssign: Unevaluated variable '" << attr[i+1] << "'");
924f73bc 48 /* Again, if there are duplicate attributes, we use the last */
49 unevaluatedVariable = attr[i+1];
50 } else {
51 /* ignore mistyped attributes. TODO:? error on these for user feedback - config parameter needed
52 */
53 }
54 }
55
56 varState = cbdataReference(aContext->varState);
57}
58
59void
60ESIAssign::evaluateVariable()
61{
62 if (variable.getRaw())
63 variable->process (false);
64
65 variable = NULL;
66
67 if (unevaluatedVariable.size()) {
bb790702 68 varState->feedData(unevaluatedVariable.rawBuf(), unevaluatedVariable.size());
924f73bc 69 char const *result = varState->extractChar ();
70
71 /* Consider activating this, when we want to evaluate variables to a
72 * value
73 */
74 // setTestResult(ESIExpression::Evaluate (expression));
75
76 value = new ESIVariableExpression (result);
77
78 safe_free (result);
79 }
80}
81
82void
83ESIAssign::provideData (ESISegment::Pointer data, ESIElement * source)
84{
85 assert (source == variable.getRaw());
86 char *result = data->listToChar();
87 unevaluatedVariable = result;
88 safe_free (result);
89}
90
91esiProcessResult_t
92ESIAssign::process (int dovars)
93{
94 assert (varState);
95
96 if (!value)
97 evaluateVariable();
98
99 if (!value)
100 return ESI_PROCESS_COMPLETE;
101
bb790702 102 varState->addVariable (name.rawBuf(), name.size(), value);
924f73bc 103
104 value = NULL;
105
bf8fe701 106 debugs(86, 5, "ESIAssign: Processed " << this);
924f73bc 107
108 return ESI_PROCESS_COMPLETE;
109}
110
111void
112ESIAssign::render(ESISegment::Pointer)
113{}
114
115ESIAssign::Pointer
116ESIAssign::makeCacheable() const
117{
118 ESIAssign *result = new ESIAssign (*this);
119
120 if (variable.getRaw())
121 result->variable = variable->makeCacheable();
122
123 return result;
124}
125
126ESIAssign::Pointer
127ESIAssign::makeUsable(esiTreeParentPtr aParent, ESIVarState &aVarState) const
128{
129 ESIAssign *result = new ESIAssign (*this);
130 result->parent = aParent;
131 result->varState = cbdataReference(&aVarState);
132
133 if (variable.getRaw())
134 result->variable = variable->makeUsable(result, aVarState);
135
136 return result;
137}
138
139void
140ESIAssign::finish()
141{
142 if (varState)
143 cbdataReferenceDone (varState);
144
145 if (parent.getRaw())
146 parent = NULL;
147}
148
149bool
150ESIAssign::addElement(ESIElement::Pointer anElement)
151{
152 /* we have a value, drop the element on the floor */
153
154 if (unevaluatedVariable.size())
155 return true;
156
157 if (!variable.getRaw())
158 variable = new esiSequence (this, false);
159
160 return variable->addElement (anElement);
161}
162
163ESIVariableExpression::~ESIVariableExpression()
164{}
165
30abd221 166ESIVariableExpression::ESIVariableExpression (String const &aString) : expression (aString)
924f73bc 167{}
168
169void
170ESIVariableExpression::eval (ESIVarState &state, char const *subref, char const *defaultOnEmpty) const
171{
172 /* XXX: Implement evaluation of the expression */
bb790702 173 ESISegment::ListAppend (state.getOutput(), expression.rawBuf(), expression.size());
924f73bc 174}
454e8283 175
176#endif /* USE_SQUID_ESI == 1 */
f53969cc 177