]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/mgr/QueryParams.cc
2 * Copyright (C) 1996-2014 The Squid Software Foundation and contributors
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.
9 /* DEBUG: section 16 Cache Manager API */
12 #include "base/TextException.h"
13 #include "ipc/TypedMsgHdr.h"
14 #include "mgr/IntParam.h"
15 #include "mgr/QueryParams.h"
16 #include "mgr/StringParam.h"
18 Mgr::QueryParam::Pointer
19 Mgr::QueryParams::get(const String
& name
) const
21 Must(name
.size() != 0);
22 Params::const_iterator pos
= find(name
);
23 return (pos
== params
.end() ? NULL
: pos
->second
);
27 Mgr::QueryParams::pack(Ipc::TypedMsgHdr
& msg
) const
29 msg
.putInt(params
.size());
30 for (Params::const_iterator iter
= params
.begin(); iter
!= params
.end(); ++iter
) {
31 Must(iter
->first
.size() != 0);
32 msg
.putString(iter
->first
);
33 Must(iter
->second
!= NULL
);
34 iter
->second
->pack(msg
);
39 Mgr::QueryParams::unpack(const Ipc::TypedMsgHdr
& msg
)
41 int count
= msg
.getInt();
44 for ( ; count
> 0; --count
) {
47 Must(name
.size() != 0);
48 QueryParam::Type type
;
50 QueryParam::Pointer value
= CreateParam(type
);
51 value
->unpackValue(msg
);
52 params
.push_back(Param(name
, value
));
56 Mgr::QueryParams::Params::const_iterator
57 Mgr::QueryParams::find(const String
& name
) const
59 Must(name
.size() != 0);
60 Params::const_iterator iter
= params
.begin();
61 for ( ; iter
!= params
.end(); ++iter
) {
62 if (name
.caseCmp(iter
->first
) == 0)
69 Mgr::QueryParams::ParseParam(const String
& paramStr
, Param
& param
)
74 regcomp(&intExpr
, "^([a-z][a-z0-9_]*)=([0-9]+((,[0-9]+))*)$", REG_EXTENDED
| REG_ICASE
);
76 regcomp(&stringExpr
, "^([a-z][a-z0-9_]*)=([^&= ]+)$", REG_EXTENDED
| REG_ICASE
);
77 if (regexec(&intExpr
, paramStr
.termedBuf(), 3, pmatch
, 0) == 0) {
78 param
.first
= paramStr
.substr(pmatch
[1].rm_so
, pmatch
[1].rm_eo
);
79 std::vector
<int> array
;
80 int n
= pmatch
[2].rm_so
;
81 for (int i
= n
; i
< pmatch
[2].rm_eo
; ++i
) {
82 if (paramStr
[i
] == ',') {
83 array
.push_back(atoi(paramStr
.substr(n
, i
).termedBuf()));
87 if (n
< pmatch
[2].rm_eo
)
88 array
.push_back(atoi(paramStr
.substr(n
, pmatch
[2].rm_eo
).termedBuf()));
89 param
.second
= new IntParam(array
);
91 } else if (regexec(&stringExpr
, paramStr
.termedBuf(), 3, pmatch
, 0) == 0) {
92 param
.first
= paramStr
.substr(pmatch
[1].rm_so
, pmatch
[1].rm_eo
);
93 param
.second
= new StringParam(paramStr
.substr(pmatch
[2].rm_so
, pmatch
[2].rm_eo
));
102 Mgr::QueryParams::Parse(const String
& aParamsStr
, QueryParams
& aParams
)
104 if (aParamsStr
.size() != 0) {
107 size_t len
= aParamsStr
.size();
108 for (size_t i
= n
; i
< len
; ++i
) {
109 if (aParamsStr
[i
] == '&') {
110 if (!ParseParam(aParamsStr
.substr(n
, i
), param
))
112 aParams
.params
.push_back(param
);
117 if (!ParseParam(aParamsStr
.substr(n
, len
), param
))
119 aParams
.params
.push_back(param
);
125 Mgr::QueryParam::Pointer
126 Mgr::QueryParams::CreateParam(QueryParam::Type aType
)
129 case QueryParam::ptInt
:
130 return new IntParam();
132 case QueryParam::ptString
:
133 return new StringParam();
136 throw TexcHere("unknown parameter type");