Skip to content

Commit aba7b0e

Browse files
committed
[URI] Non-hierarchical URIs can now be built using the builder.
1 parent 8dde86c commit aba7b0e

File tree

6 files changed

+129
-3
lines changed

6 files changed

+129
-3
lines changed

boost/network/uri/directives/scheme.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
# include <boost/range/begin.hpp>
1212
# include <boost/range/end.hpp>
13+
# include <boost/network/uri/schemes.hpp>
1314

1415

1516
namespace boost {
@@ -26,7 +27,12 @@ struct scheme_directive {
2627
>
2728
void operator () (Uri &uri) const {
2829
uri.append(scheme);
29-
uri.append("://");
30+
if (non_hierarchical_schemes::exists(scheme)) {
31+
uri.append(":");
32+
}
33+
else {
34+
uri.append("://");
35+
}
3036
}
3137

3238
std::string scheme;

boost/network/uri/schemes.hpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright 2012 Glyn Matthews.
2+
// Distributed under the Boost Software License, Version 1.0.
3+
// (See accompanying file LICENSE_1_0.txt or copy at
4+
// http://www.boost.org/LICENSE_1_0.txt)
5+
6+
7+
#ifndef __BOOST_NETWORK_URI_SCHEMES_INC__
8+
# define __BOOST_NETWORK_URI_SCHEMES_INC__
9+
10+
11+
#include <boost/unordered_set.hpp>
12+
#include <string>
13+
14+
15+
namespace boost {
16+
namespace network {
17+
namespace uri {
18+
struct hierarchical_schemes {
19+
20+
static void register_(const std::string &scheme);
21+
static bool exists(const std::string &scheme);
22+
23+
static boost::unordered_set<std::string> schemes_;
24+
25+
};
26+
27+
struct non_hierarchical_schemes {
28+
29+
static void register_(const std::string &scheme);
30+
static bool exists(const std::string &scheme);
31+
32+
static boost::unordered_set<std::string> schemes_;
33+
34+
};
35+
} // namespace uri
36+
} // namespace network
37+
} // namespace boost
38+
39+
40+
#endif // __BOOST_NETWORK_URI_SCHEMES_INC__

boost/network/uri/uri.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ bool is_valid(const uri &uri_) {
279279

280280
inline
281281
bool operator == (const uri &lhs, const uri &rhs) {
282-
return std::equal(lhs.begin(), lhs.end(), rhs.begin());
282+
return boost::equal(lhs, rhs);
283283
}
284284
} // namespace uri
285285
} // namespace network

libs/network/src/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
include_directories(${CPP-NETLIB_SOURCE_DIR})
1010

11-
set(CPP-NETLIB_URI_SRCS uri/parse.cpp)
11+
set(CPP-NETLIB_URI_SRCS uri/parse.cpp uri/schemes.cpp)
1212
add_library(cppnetlib-uri ${CPP-NETLIB_URI_SRCS})
1313

1414
set(CPP-NETLIB_HTTP_SERVER_SRCS server_request_parsers_impl.cpp)

libs/network/src/uri/schemes.cpp

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// Copyright 2012 Glyn Matthews.
2+
// Distributed under the Boost Software License, Version 1.0.
3+
// (See accompanying file LICENSE_1_0.txt or copy at
4+
// http://www.boost.org/LICENSE_1_0.txt)
5+
6+
7+
#include <boost/network/uri/schemes.hpp>
8+
9+
10+
namespace boost {
11+
namespace network {
12+
namespace uri {
13+
boost::unordered_set<std::string> hierarchical_schemes::schemes_;
14+
15+
void hierarchical_schemes::register_(const std::string &scheme) {
16+
schemes_.insert(scheme);
17+
}
18+
19+
bool hierarchical_schemes::exists(const std::string &scheme) {
20+
schemes_.end() != schemes_.find(scheme);
21+
}
22+
23+
boost::unordered_set<std::string> non_hierarchical_schemes::schemes_;
24+
25+
void non_hierarchical_schemes::register_(const std::string &scheme) {
26+
schemes_.insert(scheme);
27+
}
28+
29+
bool non_hierarchical_schemes::exists(const std::string &scheme) {
30+
schemes_.end() != schemes_.find(scheme);
31+
}
32+
33+
namespace {
34+
bool register_hierarchical_schemes() {
35+
hierarchical_schemes::register_("http");
36+
hierarchical_schemes::register_("https");
37+
hierarchical_schemes::register_("shttp");
38+
hierarchical_schemes::register_("ftp");
39+
hierarchical_schemes::register_("file");
40+
hierarchical_schemes::register_("dns");
41+
hierarchical_schemes::register_("nfs");
42+
hierarchical_schemes::register_("imap");
43+
hierarchical_schemes::register_("nntp");
44+
hierarchical_schemes::register_("pop");
45+
hierarchical_schemes::register_("rsync");
46+
hierarchical_schemes::register_("snmp");
47+
hierarchical_schemes::register_("telnet");
48+
hierarchical_schemes::register_("svn");
49+
hierarchical_schemes::register_("svn+ssh");
50+
hierarchical_schemes::register_("git");
51+
hierarchical_schemes::register_("git+ssh");
52+
return true;
53+
}
54+
55+
bool register_non_hierarchical_schemes() {
56+
non_hierarchical_schemes::register_("mailto");
57+
non_hierarchical_schemes::register_("news");
58+
non_hierarchical_schemes::register_("im");
59+
non_hierarchical_schemes::register_("sip");
60+
non_hierarchical_schemes::register_("sms");
61+
non_hierarchical_schemes::register_("xmpp");
62+
return true;
63+
}
64+
65+
66+
static bool hierarchical = register_hierarchical_schemes();
67+
static bool non_hierarchical = register_non_hierarchical_schemes();
68+
} // namespace
69+
} // namespace uri
70+
} // namespace network
71+
} // namespace boost

libs/network/test/uri/url_builder_test.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,3 +163,12 @@ BOOST_AUTO_TEST_CASE(encoded_null_char_test)
163163
BOOST_CHECK_EQUAL(uri::host(instance), "www.example.com");
164164
BOOST_CHECK_EQUAL(uri::path(instance), "/");
165165
}
166+
167+
BOOST_AUTO_TEST_CASE(mailto_builder_test)
168+
{
169+
uri::uri instance;
170+
instance << uri::scheme("mailto") << uri::path("[email protected]");
171+
BOOST_REQUIRE(uri::valid(instance));
172+
BOOST_CHECK_EQUAL(uri::scheme(instance), "mailto");
173+
BOOST_CHECK_EQUAL(uri::path(instance), "[email protected]");
174+
}

0 commit comments

Comments
 (0)