33// (See accompanying file LICENSE_1_0.txt or copy at
44// http://www.boost.org/LICENSE_1_0.txt)
55
6-
76#include < network/uri/schemes.hpp>
8- #include < boost/unordered_set.hpp>
9-
7+ #include < boost/unordered_map.hpp>
108
119namespace network {
1210namespace {
13- static boost::unordered_set< std::string> hierarchical_schemes_;
14- static boost::unordered_set< std::string> opaque_schemes_;
11+ static boost::unordered_map<std::string, std::string> hierarchical_schemes_;
12+ static boost::unordered_map<std::string, std::string> opaque_schemes_;
1513
1614bool register_hierarchical_schemes () {
17- hierarchical_schemes_.insert (" http" );
18- hierarchical_schemes_.insert (" https" );
19- hierarchical_schemes_.insert (" shttp" );
20- hierarchical_schemes_.insert (" ftp" );
21- hierarchical_schemes_.insert (" file" );
22- hierarchical_schemes_.insert (" dns" );
23- hierarchical_schemes_.insert (" nfs" );
24- hierarchical_schemes_.insert (" imap" );
25- hierarchical_schemes_.insert (" nntp" );
26- hierarchical_schemes_.insert (" pop" );
27- hierarchical_schemes_.insert (" rsync" );
28- hierarchical_schemes_.insert (" snmp" );
29- hierarchical_schemes_.insert (" telnet" );
30- hierarchical_schemes_.insert (" svn" );
31- hierarchical_schemes_.insert (" svn+ssh" );
32- hierarchical_schemes_.insert (" git" );
33- hierarchical_schemes_.insert (" git+ssh" );
15+ hierarchical_schemes_.insert (std::make_pair ( std::string ( " http" ), std::string ( " 80 " )) );
16+ hierarchical_schemes_.insert (std::make_pair ( std::string ( " https" ), std::string ( " 443 " )) );
17+ hierarchical_schemes_.insert (std::make_pair ( std::string ( " shttp" ), std::string ( " " )) );
18+ hierarchical_schemes_.insert (std::make_pair ( std::string ( " ftp" ), std::string ( " 21 " )) );
19+ hierarchical_schemes_.insert (std::make_pair ( std::string ( " file" ), std::string ( " " )) );
20+ hierarchical_schemes_.insert (std::make_pair ( std::string ( " dns" ), std::string ( " 53 " )) );
21+ hierarchical_schemes_.insert (std::make_pair ( std::string ( " nfs" ), std::string ( " 2049 " )) );
22+ hierarchical_schemes_.insert (std::make_pair ( std::string ( " imap" ), std::string ( " 143 " )) );
23+ hierarchical_schemes_.insert (std::make_pair ( std::string ( " nntp" ), std::string ( " " )) );
24+ hierarchical_schemes_.insert (std::make_pair ( std::string ( " pop" ), std::string ( " 119 " )) );
25+ hierarchical_schemes_.insert (std::make_pair ( std::string ( " rsync" ), std::string ( " 873 " )) );
26+ hierarchical_schemes_.insert (std::make_pair ( std::string ( " snmp" ), std::string ( " 161 " )) );
27+ hierarchical_schemes_.insert (std::make_pair ( std::string ( " telnet" ), std::string ( " 23 " )) );
28+ hierarchical_schemes_.insert (std::make_pair ( std::string ( " svn" ), std::string ( " 3690 " )) );
29+ hierarchical_schemes_.insert (std::make_pair ( std::string ( " svn+ssh" ), std::string ( " " )) );
30+ hierarchical_schemes_.insert (std::make_pair ( std::string ( " git" ), std::string ( " 9418 " )) );
31+ hierarchical_schemes_.insert (std::make_pair ( std::string ( " git+ssh" ), std::string ( " " )) );
3432return true ;
3533}
3634
3735bool register_opaque_schemes () {
38- opaque_schemes_.insert (" mailto" );
39- opaque_schemes_.insert (" news" );
40- opaque_schemes_.insert (" im" );
41- opaque_schemes_.insert (" sip" );
42- opaque_schemes_.insert (" sms" );
43- opaque_schemes_.insert (" xmpp" );
36+ opaque_schemes_.insert (std::make_pair (std::string (" mailto" ),std::string (" 25" )));
37+ opaque_schemes_.insert (std::make_pair (std::string (" sip" ),std::string (" 5060" )));
38+ opaque_schemes_.insert (std::make_pair (std::string (" xmpp" ),std::string (" 5222" )));
4439return true ;
4540}
4641
@@ -50,10 +45,28 @@ static bool opaque = register_opaque_schemes();
5045}// namespace
5146
5247bool hierarchical_schemes::exists (const std::string &scheme) {
53- return hierarchical_schemes_. end () != hierarchical_schemes_.find (scheme);
48+ return std:: end (hierarchical_schemes_ ) != hierarchical_schemes_.find (scheme);
5449}
5550
5651bool opaque_schemes::exists (const std::string &scheme) {
57- return opaque_schemes_.end () != opaque_schemes_.find (scheme);
52+ return std::end (opaque_schemes_) != opaque_schemes_.find (scheme);
53+ }
54+
55+ boost::optional<std::string>default_port (const std::string &scheme) {
56+ auto it = hierarchical_schemes_.find (scheme);
57+ if (it !=std::end (hierarchical_schemes_)) {
58+ if (!it->second .empty ()) {
59+ return it->second ;
60+ }
61+ }
62+
63+ it = opaque_schemes_.find (scheme);
64+ if (it !=std::end (opaque_schemes_)) {
65+ if (!it->second .empty ()) {
66+ return it->second ;
67+ }
68+ }
69+
70+ return boost::optional<std::string>();
5871}
5972}// namespace network