@@ -253,8 +253,7 @@ namespace boost { namespace network { namespace http { namespace impl {
253253 version.append (boost::begin (result_range),boost::end (result_range));
254254algorithm::trim (version);
255255 version_promise.set_value (version);
256- typename buffer_type::const_iterator end = part.end ();
257- std::copy (boost::end (result_range), end, part.begin ());
256+ part_begin =boost::end (result_range);
258257this ->parse_status ();
259258 }else if (parsed_ok ==false ) {
260259 std::runtime_errorerror (" Invalid Version Part." );
@@ -267,9 +266,10 @@ namespace boost { namespace network { namespace http { namespace impl {
267266 body_promise.set_exception (boost::copy_exception (error));
268267 }else {
269268 partial_parsed.append (
270- part. begin (),
271- part. end ()
269+ boost:: begin (result_range ),
270+ boost:: end (result_range )
272271 );
272+ part_begin = part.begin ();
273273boost::asio::async_read (
274274 *socket_,
275275boost::asio::mutable_buffers_1 (part.c_array (), part.size ()),
@@ -298,19 +298,20 @@ namespace boost { namespace network { namespace http { namespace impl {
298298
299299void parse_status () {
300300 logic::tribool parsed_ok;
301- typename boost::iterator_range<typename buffer_type::const_iterator> result_range;
301+ typename buffer_type::const_iterator part_end = part.end ();
302+ typename boost::iterator_range<typename buffer_type::const_iterator> result_range,
303+ input_range =boost::make_iterator_range (part_begin, part_end);
302304fusion::tie (parsed_ok, result_range) = response_parser_.parse_until (
303305 response_parser_type::http_status_done,
304- part );
306+ input_range );
305307if (parsed_ok ==true ) {
306308 string_type status;
307309std::swap (status, partial_parsed);
308310 status.append (boost::begin (result_range),boost::end (result_range));
309311trim (status);
310312 boost::uint16_t status_int = lexical_cast<boost::uint16_t >(status);
311313 status_promise.set_value (status_int);
312- typename buffer_type::const_iterator end = part.end ();
313- std::copy (boost::end (result_range), end, part.begin ());
314+ part_begin =boost::end (result_range);
314315this ->parse_status_message ();
315316 }else if (parsed_ok ==false ) {
316317 std::runtime_errorerror (" Invalid status part." );
@@ -321,7 +322,11 @@ namespace boost { namespace network { namespace http { namespace impl {
321322 destination_promise.set_exception (boost::copy_exception (error));
322323 body_promise.set_exception (boost::copy_exception (error));
323324 }else {
324- partial_parsed.append (part.begin (), part.end ());
325+ partial_parsed.append (
326+ boost::begin (result_range),
327+ boost::end (result_range)
328+ );
329+ part_begin = part.begin ();
325330boost::asio::async_read (*socket_,
326331boost::asio::mutable_buffers_1 (part.c_array (), part.size ()),
327332 request_strand_->wrap (
@@ -348,18 +353,19 @@ namespace boost { namespace network { namespace http { namespace impl {
348353
349354void parse_status_message () {
350355 logic::tribool parsed_ok;
351- typename boost::iterator_range<typename buffer_type::const_iterator> result_range;
356+ typename buffer_type::const_iterator part_end = part.end ();
357+ typename boost::iterator_range<typename buffer_type::const_iterator> result_range,
358+ input_range =boost::make_iterator_range (part_begin, part_end);
352359fusion::tie (parsed_ok, result_range) = response_parser_.parse_until (
353360 response_parser_type::http_status_message_done,
354- part );
361+ input_range );
355362if (parsed_ok ==true ) {
356363 string_type status_message;
357364std::swap (status_message, partial_parsed);
358365 status_message.append (boost::begin (result_range),boost::end (result_range));
359366algorithm::trim (status_message);
360367 status_message_promise.set_value (status_message);
361- typename buffer_type::const_iterator end = part.end ();
362- std::copy (boost::end (result_range), end, part.c_array ());
368+ part_begin =boost::end (result_range);
363369this ->parse_headers ();
364370 }else if (parsed_ok ==false ) {
365371 std::runtime_errorerror (" Invalid status message part." );
@@ -369,7 +375,10 @@ namespace boost { namespace network { namespace http { namespace impl {
369375 destination_promise.set_exception (boost::copy_exception (error));
370376 body_promise.set_exception (boost::copy_exception (error));
371377 }else {
372- partial_parsed.append (part.begin (), part.end ());
378+ partial_parsed.append (
379+ boost::begin (result_range),
380+ boost::end (result_range));
381+ part_begin = part.begin ();
373382boost::asio::async_read (
374383 *socket_,
375384boost::asio::mutable_buffers_1 (part.c_array (), part.size ()),
@@ -433,22 +442,24 @@ namespace boost { namespace network { namespace http { namespace impl {
433442
434443void parse_headers () {
435444 logic::tribool parsed_ok;
436- typename boost::iterator_range<typename buffer_type::const_iterator> result_range;
445+ typename buffer_type::const_iterator part_end = part.end ();
446+ typename boost::iterator_range<typename buffer_type::const_iterator> result_range,
447+ input_range =boost::make_iterator_range (part_begin, part_end);
437448fusion::tie (parsed_ok, result_range) = response_parser_.parse_until (
438449 response_parser_type::http_headers_done,
439- part );
450+ input_range );
440451if (parsed_ok ==true ) {
441452 string_type headers_string;
442453std::swap (headers_string, partial_parsed);
443454 headers_string.append (boost::begin (result_range),boost::end (result_range));
444- typename buffer_type::const_iterator end = part.end ();
445- std::copy (boost::end (result_range), end, part.begin ());
455+ part_begin =boost::end (result_range);
446456this ->parse_headers_real (headers_string);
447- this ->parse_body (std::distance (boost::end (result_range),end ));
457+ this ->parse_body (std::distance (boost::end (result_range),part_end ));
448458 }else if (parsed_ok ==false ) {
449459 std::runtime_errorerror (" Invalid header part." );
450460 }else {
451- partial_parsed.append (part.begin (), part.end ());
461+ partial_parsed.append (boost::begin (result_range),boost::end (result_range));
462+ part_begin = part.begin ();
452463boost::asio::async_read (
453464 *socket_,
454465boost::asio::mutable_buffers_1 (part.c_array (), part.size ()),
@@ -473,7 +484,8 @@ namespace boost { namespace network { namespace http { namespace impl {
473484 }
474485
475486void parse_body (size_t bytes) {
476- partial_parsed.append (part.begin (), bytes);
487+ partial_parsed.append (part_begin, bytes);
488+ part_begin = part.begin ();
477489boost::asio::async_read (*socket_,boost::asio::mutable_buffers_1 (part.c_array (), part.size ()),
478490 request_strand_->wrap (
479491boost::bind (
@@ -524,6 +536,7 @@ namespace boost { namespace network { namespace http { namespace impl {
524536 string_type command_string_;
525537 response_parser_type response_parser_;
526538 buffer_type part;
539+ typename buffer_type::const_iterator part_begin;
527540 string_type partial_parsed;
528541 string_type method;
529542 };