1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
13 #include <zypp/base/Gettext.h>
14 #include <zypp/base/String.h>
18 //////////////////////////////////////////////////////////////////////
20 { ////////////////////////////////////////////////////////////////////
23 using namespace zypp::url;
26 // -----------------------------------------------------------------
28 * url = [scheme:] [//authority] /path [?query] [#fragment]
30 #define RX_SPLIT_URL "^(([^:/?#]+):)?" \
37 ////////////////////////////////////////////////////////////////////
39 { //////////////////////////////////////////////////////////////////
42 // ---------------------------------------------------------------
43 class LDAPUrl: public UrlBase
51 LDAPUrl(const LDAPUrl &url): UrlBase(url)
57 return new LDAPUrl(*this);
61 getKnownSchemes() const
63 UrlSchemes schemes(2);
72 config("sep_pathparams", "");
74 config("psep_querystr", "?");
75 config("vsep_querystr", "");
77 // host is required (isValid=>false)
78 // but not mandatory (see RFC 2255),
79 // that is, accept empty host.
80 config("require_host", "y");
83 config("rx_username", "");
84 config("rx_password", "");
85 config("rx_fragment", "");
86 config("rx_pathparams", "");
89 virtual zypp::url::ParamMap
90 getQueryStringMap(zypp::url::EEncoding eflag) const
92 static const char * const keys[] = {
93 "attrs", "scope", "filter", "exts", NULL
95 zypp::url::ParamMap pmap;
96 zypp::url::ParamVec pvec( getQueryStringVec());
99 for(size_t i=0; i<pvec.size(); i++)
101 if(eflag == zypp::url::E_ENCODED)
102 pmap[keys[i]] = pvec[i];
104 pmap[keys[i]] = zypp::url::decode( pvec[i]);
109 ZYPP_THROW(url::UrlNotSupportedException(
110 _("Invalid LDAP URL query string")
117 setQueryStringMap(const zypp::url::ParamMap &pmap)
119 static const char * const keys[] = {
120 "attrs", "scope", "filter", "exts", NULL
123 // remove psep ("?") from safe chars
124 std::string join_safe;
125 std::string safe(config("safe_querystr"));
126 std::string psep(config("psep_querystr"));
127 for(std::string::size_type i=0; i<safe.size(); i++)
129 if( psep.find(safe[i]) == std::string::npos)
130 join_safe.append(1, safe[i]);
133 zypp::url::ParamVec pvec(4);
134 zypp::url::ParamMap::const_iterator p;
135 for(p=pmap.begin(); p!=pmap.end(); ++p)
138 for(size_t i=0; i<4; i++)
140 if(p->first == keys[i])
143 pvec[i] = zypp::url::encode(p->second, join_safe);
148 ZYPP_THROW(url::UrlNotSupportedException(
149 str::form(_("Invalid LDAP URL query parameter '%s'"),
154 setQueryStringVec(pvec);
159 // ---------------------------------------------------------------
164 typedef std::map<std::string,UrlRef> UrlBySchemeMap;
165 UrlBySchemeMap urlByScheme;
172 // =====================================
173 ref.reset( new LDAPUrl());
174 addUrlByScheme("ldap", ref);
175 addUrlByScheme("ldaps", ref);
178 // =====================================
179 ref.reset( new UrlBase());
180 ref->config("with_authority", "n"); // disallow host,...
181 ref->config("require_pathname", "m"); // path is mandatory
182 addUrlByScheme("hd", ref);
183 addUrlByScheme("cd", ref);
184 addUrlByScheme("dvd", ref);
185 addUrlByScheme("dir", ref);
186 addUrlByScheme("iso", ref);
188 // don't show empty authority
189 ref->setViewOptions( zypp::url::ViewOption::DEFAULTS -
190 zypp::url::ViewOption::EMPTY_AUTHORITY);
191 addUrlByScheme("mailto", ref);
192 addUrlByScheme("urn", ref);
194 // RFC1738, 3.10: may contain a host
195 ref->config("with_authority", "y"); // allow host,
196 ref->config("with_port", "n"); // but no port,
197 ref->config("rx_username", ""); // username or
198 ref->config("rx_password", ""); // password ...
199 addUrlByScheme("file", ref);
201 // =====================================
202 ref.reset( new UrlBase());
203 ref->config("require_host", "m"); // host is mandatory
204 addUrlByScheme("nfs", ref);
205 addUrlByScheme("smb", ref);
206 addUrlByScheme("cifs", ref);
207 addUrlByScheme("http", ref);
208 addUrlByScheme("https", ref);
209 ref->config("path_encode_slash2", "y"); // always encode 2. slash
210 addUrlByScheme("ftp", ref);
211 addUrlByScheme("sftp", ref);
215 addUrlByScheme(const std::string &scheme,
218 if( urlImpl && urlImpl->isValidScheme(scheme))
222 urlByScheme[str::toLower(scheme)] = ref;
229 getUrlByScheme(const std::string &scheme) const
231 UrlBySchemeMap::const_iterator i(urlByScheme.find(str::toLower(scheme)));
232 if( i != urlByScheme.end())
240 isRegisteredScheme(const std::string &scheme) const
242 return urlByScheme.find(str::toLower(scheme)) != urlByScheme.end();
246 getRegisteredSchemes() const
248 UrlBySchemeMap::const_iterator i(urlByScheme.begin());
251 schemes.reserve(urlByScheme.size());
252 for( ; i != urlByScheme.end(); ++i)
254 schemes.push_back(i->first);
261 // ---------------------------------------------------------------
262 UrlByScheme & g_urlSchemeRepository()
264 static UrlByScheme _v;
268 //////////////////////////////////////////////////////////////////
269 } // anonymous namespace
270 ////////////////////////////////////////////////////////////////////
273 // -----------------------------------------------------------------
279 // -----------------------------------------------------------------
281 : m_impl( new UrlBase())
286 // -----------------------------------------------------------------
287 Url::Url(const Url &url)
288 : m_impl( url.m_impl)
292 ZYPP_THROW(url::UrlException(
293 _("Unable to clone Url object")
299 // -----------------------------------------------------------------
300 Url::Url(const zypp::url::UrlRef &url)
305 ZYPP_THROW(url::UrlException(
306 _("Invalid empty Url object reference")
312 // -----------------------------------------------------------------
313 Url::Url(const std::string &encodedUrl)
314 : m_impl( parseUrl(encodedUrl))
318 ZYPP_THROW(url::UrlParsingException(
319 _("Unable to parse Url components")
325 // -----------------------------------------------------------------
327 Url::operator = (const std::string &encodedUrl)
329 UrlRef url( parseUrl(encodedUrl));
332 ZYPP_THROW(url::UrlParsingException(
333 _("Unable to parse Url components")
341 // -----------------------------------------------------------------
343 Url::operator = (const Url &url)
350 // -----------------------------------------------------------------
353 Url::registerScheme(const std::string &scheme,
356 return g_urlSchemeRepository().addUrlByScheme(scheme, urlImpl);
360 // -----------------------------------------------------------------
363 Url::parseUrl(const std::string &encodedUrl)
371 str::regex rex(RX_SPLIT_URL);
372 ret = str::regex_match(encodedUrl, out, rex);
377 if(ret && out.size() == 10)
379 url = g_urlSchemeRepository().getUrlByScheme(out[2].str());
382 url.reset( new UrlBase());
384 url->init(out[2].str(),
394 // -----------------------------------------------------------------
396 zypp::url::UrlSchemes
397 Url::getRegisteredSchemes()
399 return g_urlSchemeRepository().getRegisteredSchemes();
403 // -----------------------------------------------------------------
406 Url::isRegisteredScheme(const std::string &scheme)
408 return g_urlSchemeRepository().isRegisteredScheme(scheme);
412 // -----------------------------------------------------------------
413 zypp::url::UrlSchemes
414 Url::getKnownSchemes() const
416 return m_impl->getKnownSchemes();
420 // -----------------------------------------------------------------
422 Url::isValidScheme(const std::string &scheme) const
424 return m_impl->isValidScheme(scheme);
428 // -----------------------------------------------------------------
432 return m_impl->isValid();
436 // -----------------------------------------------------------------
438 Url::asString() const
440 return m_impl->asString();
444 // -----------------------------------------------------------------
446 Url::asCompleteString() const
448 // make sure, all url components are included;
449 // regardless of the current configuration...
450 ViewOptions opts(getViewOptions() +
451 ViewOption::WITH_SCHEME +
452 ViewOption::WITH_USERNAME +
453 ViewOption::WITH_PASSWORD +
454 ViewOption::WITH_HOST +
455 ViewOption::WITH_PORT +
456 ViewOption::WITH_PATH_NAME +
457 ViewOption::WITH_PATH_PARAMS +
458 ViewOption::WITH_QUERY_STR +
459 ViewOption::WITH_FRAGMENT);
460 return m_impl->asString(opts);
464 // -----------------------------------------------------------------
466 Url::asString(const ViewOptions &opts) const
468 return m_impl->asString(opts);
472 // -----------------------------------------------------------------
474 Url::getScheme() const
476 return m_impl->getScheme();
480 // -----------------------------------------------------------------
482 Url::getAuthority() const
484 return m_impl->getAuthority();
487 // -----------------------------------------------------------------
489 Url::getPathData() const
491 return m_impl->getPathData();
495 // -----------------------------------------------------------------
497 Url::getQueryString() const
499 return m_impl->getQueryString();
503 // -----------------------------------------------------------------
505 Url::getFragment(zypp::url::EEncoding eflag) const
507 return m_impl->getFragment(eflag);
511 // -----------------------------------------------------------------
513 Url::getUsername(EEncoding eflag) const
515 return m_impl->getUsername(eflag);
519 // -----------------------------------------------------------------
521 Url::getPassword(EEncoding eflag) const
523 return m_impl->getPassword(eflag);
527 // -----------------------------------------------------------------
529 Url::getHost(EEncoding eflag) const
531 return m_impl->getHost(eflag);
535 // -----------------------------------------------------------------
539 return m_impl->getPort();
543 // -----------------------------------------------------------------
545 Url::getPathName(EEncoding eflag) const
547 return m_impl->getPathName(eflag);
551 // -----------------------------------------------------------------
553 Url::getPathParams() const
555 return m_impl->getPathParams();
559 // -----------------------------------------------------------------
561 Url::getPathParamsVec() const
563 return m_impl->getPathParamsVec();
567 // -----------------------------------------------------------------
569 Url::getPathParamsMap(EEncoding eflag) const
571 return m_impl->getPathParamsMap(eflag);
575 // -----------------------------------------------------------------
577 Url::getPathParam(const std::string ¶m, EEncoding eflag) const
579 return m_impl->getPathParam(param, eflag);
583 // -----------------------------------------------------------------
585 Url::getQueryStringVec() const
587 return m_impl->getQueryStringVec();
591 // -----------------------------------------------------------------
593 Url::getQueryStringMap(EEncoding eflag) const
595 return m_impl->getQueryStringMap(eflag);
599 // -----------------------------------------------------------------
601 Url::getQueryParam(const std::string ¶m, EEncoding eflag) const
603 return m_impl->getQueryParam(param, eflag);
607 // -----------------------------------------------------------------
609 Url::setScheme(const std::string &scheme)
611 if(scheme == m_impl->getScheme())
615 if( m_impl->isKnownScheme(scheme))
617 m_impl->setScheme(scheme);
621 UrlRef url = g_urlSchemeRepository().getUrlByScheme(scheme);
624 url.reset( new UrlBase());
628 m_impl->getAuthority(),
629 m_impl->getPathData(),
630 m_impl->getQueryString(),
631 m_impl->getFragment(zypp::url::E_ENCODED)
637 // -----------------------------------------------------------------
639 Url::setAuthority(const std::string &authority)
641 m_impl->setAuthority(authority);
645 // -----------------------------------------------------------------
647 Url::setPathData(const std::string &pathdata)
649 m_impl->setPathData(pathdata);
653 // -----------------------------------------------------------------
655 Url::setQueryString(const std::string &querystr)
657 m_impl->setQueryString(querystr);
661 // -----------------------------------------------------------------
663 Url::setFragment(const std::string &fragment, EEncoding eflag)
665 m_impl->setFragment(fragment, eflag);
669 // -----------------------------------------------------------------
671 Url::setUsername(const std::string &user,
674 m_impl->setUsername(user, eflag);
678 // -----------------------------------------------------------------
680 Url::setPassword(const std::string &pass,
683 m_impl->setPassword(pass, eflag);
687 // -----------------------------------------------------------------
689 Url::setHost(const std::string &host)
691 m_impl->setHost(host);
695 // -----------------------------------------------------------------
697 Url::setPort(const std::string &port)
699 m_impl->setPort(port);
703 // -----------------------------------------------------------------
705 Url::setPathName(const std::string &path,
708 m_impl->setPathName(path, eflag);
712 // -----------------------------------------------------------------
714 Url::setPathParams(const std::string ¶ms)
716 m_impl->setPathParams(params);
720 // -----------------------------------------------------------------
722 Url::setPathParamsVec(const zypp::url::ParamVec &pvec)
724 m_impl->setPathParamsVec(pvec);
728 // -----------------------------------------------------------------
730 Url::setPathParamsMap(const zypp::url::ParamMap &pmap)
732 m_impl->setPathParamsMap(pmap);
736 // -----------------------------------------------------------------
738 Url::setPathParam(const std::string ¶m, const std::string &value)
740 m_impl->setPathParam(param, value);
744 // -----------------------------------------------------------------
746 Url::setQueryStringVec(const zypp::url::ParamVec &pvec)
748 m_impl->setQueryStringVec(pvec);
752 // -----------------------------------------------------------------
754 Url::setQueryStringMap(const zypp::url::ParamMap &pmap)
756 m_impl->setQueryStringMap(pmap);
759 // -----------------------------------------------------------------
761 Url::setQueryParam(const std::string ¶m, const std::string &value)
763 m_impl->setQueryParam(param, value);
766 // -----------------------------------------------------------------
768 Url::getViewOptions() const
770 return m_impl->getViewOptions();
773 // -----------------------------------------------------------------
775 Url::setViewOptions(const ViewOptions &vopts)
777 m_impl->setViewOptions(vopts);
780 // -----------------------------------------------------------------
781 std::ostream & operator<<( std::ostream & str, const Url & url )
783 return str << url.asString();
786 bool operator<( const Url &lhs, const Url &rhs )
788 return (lhs.asCompleteString() < rhs.asCompleteString());
791 bool operator==( const Url &lhs, const Url &rhs )
793 return (lhs.asCompleteString() == rhs.asCompleteString());
796 bool operator!=( const Url &lhs, const Url &rhs )
798 return (lhs.asCompleteString() != rhs.asCompleteString());
801 ////////////////////////////////////////////////////////////////////
803 //////////////////////////////////////////////////////////////////////
805 ** vim: set ts=2 sts=2 sw=2 ai et: