@@ -131,12 +131,14 @@ namespace boost { namespace network { namespace http { namespace impl {
131
131
132
132
this ->method = method;
133
133
134
- resolve_ (resolver_, host (request), port (request),
134
+ boost::uint16_t port_ = port (request);
135
+
136
+ resolve_ (resolver_, host (request), port_,
135
137
request_strand_->wrap (
136
138
boost::bind (
137
139
&http_async_connection<Tag,version_major,version_minor>::handle_resolved,
138
140
http_async_connection<Tag,version_major,version_minor>::shared_from_this (),
139
- port (request) ,
141
+ port_ ,
140
142
_1, _2)));
141
143
return temp;
142
144
}
@@ -335,7 +337,7 @@ namespace boost { namespace network { namespace http { namespace impl {
335
337
}
336
338
337
339
void handle_received_status (boost::system::error_code const & ec, size_t bytes_transferred) {
338
- if (!ec) {
340
+ if (!ec || ec == boost::asio::error::eof ) {
339
341
this ->parse_status ();
340
342
} else {
341
343
boost::system::system_error error (ec);
@@ -384,7 +386,7 @@ namespace boost { namespace network { namespace http { namespace impl {
384
386
}
385
387
386
388
void handle_received_status_message (boost::system::error_code const & ec, size_t bytes_transferred) {
387
- if (!ec) {
389
+ if (!ec || ec == boost::asio::error::eof ) {
388
390
this ->parse_status_message ();
389
391
} else {
390
392
boost::system::system_error error (ec);
@@ -396,6 +398,43 @@ namespace boost { namespace network { namespace http { namespace impl {
396
398
}
397
399
}
398
400
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_type headers_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
+
399
438
void parse_headers () {
400
439
logic::tribool parsed_ok;
401
440
typename boost::iterator_range<typename buffer_type::const_iterator> result_range;
@@ -408,6 +447,7 @@ namespace boost { namespace network { namespace http { namespace impl {
408
447
headers_string.append (boost::begin (result_range), boost::end (result_range));
409
448
typename buffer_type::const_iterator end = part.end ();
410
449
std::copy (boost::end (result_range), end, part.begin ());
450
+ this ->parse_headers_real (headers_string);
411
451
this ->parse_body (std::distance (boost::end (result_range), end));
412
452
} else if (parsed_ok == false ) {
413
453
std::runtime_error error (" Invalid header part." );
@@ -425,7 +465,7 @@ namespace boost { namespace network { namespace http { namespace impl {
425
465
}
426
466
427
467
void handle_received_headers (boost::system::error_code const & ec, size_t bytes_transferred) {
428
- if (!ec) {
468
+ if (!ec || ec == boost::asio::error::eof ) {
429
469
this ->parse_headers ();
430
470
} else {
431
471
boost::system::system_error error (ec);
0 commit comments