1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
14 #include <zypp/base/Gettext.h>
15 #include <zypp/base/String.h>
16 #include <zypp/base/Regex.h>
21 //////////////////////////////////////////////////////////////////////
23 { ////////////////////////////////////////////////////////////////////
26 using namespace zypp::url;
29 // -----------------------------------------------------------------
31 * url = [scheme:] [//authority] /path [?query] [#fragment]
33 #define RX_SPLIT_URL "^([^:/?#]+:|)" \
40 ////////////////////////////////////////////////////////////////////
42 { //////////////////////////////////////////////////////////////////
45 // ---------------------------------------------------------------
46 class LDAPUrl: public UrlBase
54 LDAPUrl(const LDAPUrl &url): UrlBase(url)
60 return new LDAPUrl(*this);
64 getKnownSchemes() const
66 UrlSchemes schemes(2);
75 config("sep_pathparams", "");
77 config("psep_querystr", "?");
78 config("vsep_querystr", "");
80 // host is required (isValid=>false)
81 // but not mandatory (see RFC 2255),
82 // that is, accept empty host.
83 config("require_host", "y");
86 config("rx_username", "");
87 config("rx_password", "");
88 config("rx_fragment", "");
89 config("rx_pathparams", "");
92 virtual zypp::url::ParamMap
93 getQueryStringMap(zypp::url::EEncoding eflag) const
95 static const char * const keys[] = {
96 "attrs", "scope", "filter", "exts", NULL
98 zypp::url::ParamMap pmap;
99 zypp::url::ParamVec pvec( getQueryStringVec());
100 if( pvec.size() <= 4)
102 for(size_t i=0; i<pvec.size(); i++)
104 if(eflag == zypp::url::E_ENCODED)
105 pmap[keys[i]] = pvec[i];
107 pmap[keys[i]] = zypp::url::decode( pvec[i]);
112 ZYPP_THROW(url::UrlNotSupportedException(
113 _("Invalid LDAP URL query string")
120 setQueryStringMap(const zypp::url::ParamMap &pmap)
122 static const char * const keys[] = {
123 "attrs", "scope", "filter", "exts", NULL
126 // remove psep ("?") from safe chars
127 std::string join_safe;
128 std::string safe(config("safe_querystr"));
129 std::string psep(config("psep_querystr"));
130 for(std::string::size_type i=0; i<safe.size(); i++)
132 if( psep.find(safe[i]) == std::string::npos)
133 join_safe.append(1, safe[i]);
136 zypp::url::ParamVec pvec(4);
137 zypp::url::ParamMap::const_iterator p;
138 for(p=pmap.begin(); p!=pmap.end(); ++p)
141 for(size_t i=0; i<4; i++)
143 if(p->first == keys[i])
146 pvec[i] = zypp::url::encode(p->second, join_safe);
151 ZYPP_THROW(url::UrlNotSupportedException(
152 str::form(_("Invalid LDAP URL query parameter '%s'"),
157 setQueryStringVec(pvec);
162 // ---------------------------------------------------------------
167 typedef std::map<std::string,UrlRef> UrlBySchemeMap;
168 UrlBySchemeMap urlByScheme;
175 // =====================================
176 ref.reset( new LDAPUrl());
177 addUrlByScheme("ldap", ref);
178 addUrlByScheme("ldaps", ref);
181 // =====================================
182 ref.reset( new UrlBase());
183 ref->config("with_authority", "n"); // disallow host,...
184 ref->config("require_pathname", "m"); // path is mandatory
185 addUrlByScheme("hd", ref);
186 addUrlByScheme("cd", ref);
187 addUrlByScheme("dvd", ref);
188 addUrlByScheme("dir", ref);
189 addUrlByScheme("iso", ref);
191 // don't show empty authority
192 ref->setViewOptions( zypp::url::ViewOption::DEFAULTS -
193 zypp::url::ViewOption::EMPTY_AUTHORITY);
194 addUrlByScheme("mailto", ref);
195 addUrlByScheme("urn", ref);
197 // RFC1738, 3.10: may contain a host
198 ref->config("with_authority", "y"); // allow host,
199 ref->config("with_port", "n"); // but no port,
200 ref->config("rx_username", ""); // username or
201 ref->config("rx_password", ""); // password ...
202 addUrlByScheme("file", ref);
204 // =====================================
205 ref.reset( new UrlBase());
206 ref->config("require_host", "m"); // host is mandatory
207 addUrlByScheme("nfs", ref);
208 addUrlByScheme("smb", ref);
209 addUrlByScheme("cifs", ref);
210 addUrlByScheme("http", ref);
211 addUrlByScheme("https", ref);
212 ref->config("path_encode_slash2", "y"); // always encode 2. slash
213 addUrlByScheme("ftp", ref);
214 addUrlByScheme("sftp", ref);
218 addUrlByScheme(const std::string &scheme,
221 if( urlImpl && urlImpl->isValidScheme(scheme))
225 urlByScheme[str::toLower(scheme)] = ref;
232 getUrlByScheme(const std::string &scheme) const
234 UrlBySchemeMap::const_iterator i(urlByScheme.find(str::toLower(scheme)));
235 if( i != urlByScheme.end())
243 isRegisteredScheme(const std::string &scheme) const
245 return urlByScheme.find(str::toLower(scheme)) != urlByScheme.end();
249 getRegisteredSchemes() const
251 UrlBySchemeMap::const_iterator i(urlByScheme.begin());
254 schemes.reserve(urlByScheme.size());
255 for( ; i != urlByScheme.end(); ++i)
257 schemes.push_back(i->first);
264 // ---------------------------------------------------------------
265 UrlByScheme & g_urlSchemeRepository()
267 static UrlByScheme _v;
271 //////////////////////////////////////////////////////////////////
272 } // anonymous namespace
273 ////////////////////////////////////////////////////////////////////
276 // -----------------------------------------------------------------
282 // -----------------------------------------------------------------
284 : m_impl( new UrlBase())
289 // -----------------------------------------------------------------
290 Url::Url(const Url &url)
291 : m_impl( url.m_impl)
295 ZYPP_THROW(url::UrlException(
296 _("Unable to clone Url object")
302 // -----------------------------------------------------------------
303 Url::Url(const zypp::url::UrlRef &url)
308 ZYPP_THROW(url::UrlException(
309 _("Invalid empty Url object reference")
315 // -----------------------------------------------------------------
316 Url::Url(const std::string &encodedUrl)
317 : m_impl( parseUrl(encodedUrl))
321 ZYPP_THROW(url::UrlParsingException(
322 _("Unable to parse Url components")
328 // -----------------------------------------------------------------
330 Url::operator = (const std::string &encodedUrl)
332 UrlRef url( parseUrl(encodedUrl));
335 ZYPP_THROW(url::UrlParsingException(
336 _("Unable to parse Url components")
344 // -----------------------------------------------------------------
346 Url::operator = (const Url &url)
353 // -----------------------------------------------------------------
356 Url::registerScheme(const std::string &scheme,
359 return g_urlSchemeRepository().addUrlByScheme(scheme, urlImpl);
363 // -----------------------------------------------------------------
366 Url::parseUrl(const std::string &encodedUrl)
374 str::regex rex(RX_SPLIT_URL);
375 ret = str::regex_match(encodedUrl, out, rex);
380 if(ret && out.size() == 5)
382 std::string scheme = out[1];
383 if (scheme.size() > 1)
384 scheme = scheme.substr(0, scheme.size()-1);
385 std::string authority = out[2];
386 if (authority.size() >= 2)
387 authority = authority.substr(2);
388 std::string query = out[4];
389 if (query.size() > 1)
390 query = query.substr(1);
391 std::string fragment = out[5];
392 if (fragment.size() > 1)
393 fragment = fragment.substr(1);
395 url = g_urlSchemeRepository().getUrlByScheme(scheme);
398 url.reset( new UrlBase());
400 url->init(scheme, authority, out[3],
407 // -----------------------------------------------------------------
409 zypp::url::UrlSchemes
410 Url::getRegisteredSchemes()
412 return g_urlSchemeRepository().getRegisteredSchemes();
416 // -----------------------------------------------------------------
419 Url::isRegisteredScheme(const std::string &scheme)
421 return g_urlSchemeRepository().isRegisteredScheme(scheme);
425 // -----------------------------------------------------------------
426 zypp::url::UrlSchemes
427 Url::getKnownSchemes() const
429 return m_impl->getKnownSchemes();
433 // -----------------------------------------------------------------
435 Url::isValidScheme(const std::string &scheme) const
437 return m_impl->isValidScheme(scheme);
441 // -----------------------------------------------------------------
445 return m_impl->isValid();
449 // -----------------------------------------------------------------
451 Url::asString() const
453 return m_impl->asString();
457 // -----------------------------------------------------------------
459 Url::asCompleteString() const
461 // make sure, all url components are included;
462 // regardless of the current configuration...
463 ViewOptions opts(getViewOptions() +
464 ViewOption::WITH_SCHEME +
465 ViewOption::WITH_USERNAME +
466 ViewOption::WITH_PASSWORD +
467 ViewOption::WITH_HOST +
468 ViewOption::WITH_PORT +
469 ViewOption::WITH_PATH_NAME +
470 ViewOption::WITH_PATH_PARAMS +
471 ViewOption::WITH_QUERY_STR +
472 ViewOption::WITH_FRAGMENT);
473 return m_impl->asString(opts);
477 // -----------------------------------------------------------------
479 Url::asString(const ViewOptions &opts) const
481 return m_impl->asString(opts);
485 // -----------------------------------------------------------------
487 Url::getScheme() const
489 return m_impl->getScheme();
493 // -----------------------------------------------------------------
495 Url::getAuthority() const
497 return m_impl->getAuthority();
500 // -----------------------------------------------------------------
502 Url::getPathData() const
504 return m_impl->getPathData();
508 // -----------------------------------------------------------------
510 Url::getQueryString() const
512 return m_impl->getQueryString();
516 // -----------------------------------------------------------------
518 Url::getFragment(zypp::url::EEncoding eflag) const
520 return m_impl->getFragment(eflag);
524 // -----------------------------------------------------------------
526 Url::getUsername(EEncoding eflag) const
528 return m_impl->getUsername(eflag);
532 // -----------------------------------------------------------------
534 Url::getPassword(EEncoding eflag) const
536 return m_impl->getPassword(eflag);
540 // -----------------------------------------------------------------
542 Url::getHost(EEncoding eflag) const
544 return m_impl->getHost(eflag);
548 // -----------------------------------------------------------------
552 return m_impl->getPort();
556 // -----------------------------------------------------------------
558 Url::getPathName(EEncoding eflag) const
560 return m_impl->getPathName(eflag);
564 // -----------------------------------------------------------------
566 Url::getPathParams() const
568 return m_impl->getPathParams();
572 // -----------------------------------------------------------------
574 Url::getPathParamsVec() const
576 return m_impl->getPathParamsVec();
580 // -----------------------------------------------------------------
582 Url::getPathParamsMap(EEncoding eflag) const
584 return m_impl->getPathParamsMap(eflag);
588 // -----------------------------------------------------------------
590 Url::getPathParam(const std::string ¶m, EEncoding eflag) const
592 return m_impl->getPathParam(param, eflag);
596 // -----------------------------------------------------------------
598 Url::getQueryStringVec() const
600 return m_impl->getQueryStringVec();
604 // -----------------------------------------------------------------
606 Url::getQueryStringMap(EEncoding eflag) const
608 return m_impl->getQueryStringMap(eflag);
612 // -----------------------------------------------------------------
614 Url::getQueryParam(const std::string ¶m, EEncoding eflag) const
616 return m_impl->getQueryParam(param, eflag);
620 // -----------------------------------------------------------------
622 Url::setScheme(const std::string &scheme)
624 if(scheme == m_impl->getScheme())
628 if( m_impl->isKnownScheme(scheme))
630 m_impl->setScheme(scheme);
634 UrlRef url = g_urlSchemeRepository().getUrlByScheme(scheme);
637 url.reset( new UrlBase());
641 m_impl->getAuthority(),
642 m_impl->getPathData(),
643 m_impl->getQueryString(),
644 m_impl->getFragment(zypp::url::E_ENCODED)
650 // -----------------------------------------------------------------
652 Url::setAuthority(const std::string &authority)
654 m_impl->setAuthority(authority);
658 // -----------------------------------------------------------------
660 Url::setPathData(const std::string &pathdata)
662 m_impl->setPathData(pathdata);
666 // -----------------------------------------------------------------
668 Url::setQueryString(const std::string &querystr)
670 m_impl->setQueryString(querystr);
674 // -----------------------------------------------------------------
676 Url::setFragment(const std::string &fragment, EEncoding eflag)
678 m_impl->setFragment(fragment, eflag);
682 // -----------------------------------------------------------------
684 Url::setUsername(const std::string &user,
687 m_impl->setUsername(user, eflag);
691 // -----------------------------------------------------------------
693 Url::setPassword(const std::string &pass,
696 m_impl->setPassword(pass, eflag);
700 // -----------------------------------------------------------------
702 Url::setHost(const std::string &host)
704 m_impl->setHost(host);
708 // -----------------------------------------------------------------
710 Url::setPort(const std::string &port)
712 m_impl->setPort(port);
716 // -----------------------------------------------------------------
718 Url::setPathName(const std::string &path,
721 m_impl->setPathName(path, eflag);
725 // -----------------------------------------------------------------
727 Url::setPathParams(const std::string ¶ms)
729 m_impl->setPathParams(params);
733 // -----------------------------------------------------------------
735 Url::setPathParamsVec(const zypp::url::ParamVec &pvec)
737 m_impl->setPathParamsVec(pvec);
741 // -----------------------------------------------------------------
743 Url::setPathParamsMap(const zypp::url::ParamMap &pmap)
745 m_impl->setPathParamsMap(pmap);
749 // -----------------------------------------------------------------
751 Url::setPathParam(const std::string ¶m, const std::string &value)
753 m_impl->setPathParam(param, value);
757 // -----------------------------------------------------------------
759 Url::setQueryStringVec(const zypp::url::ParamVec &pvec)
761 m_impl->setQueryStringVec(pvec);
765 // -----------------------------------------------------------------
767 Url::setQueryStringMap(const zypp::url::ParamMap &pmap)
769 m_impl->setQueryStringMap(pmap);
772 // -----------------------------------------------------------------
774 Url::setQueryParam(const std::string ¶m, const std::string &value)
776 m_impl->setQueryParam(param, value);
779 // -----------------------------------------------------------------
781 Url::getViewOptions() const
783 return m_impl->getViewOptions();
786 // -----------------------------------------------------------------
788 Url::setViewOptions(const ViewOptions &vopts)
790 m_impl->setViewOptions(vopts);
793 // -----------------------------------------------------------------
794 std::ostream & operator<<( std::ostream & str, const Url & url )
796 return str << url.asString();
799 bool operator<( const Url &lhs, const Url &rhs )
801 return (lhs.asCompleteString() < rhs.asCompleteString());
804 bool operator==( const Url &lhs, const Url &rhs )
806 return (lhs.asCompleteString() == rhs.asCompleteString());
809 bool operator!=( const Url &lhs, const Url &rhs )
811 return (lhs.asCompleteString() != rhs.asCompleteString());
814 ////////////////////////////////////////////////////////////////////
816 //////////////////////////////////////////////////////////////////////
818 ** vim: set ts=2 sts=2 sw=2 ai et: