3
3
// (See accompanying file LICENSE_1_0.txt or copy at
4
4
// http://www.boost.org/LICENSE_1_0.txt)
5
5
6
-
7
6
#include < network/uri/schemes.hpp>
8
- #include < boost/unordered_set.hpp>
9
-
7
+ #include < boost/unordered_map.hpp>
10
8
11
9
namespace network {
12
10
namespace {
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_;
15
13
16
14
bool 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 ( " " )) );
34
32
return true ;
35
33
}
36
34
37
35
bool 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" )));
44
39
return true ;
45
40
}
46
41
@@ -50,10 +45,28 @@ static bool opaque = register_opaque_schemes();
50
45
} // namespace
51
46
52
47
bool 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);
54
49
}
55
50
56
51
bool 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>();
58
71
}
59
72
} // namespace network
0 commit comments