@@ -225,6 +225,23 @@ namespace boost { namespace network { namespace http {
225225
226226void read (read_callback_function callback) {
227227if (error_encountered)boost::throw_exception (boost::system::system_error (*error_encountered));
228+ if (new_start != read_buffer_.begin ())
229+ {
230+ input_range input =boost::make_iterator_range (new_start, read_buffer_.end ());
231+ thread_pool ().post (
232+ strand.wrap (
233+ boost::bind (
234+ callback
235+ , input
236+ ,boost::system::error_code ()
237+ , data_end - new_start
238+ , async_connection<Tag,Handler>::shared_from_this ())
239+ )
240+ );
241+ new_start = read_buffer_.begin ();
242+ return ;
243+ }
244+
228245socket ().async_read_some (
229246asio::buffer (read_buffer_)
230247 , strand.wrap (
@@ -248,6 +265,8 @@ namespace boost { namespace network { namespace http {
248265thread_pool ().post (
249266boost::bind (
250267 callback
268+ ,boost::make_iterator_range (read_buffer_.begin ()
269+ ,read_buffer_.begin () + bytes_transferred)
251270 , ec
252271 , bytes_transferred
253272 , async_connection<Tag,Handler>::shared_from_this ()));
@@ -277,7 +296,7 @@ namespace boost { namespace network { namespace http {
277296status_t status;
278297 request_parser_type parser;
279298 request request_;
280- buffer_type::iterator new_start;
299+ buffer_type::iterator new_start, data_end ;
281300 string_type partial_parsed;
282301 optional<boost::system::system_error> error_encountered;
283302 pending_actions_list pending_actions;
@@ -315,10 +334,11 @@ namespace boost { namespace network { namespace http {
315334if (!ec) {
316335 logic::tribool parsed_ok;
317336 iterator_range<buffer_type::iterator> result_range, input_range;
337+ data_end = new_start + bytes_transferred;
318338switch (state) {
319339case method:
320340 input_range =boost::make_iterator_range (
321- new_start,read_buffer_. end () );
341+ new_start,data_end );
322342fusion::tie (parsed_ok, result_range) = parser.parse_until (
323343 request_parser_type::method_done, input_range);
324344if (!parsed_ok) {
@@ -341,7 +361,7 @@ namespace boost { namespace network { namespace http {
341361 }
342362case uri:
343363 input_range =boost::make_iterator_range (
344- new_start,read_buffer_. end () );
364+ new_start,data_end );
345365fusion::tie (parsed_ok, result_range) = parser.parse_until (
346366 request_parser_type::uri_done,
347367 input_range);
@@ -365,7 +385,7 @@ namespace boost { namespace network { namespace http {
365385 }
366386case version:
367387 input_range =boost::make_iterator_range (
368- new_start,read_buffer_. end () );
388+ new_start,data_end );
369389fusion::tie (parsed_ok, result_range) = parser.parse_until (
370390 request_parser_type::version_done,
371391 input_range);
@@ -399,7 +419,7 @@ namespace boost { namespace network { namespace http {
399419 }
400420case headers:
401421 input_range =boost::make_iterator_range (
402- new_start,read_buffer_. end () );
422+ new_start,data_end );
403423fusion::tie (parsed_ok, result_range) = parser.parse_until (
404424 request_parser_type::headers_done,
405425 input_range);