Go to the documentation of this file.
21 #include <sys/types.h>
22 #include <sys/socket.h>
23 #include <arpa/inet.h>
29 #define a_zA_Z "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
37 #define RX_VALID_SCHEME "^[" a_zA_Z "][" a_zA_Z "0-9\\.+-]*$"
39 #define RX_VALID_PORT "^[0-9]{1,5}$"
41 #define RX_VALID_HOSTNAME "^[[:alnum:]${_}]+([\\.-][[:alnum:]${_}]+)*$"
43 #define RX_VALID_HOSTIPV4 \
44 "^([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})$"
46 #define RX_VALID_HOSTIPV6 \
47 "^\\[[:a-fA-F0-9]+(:[0-9]{1,3}(\\.[0-9]{1,3}){3})?\\]$"
130 {
_assign( std::move(rhs) );
return *
this; }
133 operator const std::string &()
const
136 const std::string &
str()
const
153 static constexpr std::string_view tag {
"proxypass=" };
158 if ( val.substr( 0, tag.size() ) != tag ) {
159 if ( ! safe.empty() )
211 checkUrlData(
const std::string &data,
212 const std::string &name,
213 const std::string ®x,
216 if( regx.empty() || regx ==
"^$")
219 str::form(
_(
"Url scheme does not allow a %s"), name.c_str())
239 name.c_str(), data.c_str())
245 str::form(
_(
"Invalid %s component"), name.c_str())
280 const std::string &authority,
281 const std::string &pathdata,
282 const std::string &querystr,
283 const std::string &fragment)
287 init(scheme, authority, pathdata, querystr, fragment);
294 const std::string &authority,
295 const std::string &pathdata,
296 const std::string &querystr,
297 const std::string &fragment)
299 if ( scheme.empty() && *pathdata.c_str() ==
'/' )
315 config(
"sep_pathparams",
";");
316 config(
"psep_pathparam",
",");
317 config(
"vsep_pathparam",
"=");
319 config(
"psep_querystr",
"&");
320 config(
"vsep_querystr",
"=");
322 config(
"safe_username",
"~!$&'()*+=,;");
323 config(
"safe_password",
"~!$&'()*+=,:;");
324 config(
"safe_hostname",
"[:]${_}");
325 config(
"safe_pathname",
"~!$&'()*+=,:@/");
326 config(
"safe_pathparams",
"~!$&'()*+=,:;@/");
327 config(
"safe_querystr",
"~!$&'()*+=,:;@/?");
328 config(
"safe_fragment",
"~!$&'()*+=,:;@/?");
332 config(
"with_authority",
"y");
338 config(
"require_host",
"n");
339 config(
"require_pathname",
"n");
343 config(
"path_encode_slash2",
"n");
345 config(
"rx_username",
"^([" a_zA_Z "0-9!$&'\\(\\)*+=,;~\\._-]|%[a-fA-F0-9]{2})+$");
346 config(
"rx_password",
"^([" a_zA_Z "0-9!$&'\\(\\)*+=,:;~\\._-]|%[a-fA-F0-9]{2})+$");
348 config(
"rx_pathname",
"^([" a_zA_Z "0-9!$&'\\(\\){}*+=,:@/~\\._-]|%[a-fA-F0-9]{2})+$");
349 config(
"rx_pathparams",
"^([" a_zA_Z "0-9!$&'\\(\\){}*+=,:;@/~\\._-]|%[a-fA-F0-9]{2})+$");
351 config(
"rx_querystr",
"^([" a_zA_Z "0-9!$&'\\(\\){}*+=,:;@/?~\\._-]|%[a-fA-F0-9]{2})+$");
352 config(
"rx_fragment",
"^([" a_zA_Z "0-9!$&'\\(\\){}*+=,:;@/?~\\._-]|%[a-fA-F0-9]{2})+$");
372 return std::string();
426 UrlSchemes::const_iterator s;
428 for(s=schemes.begin(); s!=schemes.end(); ++s)
458 UrlSchemes::const_iterator s;
459 for(s=schemes.begin(); s!=schemes.end(); ++s)
483 if( host.empty() &&
config(
"require_host") !=
"n")
487 if( path.empty() &&
config(
"require_pathname") !=
"n")
494 if( !host.empty() && !path.empty() && path.at(0) !=
'/')
532 if( !tmp.
host.empty())
539 if( !tmp.
user.empty())
546 if( !tmp.
pass.empty())
560 if( !tmp.
port.empty())
583 if(
url.find(
"/") != std::string::npos)
609 &&
url.find(
"/") != std::string::npos)
622 if( !querystr.empty() )
624 url +=
"?" + querystr;
689 config(
"sep_pathparams") +
783 if(
config(
"psep_pathparam").empty())
803 if(
config(
"psep_pathparam").empty() ||
804 config(
"vsep_pathparam").empty())
807 "Path parameter parsing not supported for this URL"
827 zypp::url::ParamMap::const_iterator i( pmap.find(param));
829 return i != pmap.end() ? i->second : std::string();
838 if(
config(
"psep_querystr").empty())
858 if(
config(
"psep_querystr").empty() ||
859 config(
"vsep_querystr").empty())
862 _(
"Query string parsing not supported for this URL")
882 zypp::url::ParamMap::const_iterator i( pmap.find(param));
884 return i != pmap.end() ? i->second : std::string();
900 _(
"Url scheme is a required component")
906 str::form(
_(
"Invalid Url scheme '%s'"), scheme.c_str())
916 std::string s = authority;
919 std::string username, password, host, port;
921 if ((p=s.find(
'@')) != std::string::npos)
924 if (q != std::string::npos && q < p)
933 if ((p = s.rfind(
':')) != std::string::npos && ( (q = s.rfind(
']')) == std::string::npos || q < p) )
946 size_t pos = std::string::npos;
947 std::string sep(
config(
"sep_pathparams"));
950 pos = pathdata.find(sep);
952 if( pos != std::string::npos)
971 if( querystr.empty())
977 checkUrlData(querystr,
"query string",
config(
"rx_querystr"));
989 if( fragment.empty())
997 checkUrlData(fragment,
"fragment",
config(
"rx_fragment"));
1004 fragment,
config(
"safe_fragment")
1022 if(
config(
"with_authority") !=
"y")
1025 _(
"Url scheme does not allow a username")
1031 checkUrlData(user,
"username",
config(
"rx_username"));
1038 user,
config(
"safe_username")
1056 if(
config(
"with_authority") !=
"y")
1059 _(
"Url scheme does not allow a password")
1065 checkUrlData(pass,
"password",
config(
"rx_password"),
false);
1072 pass,
config(
"safe_password")
1085 if(
config(
"require_host") ==
"m")
1088 _(
"Url scheme requires a host component")
1095 if(
config(
"with_authority") !=
"y")
1098 _(
"Url scheme does not allow a host component")
1109 if( host.at(0) ==
'[')
1119 temp,
config(
"safe_hostname")
1125 str::form(
_(
"Invalid host component '%s'"), host.c_str())
1142 if(
config(
"with_authority") !=
"y" ||
1143 config(
"with_port") !=
"y")
1146 _(
"Url scheme does not allow a port")
1157 str::form(
_(
"Invalid port component '%s'"), port.c_str())
1171 if(
config(
"require_pathname") ==
"m")
1174 _(
"Url scheme requires path name")
1183 checkUrlData(path,
"path name",
config(
"rx_pathname"));
1191 if(!(path.at(0) ==
'/' || (path.size() >= 3 &&
1195 _(
"Relative path not allowed if authority exists")
1206 if(path.at(0) !=
'/')
1209 _(
"Relative path not allowed if authority exists")
1216 path,
config(
"safe_pathname")
1234 checkUrlData(params,
"path parameters",
config(
"rx_pathparams"));
1258 if(
config(
"psep_pathparam").empty() ||
1259 config(
"vsep_pathparam").empty())
1262 "Path Parameter parsing not supported for this URL"
1268 config(
"psep_pathparam"),
1269 config(
"vsep_pathparam"),
1270 config(
"safe_pathparams")
1281 pmap[param] = value;
1303 if(
config(
"psep_querystr").empty() ||
1304 config(
"vsep_querystr").empty())
1307 _(
"Query string parsing not supported for this URL")
1325 pmap[param] = value;
1351 std::string
copy( path);
1354 if(
copy.size() >= 3 &&
copy.at(0) !=
'/' &&
1357 copy.replace(0, 3,
"/");
1369 if(
config(
"path_encode_slash2") ==
"y")
1372 if(
copy.size() >= 2 &&
copy.at(0) ==
'/' &&
copy.at(1) ==
'/')
1374 copy.replace(1, 1,
"%2F");
1380 if(
copy.size() >= 4 &&
copy.at(0) ==
'/' &&
1383 copy.replace(1, 4,
"/");
1390 if(
copy.size() >= 2 &&
copy.at(0) ==
'/' &&
copy.at(1) ==
'/')
1392 copy.replace(1, 1,
"%2F");
1409 std::string temp( host.substr(1, host.size()-2));
1411 return inet_pton(AF_INET6, temp.c_str(), &ip) > 0;
1437 long pnum = str::strtonum<long>(port);
1438 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.
const std::string & str() const
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.
static const ViewOption hotfix1050625
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.
std::string _fullQuerytsr
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.
std::string asString1050625() const
#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.
std::optional< std::string > _safeQuerytsr
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.
unsigned split(std::string_view line_r, std::string_view sep_r, Trim trim_r, std::function< void(std::string_view)> fnc_r)
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.
SafeQuerystr & operator=(std::string rhs)
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.
const std::string & fullStr() const
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.
const std::string & str(const ViewOptions &viewopts_r) const
virtual std::string getUsername(EEncoding eflag) const
Returns the username from the URL authority.
const std::string & safeStr() const
std::ostream & copy(std::istream &from_r, std::ostream &to_r)
Copy istream to ostream.
SafeQuerystr(std::string rhs)
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)
c++17: std::string_view tools
void _assign(std::string &&rhs)
Hide passwords embedded in a querystr,.
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.