Skip to content

Commit 377385c

Browse files
committed
Inching towards an implementation that can do things really asynchronously.
1 parent 0be19a5 commit 377385c

File tree

1 file changed

+34
-4
lines changed

1 file changed

+34
-4
lines changed

boost/network/protocol/http/impl/http_async_connection.hpp

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
// http://www.boost.org/LICENSE_1_0.txt)
99

1010
#include <boost/thread/future.hpp>
11+
#include <boost/throw_exception.hpp>
1112
#include <boost/cstdint.hpp>
1213

1314
namespace boost { namespace network { namespace http { namespace impl {
@@ -22,6 +23,7 @@ namespace boost { namespace network { namespace http { namespace impl {
2223
{
2324
typedef async_connection_base<Tag,version_major,version_minor> base;
2425
typedef typename base::resolver_type resolver_type;
26+
typedef typename base::resolver_base::resolver_iterator resolver_iterator;
2527
typedef typename base::resolver_base::resolver_iterator_pair resolver_iterator_pair;
2628
typedef typename base::response response;
2729
typedef typename base::string_type string_type;
@@ -56,19 +58,46 @@ namespace boost { namespace network { namespace http { namespace impl {
5658
boost::bind(
5759
&http_async_connection<Tag,version_major,version_minor>::handle_resolved,
5860
http_async_connection<Tag,version_major,version_minor>::shared_from_this(),
61+
port(request),
5962
_1, _2)));
6063

6164
return temp;
6265
}
6366

6467
private:
65-
void handle_resolved(boost::system::error_code & ec, resolver_iterator_pair endpoint_range) {
66-
if (!ec) {
67-
async_connect(); //FIXME -- wire the correct parameters
68+
void handle_resolved(boost::uint16_t port, boost::system::error_code const & ec, resolver_iterator_pair endpoint_range) {
69+
resolver_iterator iter = boost::begin(endpoint_range);
70+
if (!ec && !boost::empty(endpoint_range)) {
71+
boost::asio::ip::tcp::endpoint endpoint(
72+
iter->endpoint().address(),
73+
port
74+
);
75+
socket_.reset(new boost::asio::ip::tcp::socket(
76+
resolver_->get_io_service()));
77+
socket_->async_connect(
78+
endpoint,
79+
request_strand_->wrap(
80+
boost::bind(
81+
&http_async_connection<Tag,version_major,version_minor>::handle_connected,
82+
http_async_connection<Tag,version_major,version_minor>::shared_from_this(),
83+
std::make_pair(++iter, resolver_iterator()),
84+
boost::asio::placeholders::error
85+
)));
86+
} else {
87+
boost::system::system_error error(
88+
ec ? ec : boost::asio::error::host_not_found
89+
);
90+
version_promise.set_exception(boost::copy_exception(error));
91+
status_promise.set_exception(boost::copy_exception(error));
92+
status_message_promise.set_exception(boost::copy_exception(error));
93+
headers_promise.set_exception(boost::copy_exception(error));
94+
source_promise.set_exception(boost::copy_exception(error));
95+
destination_promise.set_exception(boost::copy_exception(error));
96+
body_promise.set_exception(boost::copy_exception(error));
6897
}
6998
}
7099

71-
void handle_connected() {
100+
void handle_connected(resolver_iterator_pair endpoint_range, boost::system::error_code const & ec) {
72101
if (!ec) {
73102
async_send(); //FIXME -- wire the correct parameters
74103
}
@@ -102,6 +131,7 @@ namespace boost { namespace network { namespace http { namespace impl {
102131
resolve_function resolve_;
103132
bool follow_redirect_;
104133
boost::shared_ptr<boost::asio::io_service::strand> request_strand_;
134+
boost::shared_ptr<boost::asio::ip::tcp::socket> socket_;
105135
boost::promise<string_type> version_promise;
106136
boost::promise<boost::uint16_t> status_promise;
107137
boost::promise<string_type> status_message_promise;

0 commit comments

Comments
 (0)