]> git.ipfire.org Git - thirdparty/squid.git/blame - src/mgr/QueryParams.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / mgr / QueryParams.cc
CommitLineData
b8151fa1 1/*
b8151fa1
CT
2 * DEBUG: section 16 Cache Manager API
3 *
4 */
5
f7f3304a 6#include "squid.h"
b8151fa1
CT
7#include "base/TextException.h"
8#include "ipc/TypedMsgHdr.h"
9#include "mgr/IntParam.h"
b8151fa1 10#include "mgr/QueryParams.h"
602d9612 11#include "mgr/StringParam.h"
b8151fa1 12
b8151fa1 13Mgr::QueryParam::Pointer
22b5be72 14Mgr::QueryParams::get(const String& name) const
b8151fa1
CT
15{
16 Must(name.size() != 0);
22b5be72 17 Params::const_iterator pos = find(name);
b8151fa1
CT
18 return (pos == params.end() ? NULL : pos->second);
19}
20
21void
22Mgr::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
33void
34Mgr::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
22b5be72
CT
51Mgr::QueryParams::Params::const_iterator
52Mgr::QueryParams::find(const String& name) const
b8151fa1
CT
53{
54 Must(name.size() != 0);
22b5be72 55 Params::const_iterator iter = params.begin();
b8151fa1
CT
56 for ( ; iter != params.end(); ++iter) {
57 if (name.caseCmp(iter->first) == 0)
58 break;
59 }
60 return iter;
61}
62
63bool
64Mgr::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
96bool
97Mgr::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
120Mgr::QueryParam::Pointer
121Mgr::QueryParams::CreateParam(QueryParam::Type aType)
122{
10c40d99 123 switch (aType) {
b8151fa1
CT
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}