1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
13 #include <zypp/base/String.h>
17 //////////////////////////////////////////////////////////////////////
19 { ////////////////////////////////////////////////////////////////////
22 using namespace zypp::url;
25 // -----------------------------------------------------------------
27 * url = [scheme:] [//authority] /path [?query] [#fragment]
29 #define RX_SPLIT_URL "^(([^:/?#]+):)?" \
36 ////////////////////////////////////////////////////////////////////
38 { //////////////////////////////////////////////////////////////////
41 // ---------------------------------------------------------------
42 class LDAPUrl: public UrlBase
50 LDAPUrl(const LDAPUrl &url): UrlBase(url)
56 return new LDAPUrl(*this);
60 getKnownSchemes() const
62 UrlSchemes schemes(2);
71 config("sep_pathparams", "");
73 config("psep_querystr", "?");
74 config("vsep_querystr", "");
76 // host is required (isValid=>false)
77 // but not mandatory (see RFC 2255),
78 // that is, accept empty host.
79 config("require_host", "y");
82 config("rx_username", "");
83 config("rx_password", "");
84 config("rx_fragment", "");
85 config("rx_pathparams", "");
88 virtual zypp::url::ParamMap
89 getQueryStringMap(zypp::url::EEncoding eflag) const
91 static const char * const keys[] = {
92 "attrs", "scope", "filter", "exts", NULL
94 zypp::url::ParamMap pmap;
95 zypp::url::ParamVec pvec( getQueryStringVec());
98 for(size_t i=0; i<pvec.size(); i++)
100 if(eflag == zypp::url::E_ENCODED)
101 pmap[keys[i]] = pvec[i];
103 pmap[keys[i]] = zypp::url::decode( pvec[i]);
108 ZYPP_THROW(url::UrlNotSupportedException(
109 "Invalid LDAP URL query string"
116 setQueryStringMap(const zypp::url::ParamMap &pmap)
118 static const char * const keys[] = {
119 "attrs", "scope", "filter", "exts", NULL
122 // remove psep ("?") from safe chars
123 std::string join_safe;
124 std::string safe(config("safe_querystr"));
125 std::string psep(config("psep_querystr"));
126 for(std::string::size_type i=0; i<safe.size(); i++)
128 if( psep.find(safe[i]) == std::string::npos)
129 join_safe.append(1, safe[i]);
132 zypp::url::ParamVec pvec(4);
133 zypp::url::ParamMap::const_iterator p;
134 for(p=pmap.begin(); p!=pmap.end(); ++p)
137 for(size_t i=0; i<4; i++)
139 if(p->first == keys[i])
142 pvec[i] = zypp::url::encode(p->second, join_safe);
147 ZYPP_THROW(url::UrlNotSupportedException(
148 "Invalid LDAP URL query parameter '" + p->first + "'"
152 setQueryStringVec(pvec);
157 // ---------------------------------------------------------------
162 typedef std::map<std::string,UrlRef> UrlBySchemeMap;
163 UrlBySchemeMap urlByScheme;
170 // =====================================
171 ref.reset( new LDAPUrl());
172 addUrlByScheme("ldap", ref);
173 addUrlByScheme("ldaps", ref);
176 // =====================================
177 ref.reset( new UrlBase());
178 ref->config("with_authority", "n"); // disallow host,...
179 ref->config("require_pathname", "m"); // path is mandatory
180 addUrlByScheme("hd", ref);
181 addUrlByScheme("cd", ref);
182 addUrlByScheme("dvd", ref);
183 addUrlByScheme("dir", ref);
184 addUrlByScheme("iso", ref);
186 // don't show empty authority
187 ref->setViewOptions( zypp::url::ViewOption::DEFAULTS -
188 zypp::url::ViewOption::EMPTY_AUTHORITY);
189 addUrlByScheme("mailto", ref);
190 addUrlByScheme("urn", ref);
192 // RFC1738, 3.10: may contain a host
193 ref->config("with_authority", "y"); // allow host,
194 ref->config("with_port", "n"); // but no port,
195 ref->config("rx_username", ""); // username or
196 ref->config("rx_password", ""); // password ...
197 addUrlByScheme("file", ref);
199 // =====================================
200 ref.reset( new UrlBase());
201 ref->config("require_host", "m"); // host is mandatory
202 addUrlByScheme("nfs", ref);
203 addUrlByScheme("smb", ref);
204 addUrlByScheme("cifs", ref);
205 addUrlByScheme("http", ref);
206 addUrlByScheme("https", ref);
207 ref->config("path_encode_slash2", "y"); // always encode 2. slash
208 addUrlByScheme("ftp", ref);
209 addUrlByScheme("sftp", ref);
213 addUrlByScheme(const std::string &scheme,
216 if( urlImpl && urlImpl->isValidScheme(scheme))
220 urlByScheme[str::toLower(scheme)] = ref;
227 getUrlByScheme(const std::string &scheme) const
229 UrlBySchemeMap::const_iterator i(urlByScheme.find(str::toLower(scheme)));
230 if( i != urlByScheme.end())
238 isRegisteredScheme(const std::string &scheme) const
240 return urlByScheme.find(str::toLower(scheme)) != urlByScheme.end();
244 getRegisteredSchemes() const
246 UrlBySchemeMap::const_iterator i(urlByScheme.begin());
249 schemes.reserve(urlByScheme.size());
250 for( ; i != urlByScheme.end(); ++i)
252 schemes.push_back(i->first);
259 // ---------------------------------------------------------------
260 UrlByScheme g_urlSchemeRepository;
263 //////////////////////////////////////////////////////////////////
264 } // anonymous namespace
265 ////////////////////////////////////////////////////////////////////
268 // -----------------------------------------------------------------
274 // -----------------------------------------------------------------
276 : m_impl( new UrlBase())
281 // -----------------------------------------------------------------
282 Url::Url(const Url &url)
283 : m_impl( url.m_impl)
287 ZYPP_THROW(url::UrlException(
288 "Unable to clone Url object"
294 // -----------------------------------------------------------------
295 Url::Url(const zypp::url::UrlRef &url)
300 ZYPP_THROW(url::UrlException(
301 "Invalid empty Url reference"
307 // -----------------------------------------------------------------
308 Url::Url(const std::string &encodedUrl)
309 : m_impl( parseUrl(encodedUrl))
313 ZYPP_THROW(url::UrlParsingException(
314 "Unable to parse Url components"
320 // -----------------------------------------------------------------
322 Url::operator = (const std::string &encodedUrl)
324 UrlRef url( parseUrl(encodedUrl));
327 ZYPP_THROW(url::UrlParsingException(
328 "Unable to parse Url components"
336 // -----------------------------------------------------------------
338 Url::operator = (const Url &url)
345 // -----------------------------------------------------------------
348 Url::registerScheme(const std::string &scheme,
351 return g_urlSchemeRepository.addUrlByScheme(scheme, urlImpl);
355 // -----------------------------------------------------------------
358 Url::parseUrl(const std::string &encodedUrl)
366 str::regex rex(RX_SPLIT_URL);
367 ret = str::regex_match(encodedUrl, out, rex);
372 if(ret && out.size() == 10)
374 url = g_urlSchemeRepository.getUrlByScheme(out[2].str());
377 url.reset( new UrlBase());
379 url->init(out[2].str(),
389 // -----------------------------------------------------------------
391 zypp::url::UrlSchemes
392 Url::getRegisteredSchemes()
394 return g_urlSchemeRepository.getRegisteredSchemes();
398 // -----------------------------------------------------------------
401 Url::isRegisteredScheme(const std::string &scheme)
403 return g_urlSchemeRepository.isRegisteredScheme(scheme);
407 // -----------------------------------------------------------------
408 zypp::url::UrlSchemes
409 Url::getKnownSchemes() const
411 return m_impl->getKnownSchemes();
415 // -----------------------------------------------------------------
417 Url::isValidScheme(const std::string &scheme) const
419 return m_impl->isValidScheme(scheme);
423 // -----------------------------------------------------------------
427 return m_impl->isValid();
431 // -----------------------------------------------------------------
433 Url::asString() const
435 return m_impl->asString();
439 // -----------------------------------------------------------------
441 Url::asCompleteString() const
443 // make sure, all url components are included;
444 // regardless of the current configuration...
445 ViewOptions opts(getViewOptions() +
446 ViewOption::WITH_SCHEME +
447 ViewOption::WITH_USERNAME +
448 ViewOption::WITH_PASSWORD +
449 ViewOption::WITH_HOST +
450 ViewOption::WITH_PORT +
451 ViewOption::WITH_PATH_NAME +
452 ViewOption::WITH_PATH_PARAMS +
453 ViewOption::WITH_QUERY_STR +
454 ViewOption::WITH_FRAGMENT);
455 return m_impl->asString(opts);
459 // -----------------------------------------------------------------
461 Url::asString(const ViewOptions &opts) const
463 return m_impl->asString(opts);
467 // -----------------------------------------------------------------
469 Url::getScheme() const
471 return m_impl->getScheme();
475 // -----------------------------------------------------------------
477 Url::getAuthority() const
479 return m_impl->getAuthority();
482 // -----------------------------------------------------------------
484 Url::getPathData() const
486 return m_impl->getPathData();
490 // -----------------------------------------------------------------
492 Url::getQueryString() const
494 return m_impl->getQueryString();
498 // -----------------------------------------------------------------
500 Url::getFragment(zypp::url::EEncoding eflag) const
502 return m_impl->getFragment(eflag);
506 // -----------------------------------------------------------------
508 Url::getUsername(EEncoding eflag) const
510 return m_impl->getUsername(eflag);
514 // -----------------------------------------------------------------
516 Url::getPassword(EEncoding eflag) const
518 return m_impl->getPassword(eflag);
522 // -----------------------------------------------------------------
524 Url::getHost(EEncoding eflag) const
526 return m_impl->getHost(eflag);
530 // -----------------------------------------------------------------
534 return m_impl->getPort();
538 // -----------------------------------------------------------------
540 Url::getPathName(EEncoding eflag) const
542 return m_impl->getPathName(eflag);
546 // -----------------------------------------------------------------
548 Url::getPathParams() const
550 return m_impl->getPathParams();
554 // -----------------------------------------------------------------
556 Url::getPathParamsVec() const
558 return m_impl->getPathParamsVec();
562 // -----------------------------------------------------------------
564 Url::getPathParamsMap(EEncoding eflag) const
566 return m_impl->getPathParamsMap(eflag);
570 // -----------------------------------------------------------------
572 Url::getPathParam(const std::string ¶m, EEncoding eflag) const
574 return m_impl->getPathParam(param, eflag);
578 // -----------------------------------------------------------------
580 Url::getQueryStringVec() const
582 return m_impl->getQueryStringVec();
586 // -----------------------------------------------------------------
588 Url::getQueryStringMap(EEncoding eflag) const
590 return m_impl->getQueryStringMap(eflag);
594 // -----------------------------------------------------------------
596 Url::getQueryParam(const std::string ¶m, EEncoding eflag) const
598 return m_impl->getQueryParam(param, eflag);
602 // -----------------------------------------------------------------
604 Url::setScheme(const std::string &scheme)
606 if(scheme == m_impl->getScheme())
610 if( m_impl->isKnownScheme(scheme))
612 m_impl->setScheme(scheme);
616 UrlRef url = g_urlSchemeRepository.getUrlByScheme(scheme);
619 url.reset( new UrlBase());
623 m_impl->getAuthority(),
624 m_impl->getPathData(),
625 m_impl->getQueryString(),
626 m_impl->getFragment(zypp::url::E_ENCODED)
632 // -----------------------------------------------------------------
634 Url::setAuthority(const std::string &authority)
636 m_impl->setAuthority(authority);
640 // -----------------------------------------------------------------
642 Url::setPathData(const std::string &pathdata)
644 m_impl->setPathData(pathdata);
648 // -----------------------------------------------------------------
650 Url::setQueryString(const std::string &querystr)
652 m_impl->setQueryString(querystr);
656 // -----------------------------------------------------------------
658 Url::setFragment(const std::string &fragment, EEncoding eflag)
660 m_impl->setFragment(fragment, eflag);
664 // -----------------------------------------------------------------
666 Url::setUsername(const std::string &user,
669 m_impl->setUsername(user, eflag);
673 // -----------------------------------------------------------------
675 Url::setPassword(const std::string &pass,
678 m_impl->setPassword(pass, eflag);
682 // -----------------------------------------------------------------
684 Url::setHost(const std::string &host)
686 m_impl->setHost(host);
690 // -----------------------------------------------------------------
692 Url::setPort(const std::string &port)
694 m_impl->setPort(port);
698 // -----------------------------------------------------------------
700 Url::setPathName(const std::string &path,
703 m_impl->setPathName(path, eflag);
707 // -----------------------------------------------------------------
709 Url::setPathParams(const std::string ¶ms)
711 m_impl->setPathParams(params);
715 // -----------------------------------------------------------------
717 Url::setPathParamsVec(const zypp::url::ParamVec &pvec)
719 m_impl->setPathParamsVec(pvec);
723 // -----------------------------------------------------------------
725 Url::setPathParamsMap(const zypp::url::ParamMap &pmap)
727 m_impl->setPathParamsMap(pmap);
731 // -----------------------------------------------------------------
733 Url::setPathParam(const std::string ¶m, const std::string &value)
735 m_impl->setPathParam(param, value);
739 // -----------------------------------------------------------------
741 Url::setQueryStringVec(const zypp::url::ParamVec &pvec)
743 m_impl->setQueryStringVec(pvec);
747 // -----------------------------------------------------------------
749 Url::setQueryStringMap(const zypp::url::ParamMap &pmap)
751 m_impl->setQueryStringMap(pmap);
754 // -----------------------------------------------------------------
756 Url::setQueryParam(const std::string ¶m, const std::string &value)
758 m_impl->setQueryParam(param, value);
761 // -----------------------------------------------------------------
763 Url::getViewOptions() const
765 return m_impl->getViewOptions();
768 // -----------------------------------------------------------------
770 Url::setViewOptions(const ViewOptions &vopts)
772 m_impl->setViewOptions(vopts);
775 // -----------------------------------------------------------------
776 std::ostream & operator<<( std::ostream & str, const Url & url )
778 return str << url.asString();
782 ////////////////////////////////////////////////////////////////////
784 //////////////////////////////////////////////////////////////////////
786 ** vim: set ts=2 sts=2 sw=2 ai et: