@@ -131,12 +131,14 @@ namespace boost { namespace network { namespace http { namespace impl {
131131
132132this ->method = method;
133133
134- resolve_ (resolver_,host (request),port (request),
134+ boost::uint16_t port_ =port (request);
135+
136+ resolve_ (resolver_,host (request), port_,
135137 request_strand_->wrap (
136138boost::bind (
137139 &http_async_connection<Tag,version_major,version_minor>::handle_resolved,
138140 http_async_connection<Tag,version_major,version_minor>::shared_from_this (),
139- port (request) ,
141+ port_ ,
140142 _1, _2)));
141143return temp;
142144 }
@@ -335,7 +337,7 @@ namespace boost { namespace network { namespace http { namespace impl {
335337 }
336338
337339void handle_received_status (boost::system::error_codeconst & ec,size_t bytes_transferred) {
338- if (!ec) {
340+ if (!ec || ec == boost::asio::error::eof ) {
339341this ->parse_status ();
340342 }else {
341343 boost::system::system_errorerror (ec);
@@ -384,7 +386,7 @@ namespace boost { namespace network { namespace http { namespace impl {
384386 }
385387
386388void handle_received_status_message (boost::system::error_codeconst & ec,size_t bytes_transferred) {
387- if (!ec) {
389+ if (!ec || ec == boost::asio::error::eof ) {
388390this ->parse_status_message ();
389391 }else {
390392 boost::system::system_errorerror (ec);
@@ -396,6 +398,43 @@ namespace boost { namespace network { namespace http { namespace impl {
396398 }
397399 }
398400
401+ void parse_headers_real (string_type & headers_part) {
402+ typename boost::iterator_range<typename string_type::const_iterator>
403+ input_range =boost::make_iterator_range (headers_part)
404+ , result_range;
405+ logic::tribool parsed_ok;
406+ response_parser_typeheaders_parser (response_parser_type::http_header_line_done);
407+ typename headers_container<Tag>::type headers;
408+ std::pair<string_type,string_type> header_pair;
409+ while (!boost::empty (input_range)) {
410+ fusion::tie (parsed_ok, result_range) = headers_parser.parse_until (
411+ response_parser_type::http_header_colon
412+ , input_range);
413+ if (headers_parser.state () != response_parser_type::http_header_colon)break ;
414+ header_pair.first =string_type (
415+ boost::begin (result_range),
416+ boost::end (result_range));
417+ input_range.advance_begin (boost::distance (result_range));
418+ fusion::tie (parsed_ok, result_range) = headers_parser.parse_until (
419+ response_parser_type::http_header_line_done
420+ , input_range);
421+ header_pair.second =string_type (
422+ boost::begin (result_range),
423+ boost::end (result_range));
424+ input_range.advance_begin (boost::distance (result_range));
425+
426+ trim (header_pair.first );
427+ if (header_pair.first .size () >1 ) {
428+ header_pair.first .erase (
429+ header_pair.first .size () -1
430+ );
431+ }
432+ trim (header_pair.second );
433+ headers.insert (header_pair);
434+ }
435+ headers_promise.set_value (headers);
436+ }
437+
399438void parse_headers () {
400439 logic::tribool parsed_ok;
401440typename boost::iterator_range<typename buffer_type::const_iterator> result_range;
@@ -408,6 +447,7 @@ namespace boost { namespace network { namespace http { namespace impl {
408447 headers_string.append (boost::begin (result_range),boost::end (result_range));
409448typename buffer_type::const_iterator end = part.end ();
410449std::copy (boost::end (result_range), end, part.begin ());
450+ this ->parse_headers_real (headers_string);
411451this ->parse_body (std::distance (boost::end (result_range), end));
412452 }else if (parsed_ok ==false ) {
413453 std::runtime_errorerror (" Invalid header part." );
@@ -425,7 +465,7 @@ namespace boost { namespace network { namespace http { namespace impl {
425465 }
426466
427467void handle_received_headers (boost::system::error_codeconst & ec,size_t bytes_transferred) {
428- if (!ec) {
468+ if (!ec || ec == boost::asio::error::eof ) {
429469this ->parse_headers ();
430470 }else {
431471 boost::system::system_errorerror (ec);