@@ -225,6 +225,21 @@ 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+ boost::bind (
233+ callback
234+ , input
235+ ,boost::system::error_code ()
236+ ,std::distance (new_start, data_end)
237+ , async_connection<Tag,Handler>::shared_from_this ())
238+ );
239+ new_start = read_buffer_.begin ();
240+ return ;
241+ }
242+
228243socket ().async_read_some (
229244asio::buffer (read_buffer_)
230245 , strand.wrap (
@@ -245,9 +260,13 @@ namespace boost { namespace network { namespace http {
245260
246261void wrap_read_handler (read_callback_function callback, boost::system::error_codeconst & ec, std::size_t bytes_transferred) {
247262if (ec) error_encountered = in_place<boost::system::system_error>(ec);
263+ buffer_type::const_iterator data_start = read_buffer_.begin ()
264+ ,data_end = read_buffer_.begin ();
265+ std::advance (data_end, bytes_transferred);
248266thread_pool ().post (
249267boost::bind (
250268 callback
269+ ,boost::make_iterator_range (data_start, data_end)
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,12 @@ 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 = read_buffer_.begin ();
338+ std::advance (data_end, bytes_transferred);
318339switch (state) {
319340case method:
320341 input_range =boost::make_iterator_range (
321- new_start,read_buffer_. end () );
342+ new_start,data_end );
322343fusion::tie (parsed_ok, result_range) = parser.parse_until (
323344 request_parser_type::method_done, input_range);
324345if (!parsed_ok) {
@@ -341,7 +362,7 @@ namespace boost { namespace network { namespace http {
341362 }
342363case uri:
343364 input_range =boost::make_iterator_range (
344- new_start,read_buffer_. end () );
365+ new_start,data_end );
345366fusion::tie (parsed_ok, result_range) = parser.parse_until (
346367 request_parser_type::uri_done,
347368 input_range);
@@ -365,7 +386,7 @@ namespace boost { namespace network { namespace http {
365386 }
366387case version:
367388 input_range =boost::make_iterator_range (
368- new_start,read_buffer_. end () );
389+ new_start,data_end );
369390fusion::tie (parsed_ok, result_range) = parser.parse_until (
370391 request_parser_type::version_done,
371392 input_range);
@@ -388,6 +409,7 @@ namespace boost { namespace network { namespace http {
388409 request_.http_version_major = fusion::get<0 >(version_pair);
389410 request_.http_version_minor = fusion::get<1 >(version_pair);
390411 new_start =boost::end (result_range);
412+ partial_parsed.clear ();
391413 }else {
392414 partial_parsed.append (
393415boost::begin (result_range),
@@ -398,7 +420,7 @@ namespace boost { namespace network { namespace http {
398420 }
399421case headers:
400422 input_range =boost::make_iterator_range (
401- new_start,read_buffer_. end () );
423+ new_start,data_end );
402424fusion::tie (parsed_ok, result_range) = parser.parse_until (
403425 request_parser_type::headers_done,
404426 input_range);
@@ -409,7 +431,6 @@ namespace boost { namespace network { namespace http {
409431 partial_parsed.append (
410432boost::begin (result_range),
411433boost::end (result_range));
412- trim (partial_parsed);
413434parse_headers (partial_parsed, request_.headers );
414435 new_start =boost::end (result_range);
415436thread_pool ().post (
@@ -479,9 +500,10 @@ namespace boost { namespace network { namespace http {
479500 *(
480501 +(alnum|(punct-' :' ))
481502 >>lit (" :" )
482- >> +(alnum|space|punct)
503+ >> +(( alnum|space|punct) - ' \r ' - ' \n ' )
483504 >>lit (" \r\n " )
484505 )
506+ >>lit (" \r\n " )
485507 , container
486508 );
487509 }