]> git.ipfire.org Git - thirdparty/squid.git/blob - src/mgr/QueryParams.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / mgr / QueryParams.cc
1 /*
2 * DEBUG: section 16 Cache Manager API
3 *
4 */
5
6 #include "squid.h"
7 #include "base/TextException.h"
8 #include "ipc/TypedMsgHdr.h"
9 #include "mgr/IntParam.h"
10 #include "mgr/QueryParams.h"
11 #include "mgr/StringParam.h"
12
13 Mgr::QueryParam::Pointer
14 Mgr::QueryParams::get(const String& name) const
15 {
16 Must(name.size() != 0);
17 Params::const_iterator pos = find(name);
18 return (pos == params.end() ? NULL : pos->second);
19 }
20
21 void
22 Mgr::QueryParams::pack(Ipc::TypedMsgHdr& msg) const
23 {
24 msg.putInt(params.size());
25 for (Params::const_iterator iter = params.begin(); iter != params.end(); ++iter) {
26 Must(iter->first.size() != 0);
27 msg.putString(iter->first);
28 Must(iter->second != NULL);
29 iter->second->pack(msg);
30 }
31 }
32
33 void
34 Mgr::QueryParams::unpack(const Ipc::TypedMsgHdr& msg)
35 {
36 int count = msg.getInt();
37 Must(count >= 0);
38 params.clear();
39 for ( ; count > 0; --count) {
40 String name;
41 msg.getString(name);
42 Must(name.size() != 0);
43 QueryParam::Type type;
44 msg.getPod(type);
45 QueryParam::Pointer value = CreateParam(type);
46 value->unpackValue(msg);
47 params.push_back(Param(name, value));
48 }
49 }
50
51 Mgr::QueryParams::Params::const_iterator
52 Mgr::QueryParams::find(const String& name) const
53 {
54 Must(name.size() != 0);
55 Params::const_iterator iter = params.begin();
56 for ( ; iter != params.end(); ++iter) {
57 if (name.caseCmp(iter->first) == 0)
58 break;
59 }
60 return iter;
61 }
62
63 bool
64 Mgr::QueryParams::ParseParam(const String& paramStr, Param& param)
65 {
66 bool parsed = false;
67 regmatch_t pmatch[3];
68 regex_t intExpr;
69 regcomp(&intExpr, "^([a-z][a-z0-9_]*)=([0-9]+((,[0-9]+))*)$", REG_EXTENDED | REG_ICASE);
70 regex_t stringExpr;
71 regcomp(&stringExpr, "^([a-z][a-z0-9_]*)=([^&= ]+)$", REG_EXTENDED | REG_ICASE);
72 if (regexec(&intExpr, paramStr.termedBuf(), 3, pmatch, 0) == 0) {
73 param.first = paramStr.substr(pmatch[1].rm_so, pmatch[1].rm_eo);
74 std::vector<int> array;
75 int n = pmatch[2].rm_so;
76 for (int i = n; i < pmatch[2].rm_eo; ++i) {
77 if (paramStr[i] == ',') {
78 array.push_back(atoi(paramStr.substr(n, i).termedBuf()));
79 n = i + 1;
80 }
81 }
82 if (n < pmatch[2].rm_eo)
83 array.push_back(atoi(paramStr.substr(n, pmatch[2].rm_eo).termedBuf()));
84 param.second = new IntParam(array);
85 parsed = true;
86 } else if (regexec(&stringExpr, paramStr.termedBuf(), 3, pmatch, 0) == 0) {
87 param.first = paramStr.substr(pmatch[1].rm_so, pmatch[1].rm_eo);
88 param.second = new StringParam(paramStr.substr(pmatch[2].rm_so, pmatch[2].rm_eo));
89 parsed = true;
90 }
91 regfree(&stringExpr);
92 regfree(&intExpr);
93 return parsed;
94 }
95
96 bool
97 Mgr::QueryParams::Parse(const String& aParamsStr, QueryParams& aParams)
98 {
99 if (aParamsStr.size() != 0) {
100 Param param;
101 size_t n = 0;
102 size_t len = aParamsStr.size();
103 for (size_t i = n; i < len; ++i) {
104 if (aParamsStr[i] == '&') {
105 if (!ParseParam(aParamsStr.substr(n, i), param))
106 return false;
107 aParams.params.push_back(param);
108 n = i + 1;
109 }
110 }
111 if (n < len) {
112 if (!ParseParam(aParamsStr.substr(n, len), param))
113 return false;
114 aParams.params.push_back(param);
115 }
116 }
117 return true;
118 }
119
120 Mgr::QueryParam::Pointer
121 Mgr::QueryParams::CreateParam(QueryParam::Type aType)
122 {
123 switch (aType) {
124 case QueryParam::ptInt:
125 return new IntParam();
126
127 case QueryParam::ptString:
128 return new StringParam();
129
130 default:
131 throw TexcHere("unknown parameter type");
132 break;
133 }
134 return NULL;
135 }