32 encode(
const std::string &str,
const std::string &safe,
35 std::string skip(
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
36 "abcdefghijklmnopqrstuvwxyz"
38 std::string more(
":/?#[]@!$&'()*+,;=");
42 for(
size_t i=0; i<safe.size(); i++)
44 if( more.find(safe.at(i)) != std::string::npos)
45 skip.append(1, safe.at(i));
52 pos = str.find_first_not_of(skip, beg);
53 if(pos != std::string::npos)
57 out.append(str, beg, pos - beg);
63 std::isxdigit(str.at(pos + 1)) &&
64 std::isxdigit(str.at(pos + 2)))
66 out.append(str, pos, 3);
77 out.append(str, beg, len - beg);
87 decode(
const std::string &str,
bool allowNUL)
97 if( pos + 2 < len && out.at(pos) ==
'%')
111 _(
"Encoded string contains a NUL byte")
134 static const unsigned char tab[] =
"0123456789ABCDEF";
135 unsigned char out[4];
138 out[1] = tab[0x0f & (c >> 4)];
139 out[2] = tab[0x0f & c];
143 return std::string((
char *)out);
151 if(hex && std::isxdigit(hex[0]) && std::isxdigit(hex[1]))
153 char x[3] = { hex[0], hex[1],
'\0'};
154 return 0xff & ::strtol(x, NULL, 16);
166 const std::string &pstr,
167 const std::string &psep)
169 size_t beg, pos, len;
173 _(
"Invalid parameter array split separator character")
182 pos = pstr.find(psep, beg);
183 if(pos != std::string::npos)
185 pvec.push_back( pstr.substr(beg, pos - beg));
190 pvec.push_back( pstr.substr(beg, len - beg));
200 const std::string &str,
201 const std::string &psep,
202 const std::string &vsep,
206 ParamVec::const_iterator pitr;
210 if( psep.empty() || vsep.empty())
213 _(
"Invalid parameter map split separator character")
217 split(pvec, str, psep);
219 for( pitr = pvec.begin(); pitr != pvec.end(); ++pitr)
221 pos = pitr->find(vsep);
222 if(pos != std::string::npos)
232 k = pitr->substr(0, pos);
233 v = pitr->substr(pos + 1);
255 const std::string &psep)
258 ParamVec::const_iterator i( pvec.begin());
263 while( ++i != pvec.end())
276 const std::string &psep,
277 const std::string &vsep,
278 const std::string &safe)
280 if( psep.empty() || vsep.empty())
283 _(
"Invalid parameter array join separator character")
287 std::string join_safe;
290 if( psep.find(safe[i]) == std::string::npos &&
291 vsep.find(safe[i]) == std::string::npos)
293 join_safe.append(1, safe[i]);
297 ParamMap::const_iterator i( pmap.begin());
301 str =
encode(i->first, join_safe);
302 if( !i->second.empty())
303 str += vsep +
encode(i->second, join_safe);
305 while( ++i != pmap.end())
307 str += psep +
encode(i->first, join_safe);
308 if( !i->second.empty())
309 str += vsep +
encode(i->second, join_safe);
std::vector< std::string > ParamVec
A parameter vector container.
std::map< std::string, std::string > ParamMap
A parameter map container.
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Thrown if the encoded string contains a NUL byte (%00).
Flag to request encoded string(s).
int decode_octet(const char *hex)
Decode one character.
std::string encode(const std::string &str, const std::string &safe, EEncoding eflag)
Encodes a string using URL percent encoding.
void split(ParamVec &pvec, const std::string &pstr, const std::string &psep)
Split into a parameter vector.
std::string join(const ParamVec &pvec, const std::string &psep)
Join parameter vector to a string.
#define _(MSG)
Return translated text.
std::string decode(const std::string &str, bool allowNUL)
Decodes a URL percent encoded string.
std::string encode_octet(const unsigned char c)
Encode one character.
Flag to request decoded string(s).