@@ -430,20 +430,44 @@ struct http_async_connection_pimpl : boost::enable_shared_from_this<http_async_c
430
430
placeholders::bytes_transferred)));
431
431
} else {
432
432
NETWORK_MESSAGE (" no callback provided, appending to body..." );
433
+ bool get_more = true ;
434
+ if (content_length_) {
435
+ buffer_type::const_iterator begin = this ->part .begin ();
436
+ buffer_type::const_iterator end = begin;
437
+ std::advance (end, bytes_transferred);
438
+ get_more = (end - begin) < *content_length_;
439
+ NETWORK_MESSAGE (" content_length = " << * content_length_
440
+ << " , bytes read = " << (end - begin) << " , read more = " << get_more);
441
+ }
433
442
// Here we don't have a body callback. Let's
434
443
// make sure that we deal with the remainder
435
444
// from the headers part in case we do have data
436
445
// that's still in the buffer.
437
- this ->parse_body (request_strand_.wrap (
438
- boost::bind (
439
- &this_type::handle_received_data,
440
- this_type::shared_from_this (),
441
- body,
442
- get_body,
443
- callback,
444
- placeholders::error,
445
- placeholders::bytes_transferred)),
446
- bytes_transferred);
446
+ if (get_more) {
447
+ this ->parse_body (request_strand_.wrap (
448
+ boost::bind (
449
+ &this_type::handle_received_data,
450
+ this_type::shared_from_this (),
451
+ body,
452
+ get_body,
453
+ callback,
454
+ placeholders::error,
455
+ placeholders::bytes_transferred)),
456
+ bytes_transferred);
457
+ } else {
458
+ std::string body_string;
459
+ std::swap (body_string, this ->partial_parsed );
460
+ body_string.append (
461
+ this ->part .begin ()
462
+ , bytes_transferred
463
+ );
464
+ this ->body_promise .set_value (body_string);
465
+ // TODO set the destination value somewhere!
466
+ this ->destination_promise .set_value (" " );
467
+ this ->source_promise .set_value (" " );
468
+ this ->part .assign (' \0 ' );
469
+ this ->response_parser_ .reset ();
470
+ }
447
471
}
448
472
}
449
473
return ;
@@ -709,6 +733,21 @@ struct http_async_connection_pimpl : boost::enable_shared_from_this<http_async_c
709
733
boost::trim (header_pair.second );
710
734
headers.insert (header_pair);
711
735
}
736
+ // Set content length
737
+ content_length_ = boost::none;
738
+ auto it = headers.find (" Content-Length" );
739
+ if (it != headers.end ()) {
740
+ try {
741
+ content_length_ = std::stoul (it->second );
742
+ NETWORK_MESSAGE (" Content-Length: " << *content_length_);
743
+ } catch (const std::invalid_argument&) {
744
+ NETWORK_MESSAGE (" invalid argument exception while interpreting "
745
+ << it->second << " as content length" );
746
+ } catch (const std::out_of_range&) {
747
+ NETWORK_MESSAGE (" out of range exception while interpreting "
748
+ << it->second << " as content length" );
749
+ }
750
+ }
712
751
headers_promise.set_value (headers);
713
752
}
714
753
@@ -790,6 +829,7 @@ struct http_async_connection_pimpl : boost::enable_shared_from_this<http_async_c
790
829
boost::promise<boost::uint16_t > status_promise;
791
830
boost::promise<std::string> status_message_promise;
792
831
boost::promise<std::multimap<std::string, std::string> > headers_promise;
832
+ boost::optional<size_t > content_length_;
793
833
boost::promise<std::string> source_promise;
794
834
boost::promise<std::string> destination_promise;
795
835
boost::promise<std::string> body_promise;
0 commit comments