Skip to content

Commit 7999af3

Browse files
committed
[URI] Updated range & tests.
1 parent 57fc832 commit 7999af3

File tree

6 files changed

+257
-76
lines changed

6 files changed

+257
-76
lines changed

boost/network/uri/detail/uri_parts.hpp

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,43 @@ struct hierarchical_part {
2323
optional<iterator_range<FwdIter> > host;
2424
optional<iterator_range<FwdIter> > port;
2525
optional<iterator_range<FwdIter> > path;
26+
27+
FwdIter begin() const {
28+
return boost::begin(user_info);
29+
}
30+
31+
FwdIter end() const {
32+
return boost::end(path);
33+
}
34+
35+
void update() {
36+
if (!user_info) {
37+
if (host) {
38+
user_info = iterator_range<FwdIter>(boost::begin(host.get()),
39+
boost::begin(host.get()));
40+
}
41+
else if (path) {
42+
user_info = iterator_range<FwdIter>(boost::begin(path.get()),
43+
boost::begin(path.get()));
44+
}
45+
}
46+
47+
if (!host) {
48+
host = iterator_range<FwdIter>(boost::begin(path.get()),
49+
boost::begin(path.get()));
50+
}
51+
52+
if (!port) {
53+
port = iterator_range<FwdIter>(boost::end(host.get()),
54+
boost::end(host.get()));
55+
}
56+
57+
if (!path) {
58+
path = iterator_range<FwdIter>(boost::end(port.get()),
59+
boost::end(port.get()));
60+
}
61+
}
62+
2663
};
2764

2865
template <
@@ -34,14 +71,27 @@ struct uri_parts {
3471
optional<iterator_range<FwdIter> > query;
3572
optional<iterator_range<FwdIter> > fragment;
3673

37-
void clear() {
38-
scheme = iterator_range<FwdIter>();
39-
hier_part.user_info = optional<iterator_range<FwdIter> >();
40-
hier_part.host = optional<iterator_range<FwdIter> >();
41-
hier_part.port = optional<iterator_range<FwdIter> >();
42-
hier_part.path = optional<iterator_range<FwdIter> >();
43-
query = optional<iterator_range<FwdIter> >();
44-
fragment = optional<iterator_range<FwdIter> >();
74+
FwdIter begin() const {
75+
return boost::begin(scheme);
76+
}
77+
78+
FwdIter end() const {
79+
return boost::end(fragment);
80+
}
81+
82+
void update() {
83+
84+
hier_part.update();
85+
86+
if (!query) {
87+
query = iterator_range<FwdIter>(boost::end(hier_part.path.get()),
88+
boost::end(hier_part.path.get()));
89+
}
90+
91+
if (!fragment) {
92+
fragment = iterator_range<FwdIter>(boost::end(query.get()),
93+
boost::end(query.get()));
94+
}
4595
}
4696
};
4797
} // namespace detail

boost/network/uri/schemes.hpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
# define __BOOST_NETWORK_URI_SCHEMES_INC__
99

1010

11-
#include <boost/unordered_set.hpp>
1211
#include <string>
1312

1413

@@ -19,26 +18,16 @@ class hierarchical_schemes {
1918

2019
public:
2120

22-
static void register_(const std::string &scheme);
2321
static bool exists(const std::string &scheme);
2422

25-
private:
26-
27-
static boost::unordered_set<std::string> schemes_;
28-
2923
};
3024

3125
class non_hierarchical_schemes {
3226

3327
public:
3428

35-
static void register_(const std::string &scheme);
3629
static bool exists(const std::string &scheme);
3730

38-
private:
39-
40-
static boost::unordered_set<std::string> schemes_;
41-
4231
};
4332
} // namespace uri
4433
} // namespace network

boost/network/uri/uri.hpp

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
# include <boost/network/uri/config.hpp>
1111
# include <boost/network/uri/detail/uri_parts.hpp>
12+
# include <boost/network/uri/schemes.hpp>
1213
# include <boost/utility/swap.hpp>
1314
# include <boost/range/algorithm/equal.hpp>
1415
# include <boost/range/algorithm/copy.hpp>
@@ -198,9 +199,15 @@ class BOOST_URI_DECL uri {
198199

199200
inline
200201
void uri::parse() {
201-
uri_parts_.clear();
202202
const_iterator first(boost::begin(uri_)), last(boost::end(uri_));
203203
is_valid_ = detail::parse(first, last, uri_parts_);
204+
if (is_valid_) {
205+
if (!uri_parts_.scheme) {
206+
uri_parts_.scheme = const_range_type(boost::begin(uri_),
207+
boost::begin(uri_));
208+
}
209+
uri_parts_.update();
210+
}
204211
}
205212

206213
inline
@@ -277,10 +284,10 @@ bool is_absolute(const uri &uri_) {
277284
return uri_.is_valid() && !boost::empty(uri_.scheme_range());
278285
}
279286

280-
//inline
281-
//bool is_hierarchical(const uri &uri_) {
282-
// return is_absolute(uri_) && hierarchical_schemes::exists(scheme(uri_));
283-
//}
287+
inline
288+
bool is_hierarchical(const uri &uri_) {
289+
return is_absolute(uri_) && hierarchical_schemes::exists(scheme(uri_));
290+
}
284291

285292
inline
286293
bool is_valid(const uri &uri_) {
@@ -315,22 +322,25 @@ uri from_parts(const uri &base_uri,
315322
const uri::string_type &query_,
316323
const uri::string_type &fragment_) {
317324
uri uri_(base_uri);
318-
return uri_ << path(path_) << query(query_) << fragment(fragment_);
325+
builder(uri_).path(path_).query(query_).fragment(fragment_);
326+
return uri_;
319327
}
320328

321329
inline
322330
uri from_parts(const uri &base_uri,
323331
const uri::string_type &path_,
324332
const uri::string_type &query_) {
325333
uri uri_(base_uri);
326-
return uri_ << path(path_) << query(query_);
334+
builder(uri_).path(path_).query(query_);
335+
return uri_;
327336
}
328337

329338
inline
330339
uri from_parts(const uri &base_uri,
331340
const uri::string_type &path_) {
332341
uri uri_(base_uri);
333-
return uri_ << path(path_);
342+
builder(uri_).path(path_);
343+
return uri_;
334344
}
335345

336346
inline
@@ -365,7 +375,8 @@ namespace uri {
365375
inline
366376
uri from_file(const filesystem::path &path_) {
367377
uri uri_;
368-
return uri_ << schemes::file << path(path_.string());
378+
builder(uri_).scheme("file").path(path_.string());
379+
return uri_;
369380
}
370381
} // namespace uri
371382
} // namespace network

libs/network/src/uri/schemes.cpp

Lines changed: 35 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -5,67 +5,59 @@
55

66

77
#include <boost/network/uri/schemes.hpp>
8+
#include <boost/unordered_set.hpp>
89

910

1011
namespace boost {
1112
namespace network {
1213
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-
return 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-
return schemes_.end() != schemes_.find(scheme);
31-
}
32-
3314
namespace {
15+
static boost::unordered_set<std::string> hierarchical_schemes_;
16+
static boost::unordered_set<std::string> non_hierarchical_schemes_;
17+
3418
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");
19+
hierarchical_schemes_.insert("http");
20+
hierarchical_schemes_.insert("https");
21+
hierarchical_schemes_.insert("shttp");
22+
hierarchical_schemes_.insert("ftp");
23+
hierarchical_schemes_.insert("file");
24+
hierarchical_schemes_.insert("dns");
25+
hierarchical_schemes_.insert("nfs");
26+
hierarchical_schemes_.insert("imap");
27+
hierarchical_schemes_.insert("nntp");
28+
hierarchical_schemes_.insert("pop");
29+
hierarchical_schemes_.insert("rsync");
30+
hierarchical_schemes_.insert("snmp");
31+
hierarchical_schemes_.insert("telnet");
32+
hierarchical_schemes_.insert("svn");
33+
hierarchical_schemes_.insert("svn+ssh");
34+
hierarchical_schemes_.insert("git");
35+
hierarchical_schemes_.insert("git+ssh");
5236
return true;
5337
}
5438

5539
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");
40+
non_hierarchical_schemes_.insert("mailto");
41+
non_hierarchical_schemes_.insert("news");
42+
non_hierarchical_schemes_.insert("im");
43+
non_hierarchical_schemes_.insert("sip");
44+
non_hierarchical_schemes_.insert("sms");
45+
non_hierarchical_schemes_.insert("xmpp");
6246
return true;
6347
}
6448

6549

6650
static bool hierarchical = register_hierarchical_schemes();
6751
static bool non_hierarchical = register_non_hierarchical_schemes();
6852
} // namespace
53+
54+
bool hierarchical_schemes::exists(const std::string &scheme) {
55+
return hierarchical_schemes_.end() != hierarchical_schemes_.find(scheme);
56+
}
57+
58+
bool non_hierarchical_schemes::exists(const std::string &scheme) {
59+
return non_hierarchical_schemes_.end() != non_hierarchical_schemes_.find(scheme);
60+
}
6961
} // namespace uri
7062
} // namespace network
7163
} // namespace boost

libs/network/test/uri/relative_url_test.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,10 @@ BOOST_AUTO_TEST_CASE(relative_uri_test) {
1717
BOOST_CHECK(uri::is_absolute(instance));
1818
BOOST_CHECK_EQUAL(uri::path(instance), "www.example.com/");
1919
}
20+
21+
BOOST_AUTO_TEST_CASE(relative_uri_scheme_test) {
22+
uri::uri instance("www.example.com/");
23+
BOOST_REQUIRE(instance.scheme_range());
24+
BOOST_CHECK(instance.begin() == boost::begin(instance.scheme_range()));
25+
BOOST_CHECK(instance.begin() == boost::end(instance.scheme_range()));
26+
}

0 commit comments

Comments
 (0)