Skip to content

Commit f2cba58

Browse files
committed
Refactored URI, all unit tests pass.
1 parent 31b5937 commit f2cba58

File tree

1 file changed

+192
-126
lines changed

1 file changed

+192
-126
lines changed

boost/network/uri/uri.hpp

+192-126
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,12 @@ template <
3838
struct uri_parts
3939
: boost::fusion::vector<
4040
iterator_range<Tag>
41-
, iterator_range<Tag>
42-
, iterator_range<Tag>
43-
, iterator_range<Tag>
44-
, iterator_range<Tag>
41+
, boost::fusion::vector<
42+
iterator_range<Tag>
43+
, iterator_range<Tag>
44+
, iterator_range<Tag>
45+
, iterator_range<Tag>
46+
>
4547
, iterator_range<Tag>
4648
, iterator_range<Tag>
4749
>
@@ -101,38 +103,62 @@ class basic_uri
101103

102104
const_range_type user_info_range() const {
103105
using boost::fusion::at_c;
104-
return const_range_type(at_c<0>(at_c<1>(uri_parts_)),
105-
at_c<1>(at_c<1>(uri_parts_)));
106+
const boost::fusion::vector<
107+
details::iterator_range<Tag>
108+
, details::iterator_range<Tag>
109+
, details::iterator_range<Tag>
110+
, details::iterator_range<Tag> > &hier_part = at_c<1>(uri_parts_);
111+
112+
return const_range_type(at_c<0>(at_c<0>(hier_part)),
113+
at_c<1>(at_c<0>(hier_part)));
106114
}
107115

108116
const_range_type host_range() const {
109117
using boost::fusion::at_c;
110-
return const_range_type(at_c<0>(at_c<2>(uri_parts_)),
111-
at_c<1>(at_c<2>(uri_parts_)));
118+
const boost::fusion::vector<
119+
details::iterator_range<Tag>
120+
, details::iterator_range<Tag>
121+
, details::iterator_range<Tag>
122+
, details::iterator_range<Tag> > &hier_part = at_c<1>(uri_parts_);
123+
124+
return const_range_type(at_c<0>(at_c<1>(hier_part)),
125+
at_c<1>(at_c<1>(hier_part)));
112126
}
113127

114128
const_range_type port_range() const {
115129
using boost::fusion::at_c;
116-
return const_range_type(at_c<0>(at_c<3>(uri_parts_)),
117-
at_c<1>(at_c<3>(uri_parts_)));
130+
const boost::fusion::vector<
131+
details::iterator_range<Tag>
132+
, details::iterator_range<Tag>
133+
, details::iterator_range<Tag>
134+
, details::iterator_range<Tag> > &hier_part = at_c<1>(uri_parts_);
135+
136+
return const_range_type(at_c<0>(at_c<2>(hier_part)),
137+
at_c<1>(at_c<2>(hier_part)));
118138
}
119139

120140
const_range_type path_range() const {
121141
using boost::fusion::at_c;
122-
return const_range_type(at_c<0>(at_c<4>(uri_parts_)),
123-
at_c<1>(at_c<4>(uri_parts_)));
142+
const boost::fusion::vector<
143+
details::iterator_range<Tag>
144+
, details::iterator_range<Tag>
145+
, details::iterator_range<Tag>
146+
, details::iterator_range<Tag> > &hier_part = at_c<1>(uri_parts_);
147+
148+
return const_range_type(at_c<0>(at_c<3>(hier_part)),
149+
at_c<1>(at_c<3>(hier_part)));
124150
}
125151

126152
const_range_type query_range() const {
127153
using boost::fusion::at_c;
128-
return const_range_type(at_c<0>(at_c<5>(uri_parts_)),
129-
at_c<1>(at_c<5>(uri_parts_)));
154+
return const_range_type(at_c<0>(at_c<2>(uri_parts_)),
155+
at_c<1>(at_c<2>(uri_parts_)));
130156
}
131157

132158
const_range_type fragment_range() const {
133159
using boost::fusion::at_c;
134-
return const_range_type(at_c<0>(at_c<6>(uri_parts_)),
135-
at_c<1>(at_c<6>(uri_parts_)));
160+
return const_range_type(at_c<0>(at_c<3>(uri_parts_)),
161+
at_c<1>(at_c<3>(uri_parts_)));
136162
}
137163

138164
string_type scheme() const {
@@ -214,130 +240,170 @@ struct uri_grammar : qi::grammar<Iterator, uri_parts<Tag>()> {
214240
uri_grammar() : uri_grammar::base_type(start, "uri") {
215241
using boost::spirit::repository::qi::iter_pos;
216242

217-
// // gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
218-
// gen_delims %= qi::char_(":/?#[]@");
219-
// // sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
220-
// sub_delims %= qi::char_("!$&'()*+,;=");
221-
// // reserved = gen-delims / sub-delims
222-
// reserved %= gen_delims | sub_delims;
223-
// // unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
224-
// unreserved %= qi::alnum | qi::char_("-._~");
225-
// // pct-encoded = "%" HEXDIG HEXDIG
226-
// pct_encoded %= qi::char_("%") >> qi::repeat(2)[qi::xdigit];
227-
228-
// // pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
229-
// pchar %= qi::raw[
230-
// unreserved | pct_encoded | sub_delims | qi::char_(":@")
231-
// ];
232-
233-
// // segment = *pchar
234-
// segment %= qi::raw[*pchar];
235-
// // segment-nz = 1*pchar
236-
// segment_nz %= qi::raw[+pchar];
237-
// // segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
238-
// segment_nz_nc %= qi::raw[
239-
// +(unreserved | pct_encoded | sub_delims | qi::char_("@"))
240-
// ];
241-
// // path-abempty = *( "/" segment )
242-
// path_abempty %= qi::raw[*(qi::char_("/") >> segment)];
243-
// // path-absolute = "/" [ segment-nz *( "/" segment ) ]
244-
// path_absolute %= qi::raw[
245-
// qi::char_("/")
246-
// >> -(segment_nz >> *(qi::char_("/") >> segment))
247-
// ];
248-
// // path-rootless = segment-nz *( "/" segment )
249-
// path_rootless %= qi::raw[
250-
// segment_nz >> *(qi::char_("/") >> segment)
251-
// ];
252-
// // path-empty = 0<pchar>
253-
// path_empty %= qi::eps;
254-
255-
// // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
256-
// scheme %= qi::alpha >> *(qi::alnum | qi::char_("+.-"));
257-
258-
// // user_info = *( unreserved / pct-encoded / sub-delims / ":" )
259-
// user_info %= qi::raw[
260-
// *(unreserved | pct_encoded | sub_delims | qi::char_(":"))
261-
// ];
262-
263-
// // dec-octet = DIGIT / %x31-39 DIGIT / "1" 2DIGIT / "2" %x30-34 DIGIT / "25" %x30-35
264-
// dec_octet %=
265-
// !(qi::lit('0') >> qi::digit)
266-
// >> qi::raw[
267-
// qi::uint_parser<boost::uint8_t, 10, 1, 3>()
268-
// ];
269-
// // IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
270-
// ipv4address %= qi::raw[
271-
// dec_octet >> qi::repeat(3)[qi::lit('.') >> dec_octet]
272-
// ];
273-
// // reg-name = *( unreserved / pct-encoded / sub-delims )
274-
// reg_name %= qi::raw[
275-
// *(unreserved | pct_encoded | sub_delims)
276-
// ];
277-
// // TODO, host = IP-literal / IPv4address / reg-name
278-
// host %= ipv4address | reg_name;
279-
280-
// // port %= qi::ushort_;
281-
282-
// // query = *( pchar / "/" / "?" )
283-
// query %= qi::raw[*(pchar | qi::char_("/?"))];
284-
// // fragment = *( pchar / "/" / "?" )
285-
// fragment %= qi::raw[*(pchar | qi::char_("/?"))];
286-
287-
// // hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty
288-
// // authority = [ userinfo "@" ] host [ ":" port ]
289-
// hier_part %=
290-
// (
291-
// "//"
292-
// >> -(user_info >> '@')
293-
// >> host
294-
// >> -(':' >> port)
295-
// // >> -(':' >> qi::ushort_)
296-
// >> path_abempty
297-
// )
298-
// |
299-
// (
300-
// qi::attr(std::string())
301-
// >> qi::attr(std::string())
302-
// >> qi::attr(std::string())
303-
// >> (
304-
// path_absolute
305-
// | path_rootless
306-
// | path_empty
307-
// )
308-
// );
309-
310-
// start %=
311-
// iter_pos
312-
// >> iter_pos
313-
// >> iter_pos
314-
// >> iter_pos
315-
// >> iter_pos
316-
// >> iter_pos
317-
// >> qi::omit[scheme] >> ':'
318-
// >> hier_part
319-
// // >> -('?' >> qi::omit[query])
320-
// // >> -('#' >> qi::omit[fragment])
321-
// ;
243+
// gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
244+
gen_delims %= qi::char_(":/?#[]@");
245+
// sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
246+
sub_delims %= qi::char_("!$&'()*+,;=");
247+
// reserved = gen-delims / sub-delims
248+
reserved %= gen_delims | sub_delims;
249+
// unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
250+
unreserved %= qi::alnum | qi::char_("-._~");
251+
// pct-encoded = "%" HEXDIG HEXDIG
252+
pct_encoded %= qi::char_("%") >> qi::repeat(2)[qi::xdigit];
253+
254+
// pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
255+
pchar %= qi::raw[
256+
unreserved | pct_encoded | sub_delims | qi::char_(":@")
257+
];
258+
259+
// segment = *pchar
260+
segment %= qi::raw[*pchar];
261+
// segment-nz = 1*pchar
262+
segment_nz %= qi::raw[+pchar];
263+
// segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
264+
segment_nz_nc %= qi::raw[
265+
+(unreserved | pct_encoded | sub_delims | qi::char_("@"))
266+
];
267+
// path-abempty = *( "/" segment )
268+
path_abempty %=
269+
iter_pos
270+
>> qi::omit[qi::raw[*(qi::char_("/") >> segment)]]
271+
>> iter_pos
272+
;
273+
// path-absolute = "/" [ segment-nz *( "/" segment ) ]
274+
path_absolute %=
275+
iter_pos
276+
>> qi::omit[qi::raw[
277+
qi::char_("/")
278+
>> -(segment_nz >> *(qi::char_("/") >> segment))
279+
]]
280+
>> iter_pos
281+
;
282+
// path-rootless = segment-nz *( "/" segment )
283+
path_rootless %=
284+
iter_pos
285+
>> qi::omit[qi::raw[
286+
segment_nz >> *(qi::char_("/") >> segment)
287+
]]
288+
>> iter_pos
289+
;
290+
// path-empty = 0<pchar>
291+
path_empty %=
292+
iter_pos
293+
>> qi::omit[qi::eps]
294+
>> iter_pos
295+
;
296+
297+
// scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
298+
scheme %=
299+
iter_pos
300+
>> qi::omit[qi::alpha >> *(qi::alnum | qi::char_("+.-"))]
301+
>> iter_pos
302+
;
303+
304+
// user_info = *( unreserved / pct-encoded / sub-delims / ":" )
305+
user_info %=
306+
iter_pos
307+
>> qi::omit[qi::raw[*(unreserved | pct_encoded | sub_delims | qi::char_(":"))]]
308+
>> iter_pos
309+
;
310+
311+
// dec-octet = DIGIT / %x31-39 DIGIT / "1" 2DIGIT / "2" %x30-34 DIGIT / "25" %x30-35
312+
dec_octet %=
313+
!(qi::lit('0') >> qi::digit)
314+
>> qi::raw[
315+
qi::uint_parser<boost::uint8_t, 10, 1, 3>()
316+
];
317+
// IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
318+
ipv4address %= qi::raw[
319+
dec_octet >> qi::repeat(3)[qi::lit('.') >> dec_octet]
320+
];
321+
// reg-name = *( unreserved / pct-encoded / sub-delims )
322+
reg_name %= qi::raw[
323+
*(unreserved | pct_encoded | sub_delims)
324+
];
325+
// TODO, host = IP-literal / IPv4address / reg-name
326+
host %=
327+
iter_pos
328+
>> qi::omit[ipv4address | reg_name]
329+
>> iter_pos
330+
;
331+
332+
// port %= qi::ushort_;
333+
port %=
334+
iter_pos
335+
>> qi::omit[*qi::digit]
336+
>> iter_pos
337+
;
338+
339+
// query = *( pchar / "/" / "?" )
340+
query %=
341+
iter_pos
342+
>> qi::omit[qi::raw[*(pchar | qi::char_("/?"))]]
343+
>> iter_pos
344+
;
345+
// fragment = *( pchar / "/" / "?" )
346+
fragment %=
347+
iter_pos
348+
>> qi::omit[qi::raw[*(pchar | qi::char_("/?"))]]
349+
>> iter_pos
350+
;
351+
352+
// hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty
353+
// authority = [ userinfo "@" ] host [ ":" port ]
354+
hier_part %=
355+
(
356+
"//"
357+
>> -(user_info >> '@')
358+
>> host
359+
>> -(':' >> port)
360+
>> path_abempty
361+
)
362+
|
363+
(
364+
qi::attr(iterator_range<Tag>())
365+
>> qi::attr(iterator_range<Tag>())
366+
>> qi::attr(iterator_range<Tag>())
367+
>> (
368+
path_absolute
369+
| path_rootless
370+
| path_empty
371+
)
372+
)
373+
;
374+
375+
start %=
376+
scheme >> ':'
377+
>> hier_part
378+
>> -('?' >> query)
379+
>> -('#' >> fragment)
380+
;
322381
}
323382

324-
qi::rule<Iterator, typename std::string::value_type()>
383+
qi::rule<Iterator, typename string<Tag>::type::value_type()>
325384
gen_delims, sub_delims, reserved, unreserved;
385+
//qi::rule<Iterator, iterator_range<Tag>()>
326386
qi::rule<Iterator, std::string()>
327387
pct_encoded, pchar;
328388

329389
qi::rule<Iterator, std::string()>
330390
segment, segment_nz, segment_nz_nc;
331-
qi::rule<Iterator, std::string()>
391+
qi::rule<Iterator, iterator_range<Tag>()>
332392
path_abempty, path_absolute, path_rootless, path_empty;
333393

334394
qi::rule<Iterator, std::string()>
335-
dec_octet, ipv4address, reg_name, host, port;
395+
dec_octet, ipv4address, reg_name;
336396

337-
qi::rule<Iterator, std::string()>
397+
qi::rule<Iterator, iterator_range<Tag>()>
398+
host, port;
399+
400+
qi::rule<Iterator, iterator_range<Tag>()>
338401
scheme, user_info, query, fragment;
339402

340-
qi::rule<Iterator, std::string()>
403+
qi::rule<Iterator, boost::fusion::vector<iterator_range<Tag>,
404+
iterator_range<Tag>,
405+
iterator_range<Tag>,
406+
iterator_range<Tag> >()>
341407
hier_part;
342408

343409
// actual uri parser

0 commit comments

Comments
 (0)