@@ -37,27 +37,44 @@ namespace boost { namespace network { namespace http {
37
37
, headers_done
38
38
};
39
39
40
+ explicit request_parser (state_t start_state = method_start)
41
+ : internal_state(start_state)
42
+ {}
43
+
44
+ void reset (state_t start_state = method_start) {
45
+ internal_state = method_start;
46
+ }
47
+
48
+ state_t state () const { return internal_state; }
49
+
40
50
template <class Range >
41
- fusion::tuple<logic::tribool, Range>
42
- parse_until (state_t state , Range const & range) {
51
+ fusion::tuple<logic::tribool, iterator_range< typename Range::const_iterator> >
52
+ parse_until (state_t stop_state , Range & range) {
43
53
logic::tribool parsed_ok;
44
54
typedef typename range_iterator<Range>::type iterator;
45
55
iterator start = boost::begin (range)
46
56
, end = boost::end (range)
47
57
, current_iterator = start;
48
-
49
- while (!boost::empty (range) || state != internal_state) {
58
+ iterator_range<iterator> local_range =
59
+ boost::make_iterator_range (start, end);
60
+ while (
61
+ !boost::empty (local_range)
62
+ && stop_state != internal_state
63
+ && parsed_ok == logic::indeterminate
64
+ ) {
50
65
switch (internal_state) {
51
66
default :
52
67
parsed_ok = false ;
53
- return fusion::make_tuple (
54
- parsed_ok,
55
- boost::make_iterator_range (
56
- start, current_iterator
57
- )
58
- );
59
68
};
69
+ local_range = boost::make_iterator_range (
70
+ ++current_iterator, end);
60
71
}
72
+ return fusion::make_tuple (
73
+ parsed_ok,
74
+ boost::make_iterator_range (
75
+ start, current_iterator
76
+ )
77
+ );
61
78
}
62
79
63
80
private:
0 commit comments