Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitb9d61ee

Browse files
committed
Cleaned up further the implementation of the URI parts and parser.
1 parent4fbe263 commitb9d61ee

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
#defineBOOST_NETWORK_URL_DETAIL_URL_PARTS_HPP_
88

99

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

1212

1313
namespaceboost {
1414
namespacenetwork {
1515
namespaceuri {
1616
namespacedetail {
1717
template<
18-
classString
18+
classFwdIter
1919
>
20-
structiterator_range
21-
: std::pair<
22-
typename String::const_iterator
23-
,typename String::const_iterator> {
20+
structhierarchical_part {
21+
iterator_range<FwdIter> user_info, host, port, path;
2422

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

27-
template<
28-
classString
29-
>
30-
structhierarchical_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-
classString
35+
classFwdIter
3636
>
3737
structuri_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
namespacedetail {
2722
boolparse(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
classFwdIter
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_typescheme_range()const {
106-
returnconst_range_type(uri_parts_.scheme.first,
107-
uri_parts_.scheme.second);
101+
return uri_parts_.scheme;
108102
}
109103

110104
const_range_typeuser_info_range()const {
111-
returnconst_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_typehost_range()const {
116-
returnconst_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_typeport_range()const {
121-
returnconst_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_typepath_range()const {
126-
returnconst_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_typequery_range()const {
131-
returnconst_range_type(uri_parts_.query.first,
132-
uri_parts_.query.second);
121+
return uri_parts_.query;
133122
}
134123

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

140128
string_typescheme()const {
@@ -198,7 +186,7 @@ class uri
198186
voidparse();
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
namespaceboost {
4633
namespacenetwork {
4734
namespaceuri {
4835
namespacedetail {
4936
namespaceqi= boost::spirit::qi;
5037

5138
template<
52-
classString,
53-
typename Iterator
39+
classString
5440
>
55-
structuri_grammar : qi::grammar<Iterator, detail::uri_parts<String>()> {
41+
structuri_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+
typedeftypename 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,typenameString::value_type()>
202+
qi::rule<const_iterator,typenamestring_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
boolparse(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
namespaceqi= 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)

[8]ページ先頭

©2009-2025 Movatter.jp