diff --git a/include/boost/beast/http/impl/basic_parser.ipp b/include/boost/beast/http/impl/basic_parser.ipp index 66671d694b..c02554f154 100644 --- a/include/boost/beast/http/impl/basic_parser.ipp +++ b/include/boost/beast/http/impl/basic_parser.ipp @@ -172,13 +172,11 @@ loop: case state::trailer_fields: parse_fields(p, n, ec); - if(ec) - goto done; - this->on_finish_impl(ec); if(ec) goto done; state_ = state::complete; - break; + this->on_finish_impl(ec); + goto done; case state::chunk_body: parse_chunk_body(p, n, ec); @@ -221,11 +219,9 @@ put_eof(error_code& ec) ec = {}; return; } + state_ = state::complete; ec = {}; this->on_finish_impl(ec); - if(ec) - return; - state_ = state::complete; } template @@ -464,11 +460,7 @@ finish_header(error_code& ec, std::true_type) if(ec) return; if(state_ == state::complete) - { this->on_finish_impl(ec); - if(ec) - return; - } } template @@ -525,11 +517,7 @@ finish_header(error_code& ec, std::false_type) if(ec) return; if(state_ == state::complete) - { this->on_finish_impl(ec); - if(ec) - return; - } } template @@ -547,10 +535,8 @@ parse_body(char const*& p, return; if(len_ > 0) return; - this->on_finish_impl(ec); - if(ec) - return; state_ = state::complete; + this->on_finish_impl(ec); } template diff --git a/test/beast/http/basic_parser.cpp b/test/beast/http/basic_parser.cpp index a31842097a..60c5ddd972 100644 --- a/test/beast/http/basic_parser.cpp +++ b/test/beast/http/basic_parser.cpp @@ -363,6 +363,18 @@ class basic_parser_test : public beast::unit_test::suite void testCallbacks() { + parsegrind>( + "GET / HTTP/1.1\r\n" + "\r\n", + [&](test_parser const& p) + { + BEAST_EXPECT(p.got_on_begin == 1); + BEAST_EXPECT(p.got_on_field == 0); + BEAST_EXPECT(p.got_on_header == 1); + BEAST_EXPECT(p.got_on_body == 0); + BEAST_EXPECT(p.got_on_chunk == 0); + BEAST_EXPECT(p.got_on_complete == 1); + }); parsegrind>( "GET / HTTP/1.1\r\n" "User-Agent: test\r\n" @@ -378,6 +390,18 @@ class basic_parser_test : public beast::unit_test::suite BEAST_EXPECT(p.got_on_chunk == 0); BEAST_EXPECT(p.got_on_complete == 1); }); + parsegrind>( + "HTTP/1.1 100 Continue\r\n" + "\r\n", + [&](test_parser const& p) + { + BEAST_EXPECT(p.got_on_begin == 1); + BEAST_EXPECT(p.got_on_field == 0); + BEAST_EXPECT(p.got_on_header == 1); + BEAST_EXPECT(p.got_on_body == 0); + BEAST_EXPECT(p.got_on_chunk == 0); + BEAST_EXPECT(p.got_on_complete == 1); + }); parsegrind>( "HTTP/1.1 200 OK\r\n" "Server: test\r\n"