@@ -38,10 +38,12 @@ template <
38
38
struct uri_parts
39
39
: boost::fusion::vector<
40
40
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
+ >
45
47
, iterator_range<Tag>
46
48
, iterator_range<Tag>
47
49
>
@@ -101,38 +103,62 @@ class basic_uri
101
103
102
104
const_range_type user_info_range () const {
103
105
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)));
106
114
}
107
115
108
116
const_range_type host_range () const {
109
117
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)));
112
126
}
113
127
114
128
const_range_type port_range () const {
115
129
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)));
118
138
}
119
139
120
140
const_range_type path_range () const {
121
141
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)));
124
150
}
125
151
126
152
const_range_type query_range () const {
127
153
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_)));
130
156
}
131
157
132
158
const_range_type fragment_range () const {
133
159
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_)));
136
162
}
137
163
138
164
string_type scheme () const {
@@ -214,130 +240,170 @@ struct uri_grammar : qi::grammar<Iterator, uri_parts<Tag>()> {
214
240
uri_grammar () : uri_grammar::base_type(start, " uri" ) {
215
241
using boost::spirit::repository::qi::iter_pos;
216
242
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
+ ;
322
381
}
323
382
324
- qi::rule<Iterator, typename std::string ::value_type ()>
383
+ qi::rule<Iterator, typename string<Tag>::type ::value_type()>
325
384
gen_delims, sub_delims, reserved, unreserved;
385
+ // qi::rule<Iterator, iterator_range<Tag>()>
326
386
qi::rule<Iterator, std::string()>
327
387
pct_encoded, pchar;
328
388
329
389
qi::rule<Iterator, std::string()>
330
390
segment, segment_nz, segment_nz_nc;
331
- qi::rule<Iterator, std::string ()>
391
+ qi::rule<Iterator, iterator_range<Tag> ()>
332
392
path_abempty, path_absolute, path_rootless, path_empty;
333
393
334
394
qi::rule<Iterator, std::string()>
335
- dec_octet, ipv4address, reg_name, host, port ;
395
+ dec_octet, ipv4address, reg_name;
336
396
337
- qi::rule<Iterator, std::string()>
397
+ qi::rule<Iterator, iterator_range<Tag>()>
398
+ host, port;
399
+
400
+ qi::rule<Iterator, iterator_range<Tag>()>
338
401
scheme, user_info, query, fragment;
339
402
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> >()>
341
407
hier_part;
342
408
343
409
// actual uri parser
0 commit comments