@@ -227,6 +227,21 @@ namespace boost { namespace network { namespace http {
227227
228228void read (read_callback_function callback) {
229229if (error_encountered)boost::throw_exception (boost::system::system_error (*error_encountered));
230+ if (new_start != read_buffer_.begin ())
231+ {
232+ input_range input =boost::make_iterator_range (new_start, read_buffer_.end ());
233+ thread_pool ().post (
234+ boost::bind (
235+ callback
236+ , input
237+ ,boost::system::error_code ()
238+ ,std::distance (new_start, data_end)
239+ , async_connection<Tag,Handler>::shared_from_this ())
240+ );
241+ new_start = read_buffer_.begin ();
242+ return ;
243+ }
244+
230245socket ().async_read_some (
231246asio::buffer (read_buffer_)
232247 , strand.wrap (
@@ -247,9 +262,13 @@ namespace boost { namespace network { namespace http {
247262
248263void wrap_read_handler (read_callback_function callback, boost::system::error_codeconst & ec, std::size_t bytes_transferred) {
249264if (ec) error_encountered = in_place<boost::system::system_error>(ec);
265+ buffer_type::const_iterator data_start = read_buffer_.begin ()
266+ ,data_end = read_buffer_.begin ();
267+ std::advance (data_end, bytes_transferred);
250268thread_pool ().post (
251269boost::bind (
252270 callback
271+ ,boost::make_iterator_range (data_start, data_end)
253272 , ec
254273 , bytes_transferred
255274 , async_connection<Tag,Handler>::shared_from_this ()));
@@ -279,7 +298,7 @@ namespace boost { namespace network { namespace http {
279298status_t status;
280299 request_parser_type parser;
281300 request request_;
282- buffer_type::iterator new_start;
301+ buffer_type::iterator new_start, data_end ;
283302 string_type partial_parsed;
284303 optional<boost::system::system_error> error_encountered;
285304 pending_actions_list pending_actions;
@@ -317,10 +336,12 @@ namespace boost { namespace network { namespace http {
317336if (!ec) {
318337 logic::tribool parsed_ok;
319338 iterator_range<buffer_type::iterator> result_range, input_range;
339+ data_end = read_buffer_.begin ();
340+ std::advance (data_end, bytes_transferred);
320341switch (state) {
321342case method:
322343 input_range =boost::make_iterator_range (
323- new_start,read_buffer_. end () );
344+ new_start,data_end );
324345fusion::tie (parsed_ok, result_range) = parser.parse_until (
325346 request_parser_type::method_done, input_range);
326347if (!parsed_ok) {
@@ -343,7 +364,7 @@ namespace boost { namespace network { namespace http {
343364 }
344365case uri:
345366 input_range =boost::make_iterator_range (
346- new_start,read_buffer_. end () );
367+ new_start,data_end );
347368fusion::tie (parsed_ok, result_range) = parser.parse_until (
348369 request_parser_type::uri_done,
349370 input_range);
@@ -367,7 +388,7 @@ namespace boost { namespace network { namespace http {
367388 }
368389case version:
369390 input_range =boost::make_iterator_range (
370- new_start,read_buffer_. end () );
391+ new_start,data_end );
371392fusion::tie (parsed_ok, result_range) = parser.parse_until (
372393 request_parser_type::version_done,
373394 input_range);
@@ -391,7 +412,7 @@ namespace boost { namespace network { namespace http {
391412 }
392413case headers:
393414 input_range =boost::make_iterator_range (
394- new_start,read_buffer_. end () );
415+ new_start,data_end );
395416fusion::tie (parsed_ok, result_range) = parser.parse_until (
396417 request_parser_type::headers_done,
397418 input_range);