Go to the documentation of this file.
20 #include <sys/types.h>
21 #include <sys/socket.h>
22 #include <arpa/inet.h>
28 #define a_zA_Z "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
36 #define RX_VALID_SCHEME "^[" a_zA_Z "][" a_zA_Z "0-9\\.+-]*$"
38 #define RX_VALID_PORT "^[0-9]{1,5}$"
40 #define RX_VALID_HOSTNAME "^[[:alnum:]${_}]+([\\.-][[:alnum:]${_}]+)*$"
42 #define RX_VALID_HOSTIPV4 \
43 "^([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})$"
45 #define RX_VALID_HOSTIPV6 \
46 "^\\[[:a-fA-F0-9]+(:[0-9]{1,3}(\\.[0-9]{1,3}){3})?\\]$"
146 checkUrlData(
const std::string &data,
147 const std::string &name,
148 const std::string ®x,
151 if( regx.empty() || regx ==
"^$")
154 str::form(
_(
"Url scheme does not allow a %s"), name.c_str())
174 name.c_str(), data.c_str())
180 str::form(
_(
"Invalid %s component"), name.c_str())
215 const std::string &authority,
216 const std::string &pathdata,
217 const std::string &querystr,
218 const std::string &fragment)
222 init(scheme, authority, pathdata, querystr, fragment);
229 const std::string &authority,
230 const std::string &pathdata,
231 const std::string &querystr,
232 const std::string &fragment)
234 if ( scheme.empty() && *pathdata.c_str() ==
'/' )
250 config(
"sep_pathparams",
";");
251 config(
"psep_pathparam",
",");
252 config(
"vsep_pathparam",
"=");
254 config(
"psep_querystr",
"&");
255 config(
"vsep_querystr",
"=");
257 config(
"safe_username",
"~!$&'()*+=,;");
258 config(
"safe_password",
"~!$&'()*+=,:;");
259 config(
"safe_hostname",
"[:]${_}");
260 config(
"safe_pathname",
"~!$&'()*+=,:@/");
261 config(
"safe_pathparams",
"~!$&'()*+=,:;@/");
262 config(
"safe_querystr",
"~!$&'()*+=,:;@/?");
263 config(
"safe_fragment",
"~!$&'()*+=,:;@/?");
267 config(
"with_authority",
"y");
273 config(
"require_host",
"n");
274 config(
"require_pathname",
"n");
278 config(
"path_encode_slash2",
"n");
280 config(
"rx_username",
"^([" a_zA_Z "0-9!$&'\\(\\)*+=,;~\\._-]|%[a-fA-F0-9]{2})+$");
281 config(
"rx_password",
"^([" a_zA_Z "0-9!$&'\\(\\)*+=,:;~\\._-]|%[a-fA-F0-9]{2})+$");
283 config(
"rx_pathname",
"^([" a_zA_Z "0-9!$&'\\(\\){}*+=,:@/~\\._-]|%[a-fA-F0-9]{2})+$");
284 config(
"rx_pathparams",
"^([" a_zA_Z "0-9!$&'\\(\\){}*+=,:;@/~\\._-]|%[a-fA-F0-9]{2})+$");
286 config(
"rx_querystr",
"^([" a_zA_Z "0-9!$&'\\(\\){}*+=,:;@/?~\\._-]|%[a-fA-F0-9]{2})+$");
287 config(
"rx_fragment",
"^([" a_zA_Z "0-9!$&'\\(\\){}*+=,:;@/?~\\._-]|%[a-fA-F0-9]{2})+$");
307 return std::string();
361 UrlSchemes::const_iterator s;
363 for(s=schemes.begin(); s!=schemes.end(); ++s)
393 UrlSchemes::const_iterator s;
394 for(s=schemes.begin(); s!=schemes.end(); ++s)
418 if( host.empty() &&
config(
"require_host") !=
"n")
422 if( path.empty() &&
config(
"require_pathname") !=
"n")
429 if( !host.empty() && !path.empty() && path.at(0) !=
'/')
461 if( !tmp.
host.empty())
468 if( !tmp.
user.empty())
475 if( !tmp.
pass.empty())
489 if( !tmp.
port.empty())
512 if(
url.find(
"/") != std::string::npos)
538 &&
url.find(
"/") != std::string::npos)
618 config(
"sep_pathparams") +
707 if(
config(
"psep_pathparam").empty())
727 if(
config(
"psep_pathparam").empty() ||
728 config(
"vsep_pathparam").empty())
731 "Path parameter parsing not supported for this URL"
751 zypp::url::ParamMap::const_iterator i( pmap.find(param));
753 return i != pmap.end() ? i->second : std::string();
762 if(
config(
"psep_querystr").empty())
782 if(
config(
"psep_querystr").empty() ||
783 config(
"vsep_querystr").empty())
786 _(
"Query string parsing not supported for this URL")
806 zypp::url::ParamMap::const_iterator i( pmap.find(param));
808 return i != pmap.end() ? i->second : std::string();
824 _(
"Url scheme is a required component")
830 str::form(
_(
"Invalid Url scheme '%s'"), scheme.c_str())
840 std::string s = authority;
843 std::string username, password, host, port;
845 if ((p=s.find(
'@')) != std::string::npos)
848 if (q != std::string::npos && q < p)
857 if ((p = s.rfind(
':')) != std::string::npos && ( (q = s.rfind(
']')) == std::string::npos || q < p) )
870 size_t pos = std::string::npos;
871 std::string sep(
config(
"sep_pathparams"));
874 pos = pathdata.find(sep);
876 if( pos != std::string::npos)
895 if( querystr.empty())
901 checkUrlData(querystr,
"query string",
config(
"rx_querystr"));
913 if( fragment.empty())
921 checkUrlData(fragment,
"fragment",
config(
"rx_fragment"));
928 fragment,
config(
"safe_fragment")
946 if(
config(
"with_authority") !=
"y")
949 _(
"Url scheme does not allow a username")
955 checkUrlData(user,
"username",
config(
"rx_username"));
962 user,
config(
"safe_username")
980 if(
config(
"with_authority") !=
"y")
983 _(
"Url scheme does not allow a password")
989 checkUrlData(pass,
"password",
config(
"rx_password"),
false);
996 pass,
config(
"safe_password")
1009 if(
config(
"require_host") ==
"m")
1012 _(
"Url scheme requires a host component")
1019 if(
config(
"with_authority") !=
"y")
1022 _(
"Url scheme does not allow a host component")
1033 if( host.at(0) ==
'[')
1043 temp,
config(
"safe_hostname")
1049 str::form(
_(
"Invalid host component '%s'"), host.c_str())
1066 if(
config(
"with_authority") !=
"y" ||
1067 config(
"with_port") !=
"y")
1070 _(
"Url scheme does not allow a port")
1081 str::form(
_(
"Invalid port component '%s'"), port.c_str())
1095 if(
config(
"require_pathname") ==
"m")
1098 _(
"Url scheme requires path name")
1107 checkUrlData(path,
"path name",
config(
"rx_pathname"));
1115 if(!(path.at(0) ==
'/' || (path.size() >= 3 &&
1119 _(
"Relative path not allowed if authority exists")
1130 if(path.at(0) !=
'/')
1133 _(
"Relative path not allowed if authority exists")
1140 path,
config(
"safe_pathname")
1158 checkUrlData(params,
"path parameters",
config(
"rx_pathparams"));
1182 if(
config(
"psep_pathparam").empty() ||
1183 config(
"vsep_pathparam").empty())
1186 "Path Parameter parsing not supported for this URL"
1192 config(
"psep_pathparam"),
1193 config(
"vsep_pathparam"),
1194 config(
"safe_pathparams")
1205 pmap[param] = value;
1227 if(
config(
"psep_querystr").empty() ||
1228 config(
"vsep_querystr").empty())
1231 _(
"Query string parsing not supported for this URL")
1249 pmap[param] = value;
1275 std::string
copy( path);
1278 if(
copy.size() >= 3 &&
copy.at(0) !=
'/' &&
1281 copy.replace(0, 3,
"/");
1293 if(
config(
"path_encode_slash2") ==
"y")
1296 if(
copy.size() >= 2 &&
copy.at(0) ==
'/' &&
copy.at(1) ==
'/')
1298 copy.replace(1, 1,
"%2F");
1304 if(
copy.size() >= 4 &&
copy.at(0) ==
'/' &&
1307 copy.replace(1, 4,
"/");
1314 if(
copy.size() >= 2 &&
copy.at(0) ==
'/' &&
copy.at(1) ==
'/')
1316 copy.replace(1, 1,
"%2F");
1333 std::string temp( host.substr(1, host.size()-2));
1335 return inet_pton(AF_INET6, temp.c_str(), &ip) > 0;
1361 long pnum = str::strtonum<long>(port);
1362 return ( pnum >= 1 && pnum <= USHRT_MAX);
virtual std::string getPassword(EEncoding eflag) const
Returns the password from the URL authority.
std::string config(const std::string &opt) const
Get the value of a UrlBase configuration variable.
virtual void setQueryString(const std::string &querystr)
Set the query string in the URL.
virtual void setPathName(const std::string &path, EEncoding eflag)
Set the path name.
virtual void setPathParam(const std::string ¶m, const std::string &value)
Set or add value for the specified path parameter.
virtual UrlBase * clone() const
Returns pointer to a copy of the current object.
std::map< std::string, std::string > UrlConfig
virtual bool isValid() const
Verifies the Url.
virtual std::string getPathParam(const std::string ¶m, EEncoding eflag) const
Return the value for the specified path parameter.
virtual std::string getQueryParam(const std::string ¶m, EEncoding eflag) const
Return the value for the specified query parameter.
virtual void setPathParamsVec(const zypp::url::ParamVec &pvec)
Set the path parameters.
virtual std::string getPathParams() const
Returns the encoded path parameters from the URL.
virtual void setQueryStringMap(const zypp::url::ParamMap &qmap)
Set the query parameters.
Internal data used by UrlBase.
@ E_DECODED
Flag to request decoded string(s).
std::vector< std::string > UrlSchemes
Vector of URL scheme names.
Thrown if scheme does not allow a component.
std::string decode(const std::string &str, bool allowNUL)
Decodes a URL percent encoded string.
virtual void setAuthority(const std::string &authority)
Set the authority component in the URL.
static const ViewOption EMPTY_PATH_NAME
Explicitely include the "/" path character.
virtual std::string getPort() const
Returns the port number from the URL authority.
virtual void clear()
Clears all data in the object.
static const ViewOption WITH_USERNAME
Option to include username in the URL string.
virtual UrlSchemes getKnownSchemes() const
Returns scheme names known by this object.
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
static const ViewOption WITH_FRAGMENT
Option to include fragment string in the URL string.
virtual std::string getPathData() const
Returns the encoded path component of the URL.
static const ViewOption WITH_PATH_NAME
Option to include path name in the URL string.
virtual bool isKnownScheme(const std::string &scheme) const
Returns if scheme name is known to this object.
static const ViewOption EMPTY_PATH_PARAMS
Explicitely include the path parameters separator ";".
ViewOption()
Create instance with default combination of view options.
#define RX_VALID_HOSTIPV6
virtual std::string asString() const
Returns a default string representation of the Url object.
static const ViewOption EMPTY_QUERY_STR
Explicitely include the query string separator "?".
static const ViewOption EMPTY_FRAGMENT
Explicitely include the fragment string separator "#".
static const ViewOption WITH_PASSWORD
Option to include password in the URL string.
virtual zypp::url::ParamMap getQueryStringMap(EEncoding eflag) const
Returns a string map with query parameter and their values.
virtual std::string getPathName(EEncoding eflag) const
Returns the path name from the URL.
virtual void configure()
Configures behaviour of the instance.
static const ViewOption DEFAULTS
Default combination of view options.
bool has(const ViewOption &o) const
Check if specified option o is set in the current object.
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
static const ViewOption EMPTY_AUTHORITY
Explicitely include the URL authority separator "//".
virtual void setUsername(const std::string &user, EEncoding eflag)
Set the username in the URL authority.
virtual void setPathParamsMap(const zypp::url::ParamMap &pmap)
Set the path parameters.
Easy-to use interface to the ZYPP dependency resolver.
virtual std::string getAuthority() const
Returns the encoded authority component of the URL.
virtual void setPathData(const std::string &pathdata)
Set the path data component in the URL.
std::string toLower(const std::string &s)
Return lowercase version of s.
virtual bool isValidHost(const std::string &host) const
Verifies specified host or IP.
std::map< std::string, std::string > ParamMap
A parameter map container.
virtual std::string getHost(EEncoding eflag) const
Returns the hostname or IP from the URL authority.
virtual zypp::url::ParamVec getQueryStringVec() const
Returns a vector with query string parameter substrings.
void split(ParamVec &pvec, const std::string &pstr, const std::string &psep)
Split into a parameter vector.
static const ViewOption WITH_QUERY_STR
Option to include query string in the URL string.
#define RX_VALID_HOSTNAME
virtual void init(const std::string &scheme, const std::string &authority, const std::string &pathdata, const std::string &querystr, const std::string &fragment)
Initializes current object with new URL components.
virtual void setQueryStringVec(const zypp::url::ParamVec &qvec)
Set the query parameters.
virtual bool isValidScheme(const std::string &scheme) const
Verifies specified scheme name.
std::string join(const ParamVec &pvec, const std::string &psep)
Join parameter vector to a string.
virtual zypp::url::ParamMap getPathParamsMap(EEncoding eflag) const
Returns a string map with path parameter keys and values.
virtual std::string getScheme() const
Returns the scheme name of the URL.
@ E_ENCODED
Flag to request encoded string(s).
std::vector< std::string > ParamVec
A parameter vector container.
virtual void setHost(const std::string &host)
Set the hostname or IP in the URL authority.
virtual void setFragment(const std::string &fragment, EEncoding eflag)
Set the fragment string in the URL.
virtual void delQueryParam(const std::string ¶m)
remove the specified query parameter.
virtual zypp::url::ParamVec getPathParamsVec() const
Returns a vector with encoded path parameter substrings.
virtual void setScheme(const std::string &scheme)
Set the scheme name in the URL.
virtual std::string getUsername(EEncoding eflag) const
Returns the username from the URL authority.
std::ostream & copy(std::istream &from_r, std::ostream &to_r)
Copy istream to ostream.
virtual void setPathParams(const std::string ¶ms)
Set the path parameters.
virtual void setQueryParam(const std::string ¶m, const std::string &value)
Set or add value for the specified query parameter.
virtual void setPort(const std::string &port)
Set the port number in the URL authority.
bool regex_match(const std::string &s, smatch &matches, const regex ®ex)
\relates regex \ingroup ZYPP_STR_REGEX \relates regex \ingroup ZYPP_STR_REGEX
String related utilities and Regular expression matching.
virtual std::string cleanupPathName(const std::string &path, bool authority) const
Utility method to cleanup an encoded path name.
std::string toUpper(const std::string &s)
Return uppercase version of s.
std::string encode(const std::string &str, const std::string &safe, EEncoding eflag)
Encodes a string using URL percent encoding.
virtual bool isValidPort(const std::string &port) const
Verifies specified port number.
virtual std::string getQueryString() const
Returns the encoded query string component of the URL.
Url::asString() view options.
virtual std::string getFragment(EEncoding eflag) const
Returns the encoded fragment component of the URL.
static const ViewOption WITH_SCHEME
Option to include scheme name in the URL string.
static const ViewOption WITH_HOST
Option to include hostname in the URL string.
UrlBaseData(const UrlConfig &conf)
Thrown if a url component is invalid.
void setViewOptions(const ViewOptions &vopts)
Change the view options of the current object.
ViewOptions getViewOptions() const
Return the view options of the current object.
virtual void setPassword(const std::string &pass, EEncoding eflag)
Set the password in the URL authority.
static const ViewOption WITH_PORT
Option to include port number in the URL string.
static const ViewOption WITH_PATH_PARAMS
Option to include path parameters in the URL string.