Skip to content

Commit adac71b

Browse files
committed
Incremental Changes to Boilerplate in Incremental Request Parser
This just fixes the internal logic used to drive the internal implementation.
1 parent c0a29e3 commit adac71b

File tree

2 files changed

+41
-11
lines changed

2 files changed

+41
-11
lines changed

boost/network/protocol/http/server/request_parser.hpp

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,27 +37,44 @@ namespace boost { namespace network { namespace http {
3737
, headers_done
3838
};
3939

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+
4050
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) {
4353
logic::tribool parsed_ok;
4454
typedef typename range_iterator<Range>::type iterator;
4555
iterator start = boost::begin(range)
4656
, end = boost::end(range)
4757
, 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+
) {
5065
switch(internal_state) {
5166
default:
5267
parsed_ok = false;
53-
return fusion::make_tuple(
54-
parsed_ok,
55-
boost::make_iterator_range(
56-
start, current_iterator
57-
)
58-
);
5968
};
69+
local_range = boost::make_iterator_range(
70+
++current_iterator, end);
6071
}
72+
return fusion::make_tuple(
73+
parsed_ok,
74+
boost::make_iterator_range(
75+
start, current_iterator
76+
)
77+
);
6178
}
6279

6380
private:

libs/network/test/http_incremental_request_parser.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,17 @@ BOOST_AUTO_TEST_CASE(incremental_parser_constructor) {
3333
request_parser<tags::default_string> p; // default constructible
3434
}
3535

36-
36+
BOOST_AUTO_TEST_CASE(incremental_parser_parse_http_method) {
37+
request_parser<tags::default_string> p;
38+
logic::tribool parsed_ok = false;
39+
typedef request_parser<tags::default_string> request_parser_type;
40+
typedef boost::iterator_range<std::string::const_iterator> range_type;
41+
range_type result_range;
42+
43+
std::string valid_http_method = "GET";
44+
fusion::tie(parsed_ok, result_range) = p.parse_until(
45+
request_parser_type::method_done
46+
, valid_http_method);
47+
BOOST_CHECK_EQUAL(parsed_ok, true);
48+
BOOST_CHECK(!boost::empty(result_range));
49+
}

0 commit comments

Comments
 (0)