Skip to content

Commit b9d61ee

Browse files
committed
Cleaned up further the implementation of the URI parts and parser.
1 parent 4fbe263 commit b9d61ee

File tree

4 files changed

+83
-115
lines changed

4 files changed

+83
-115
lines changed

boost/network/protocol/http/impl/request.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include <boost/network/uri/uri.hpp>
1919
#include <boost/network/traits/vector.hpp>
20+
#include <boost/network/constants.hpp>
2021

2122
#include <boost/network/protocol/http/message/async_message.hpp>
2223
#include <boost/network/support/is_async.hpp>

boost/network/uri/detail/uri_parts.hpp

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,38 +7,48 @@
77
# define BOOST_NETWORK_URL_DETAIL_URL_PARTS_HPP_
88

99

10-
# include <utility>
10+
# include <boost/range/iterator_range.hpp>
1111

1212

1313
namespace boost {
1414
namespace network {
1515
namespace uri {
1616
namespace detail {
1717
template <
18-
class String
18+
class FwdIter
1919
>
20-
struct iterator_range
21-
: std::pair<
22-
typename String::const_iterator
23-
, typename String::const_iterator> {
20+
struct hierarchical_part {
21+
iterator_range<FwdIter> user_info, host, port, path;
2422

25-
};
23+
hierarchical_part()
24+
{}
2625

27-
template <
28-
class String
29-
>
30-
struct hierarchical_part {
31-
iterator_range<String> user_info, host, port, path;
26+
hierarchical_part(FwdIter begin, FwdIter end)
27+
: user_info(begin, end)
28+
, host(begin, end)
29+
, port(begin, end)
30+
, path(begin, end)
31+
{ }
3232
};
3333

3434
template <
35-
class String
35+
class FwdIter
3636
>
3737
struct uri_parts {
38-
iterator_range<String> scheme;
39-
hierarchical_part<String> hier_part;
40-
iterator_range<String> query;
41-
iterator_range<String> fragment;
38+
iterator_range<FwdIter> scheme;
39+
hierarchical_part<FwdIter> hier_part;
40+
iterator_range<FwdIter> query;
41+
iterator_range<FwdIter> fragment;
42+
43+
uri_parts()
44+
{}
45+
46+
uri_parts(FwdIter begin, FwdIter end)
47+
: scheme(begin, end)
48+
, hier_part(begin, end)
49+
, query(begin, end)
50+
, fragment(begin, end)
51+
{ }
4252
};
4353
} // namespace detail
4454
} // namespace uri

boost/network/uri/uri.hpp

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,7 @@
77
#ifndef __BOOST_NETWORK_URI_INC__
88
# define __BOOST_NETWORK_URI_INC__
99

10-
11-
# include <boost/network/traits/string.hpp>
12-
# include <boost/network/constants.hpp>
1310
# include <boost/network/uri/detail/uri_parts.hpp>
14-
# include <boost/algorithm/string.hpp>
15-
# include <boost/range/iterator_range.hpp>
1611
# include <boost/operators.hpp>
1712
# include <boost/utility/swap.hpp>
1813
# include <boost/lexical_cast.hpp>
@@ -26,7 +21,7 @@ namespace uri {
2621
namespace detail {
2722
bool parse(std::string::const_iterator first,
2823
std::string::const_iterator last,
29-
uri_parts<std::string> &parts);
24+
uri_parts<std::string::const_iterator> &parts);
3025
} // namespace detail
3126

3227

@@ -50,7 +45,7 @@ class uri
5045
class FwdIter
5146
>
5247
uri(const FwdIter &first, const FwdIter &last)
53-
: uri_(first, last), is_valid_(false) {
48+
: uri_(first, last), uri_parts_(first, first), is_valid_(false) {
5449
parse();
5550
}
5651

@@ -103,38 +98,31 @@ class uri
10398
}
10499

105100
const_range_type scheme_range() const {
106-
return const_range_type(uri_parts_.scheme.first,
107-
uri_parts_.scheme.second);
101+
return uri_parts_.scheme;
108102
}
109103

110104
const_range_type user_info_range() const {
111-
return const_range_type(uri_parts_.hier_part.user_info.first,
112-
uri_parts_.hier_part.user_info.second);
105+
return uri_parts_.hier_part.user_info;
113106
}
114107

115108
const_range_type host_range() const {
116-
return const_range_type(uri_parts_.hier_part.host.first,
117-
uri_parts_.hier_part.host.second);
109+
return uri_parts_.hier_part.host;
118110
}
119111

120112
const_range_type port_range() const {
121-
return const_range_type(uri_parts_.hier_part.port.first,
122-
uri_parts_.hier_part.port.second);
113+
return uri_parts_.hier_part.port;
123114
}
124115

125116
const_range_type path_range() const {
126-
return const_range_type(uri_parts_.hier_part.path.first,
127-
uri_parts_.hier_part.path.second);
117+
return uri_parts_.hier_part.path;
128118
}
129119

130120
const_range_type query_range() const {
131-
return const_range_type(uri_parts_.query.first,
132-
uri_parts_.query.second);
121+
return uri_parts_.query;
133122
}
134123

135124
const_range_type fragment_range() const {
136-
return const_range_type(uri_parts_.fragment.first,
137-
uri_parts_.fragment.second);
125+
return uri_parts_.fragment;
138126
}
139127

140128
string_type scheme() const {
@@ -198,7 +186,7 @@ class uri
198186
void parse();
199187

200188
string_type uri_;
201-
detail::uri_parts<std::string> uri_parts_;
189+
detail::uri_parts<std::string::const_iterator> uri_parts_;
202190
bool is_valid_;
203191

204192
};

libs/network/src/uri/parse.cpp

Lines changed: 45 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -6,57 +6,46 @@
66

77
#include <boost/network/uri/detail/uri_parts.hpp>
88
#include <boost/config/warning_disable.hpp>
9-
#include <boost/spirit/include/qi.hpp>
10-
#include <boost/spirit/include/phoenix_operator.hpp>
11-
#include <boost/spirit/include/version.hpp>
12-
#include <boost/spirit/repository/include/qi_iter_pos.hpp>
9+
#include <boost/spirit/home/qi.hpp>
1310
#include <boost/fusion/adapted/struct/adapt_struct.hpp>
1411

15-
16-
BOOST_FUSION_ADAPT_TPL_STRUCT
17-
(
18-
(String),
19-
(boost::network::uri::detail::iterator_range)(String),
20-
(typename String::const_iterator, first)
21-
(typename String::const_iterator, second)
22-
);
23-
2412
BOOST_FUSION_ADAPT_TPL_STRUCT
2513
(
26-
(String),
27-
(boost::network::uri::detail::hierarchical_part)(String),
28-
(boost::network::uri::detail::iterator_range<String>, user_info)
29-
(boost::network::uri::detail::iterator_range<String>, host)
30-
(boost::network::uri::detail::iterator_range<String>, port)
31-
(boost::network::uri::detail::iterator_range<String>, path)
14+
(FwdIter),
15+
(boost::network::uri::detail::hierarchical_part)(FwdIter),
16+
(boost::iterator_range<FwdIter>, user_info)
17+
(boost::iterator_range<FwdIter>, host)
18+
(boost::iterator_range<FwdIter>, port)
19+
(boost::iterator_range<FwdIter>, path)
3220
);
3321

3422
BOOST_FUSION_ADAPT_TPL_STRUCT
3523
(
36-
(String),
37-
(boost::network::uri::detail::uri_parts)(String),
38-
(boost::network::uri::detail::iterator_range<String>, scheme)
39-
(boost::network::uri::detail::hierarchical_part<String>, hier_part)
40-
(boost::network::uri::detail::iterator_range<String>, query)
41-
(boost::network::uri::detail::iterator_range<String>, fragment)
24+
(FwdIter),
25+
(boost::network::uri::detail::uri_parts)(FwdIter),
26+
(boost::iterator_range<FwdIter>, scheme)
27+
(boost::network::uri::detail::hierarchical_part<FwdIter>, hier_part)
28+
(boost::iterator_range<FwdIter>, query)
29+
(boost::iterator_range<FwdIter>, fragment)
4230
);
4331

44-
4532
namespace boost {
4633
namespace network {
4734
namespace uri {
4835
namespace detail {
4936
namespace qi = boost::spirit::qi;
5037

5138
template <
52-
class String,
53-
typename Iterator
39+
class String
5440
>
55-
struct uri_grammar : qi::grammar<Iterator, detail::uri_parts<String>()> {
41+
struct uri_grammar : qi::grammar<
42+
typename String::const_iterator
43+
, detail::uri_parts<typename String::const_iterator>()> {
5644

57-
uri_grammar() : uri_grammar::base_type(start, "uri") {
58-
using boost::spirit::repository::qi::iter_pos;
45+
typedef String string_type;
46+
typedef typename String::const_iterator const_iterator;
5947

48+
uri_grammar() : uri_grammar::base_type(start, "uri") {
6049
// gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
6150
gen_delims %= qi::char_(":/?#[]@");
6251
// sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
@@ -83,46 +72,34 @@ struct uri_grammar : qi::grammar<Iterator, detail::uri_parts<String>()> {
8372
];
8473
// path-abempty = *( "/" segment )
8574
path_abempty %=
86-
iter_pos
87-
>> qi::omit[qi::raw[*(qi::char_("/") >> segment)]]
88-
>> iter_pos
75+
qi::raw[qi::raw[*(qi::char_("/") >> segment)]]
8976
;
9077
// path-absolute = "/" [ segment-nz *( "/" segment ) ]
9178
path_absolute %=
92-
iter_pos
93-
>> qi::omit[qi::raw[
79+
qi::raw[qi::raw[
9480
qi::char_("/")
9581
>> -(segment_nz >> *(qi::char_("/") >> segment))
9682
]]
97-
>> iter_pos
9883
;
9984
// path-rootless = segment-nz *( "/" segment )
10085
path_rootless %=
101-
iter_pos
102-
>> qi::omit[qi::raw[
86+
qi::raw[qi::raw[
10387
segment_nz >> *(qi::char_("/") >> segment)
10488
]]
105-
>> iter_pos
10689
;
10790
// path-empty = 0<pchar>
10891
path_empty %=
109-
iter_pos
110-
>> qi::omit[qi::eps]
111-
>> iter_pos
92+
qi::raw[qi::eps]
11293
;
11394

11495
// scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
11596
scheme %=
116-
iter_pos
117-
>> qi::omit[qi::alpha >> *(qi::alnum | qi::char_("+.-"))]
118-
>> iter_pos
97+
qi::raw[qi::alpha >> *(qi::alnum | qi::char_("+.-"))]
11998
;
12099

121100
// user_info = *( unreserved / pct-encoded / sub-delims / ":" )
122101
user_info %=
123-
iter_pos
124-
>> qi::omit[qi::raw[*(unreserved | pct_encoded | sub_delims | qi::char_(":"))]]
125-
>> iter_pos
102+
qi::raw[qi::raw[*(unreserved | pct_encoded | sub_delims | qi::char_(":"))]]
126103
;
127104

128105
ip_literal %=
@@ -173,30 +150,22 @@ struct uri_grammar : qi::grammar<Iterator, detail::uri_parts<String>()> {
173150

174151
// TODO, host = IP-literal / IPv4address / reg-name
175152
host %=
176-
iter_pos
177-
>> qi::omit[ip_literal | ipv4address | reg_name]
178-
>> iter_pos
153+
qi::raw[ip_literal | ipv4address | reg_name]
179154
;
180155

181156
// port %= qi::ushort_;
182157
port %=
183-
iter_pos
184-
>> qi::omit[*qi::digit]
185-
>> iter_pos
158+
qi::raw[*qi::digit]
186159
;
187160

188161
// query = *( pchar / "/" / "?" )
189162
query %=
190-
iter_pos
191-
>> qi::omit[qi::raw[*(pchar | qi::char_("/?"))]]
192-
>> iter_pos
163+
qi::raw[qi::raw[*(pchar | qi::char_("/?"))]]
193164
;
194165

195166
// fragment = *( pchar / "/" / "?" )
196167
fragment %=
197-
iter_pos
198-
>> qi::omit[qi::raw[*(pchar | qi::char_("/?"))]]
199-
>> iter_pos
168+
qi::raw[qi::raw[*(pchar | qi::char_("/?"))]]
200169
;
201170

202171
// hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty
@@ -211,9 +180,9 @@ struct uri_grammar : qi::grammar<Iterator, detail::uri_parts<String>()> {
211180
)
212181
|
213182
(
214-
qi::attr(iterator_range<String>())
215-
>> qi::attr(iterator_range<String>())
216-
>> qi::attr(iterator_range<String>())
183+
qi::attr(iterator_range<const_iterator>())
184+
>> qi::attr(iterator_range<const_iterator>())
185+
>> qi::attr(iterator_range<const_iterator>())
217186
>> (
218187
path_absolute
219188
| path_rootless
@@ -230,41 +199,41 @@ struct uri_grammar : qi::grammar<Iterator, detail::uri_parts<String>()> {
230199
;
231200
}
232201

233-
qi::rule<Iterator, typename String::value_type()>
202+
qi::rule<const_iterator, typename string_type::value_type()>
234203
gen_delims, sub_delims, reserved, unreserved;
235-
qi::rule<Iterator, String()>
204+
qi::rule<const_iterator, string_type()>
236205
pct_encoded, pchar;
237206

238-
qi::rule<Iterator, String()>
207+
qi::rule<const_iterator, string_type()>
239208
segment, segment_nz, segment_nz_nc;
240-
qi::rule<Iterator, iterator_range<String>()>
209+
qi::rule<const_iterator, iterator_range<const_iterator>()>
241210
path_abempty, path_absolute, path_rootless, path_empty;
242211

243-
qi::rule<Iterator, String()>
212+
qi::rule<const_iterator, string_type()>
244213
dec_octet, ipv4address, reg_name, ipv6address, ipvfuture, ip_literal;
245214

246-
qi::rule<Iterator, String()>
215+
qi::rule<const_iterator, string_type()>
247216
h16, ls32;
248217

249-
qi::rule<Iterator, iterator_range<String>()>
218+
qi::rule<const_iterator, iterator_range<const_iterator>()>
250219
host, port;
251220

252-
qi::rule<Iterator, iterator_range<String>()>
221+
qi::rule<const_iterator, iterator_range<const_iterator>()>
253222
scheme, user_info, query, fragment;
254223

255-
qi::rule<Iterator, hierarchical_part<String>()>
224+
qi::rule<const_iterator, hierarchical_part<const_iterator>()>
256225
hier_part;
257226

258227
// actual uri parser
259-
qi::rule<Iterator, uri_parts<String>()> start;
228+
qi::rule<const_iterator, uri_parts<const_iterator>()> start;
260229

261230
};
262231

263232
bool parse(std::string::const_iterator first,
264233
std::string::const_iterator last,
265-
uri_parts<std::string> &parts) {
234+
uri_parts<std::string::const_iterator> &parts) {
266235
namespace qi = boost::spirit::qi;
267-
static detail::uri_grammar<std::string, std::string::const_iterator> grammar;
236+
static detail::uri_grammar<std::string> grammar;
268237
bool is_valid = qi::parse(first, last, grammar, parts);
269238
return is_valid && (first == last);
270239
}

0 commit comments

Comments
 (0)