8
8
// http://www.boost.org/LICENSE_1_0.txt)
9
9
10
10
#include < boost/thread/future.hpp>
11
+ #include < boost/throw_exception.hpp>
11
12
#include < boost/cstdint.hpp>
12
13
13
14
namespace boost { namespace network { namespace http { namespace impl {
@@ -22,6 +23,7 @@ namespace boost { namespace network { namespace http { namespace impl {
22
23
{
23
24
typedef async_connection_base<Tag,version_major,version_minor> base;
24
25
typedef typename base::resolver_type resolver_type;
26
+ typedef typename base::resolver_base::resolver_iterator resolver_iterator;
25
27
typedef typename base::resolver_base::resolver_iterator_pair resolver_iterator_pair;
26
28
typedef typename base::response response;
27
29
typedef typename base::string_type string_type;
@@ -56,19 +58,46 @@ namespace boost { namespace network { namespace http { namespace impl {
56
58
boost::bind (
57
59
&http_async_connection<Tag,version_major,version_minor>::handle_resolved,
58
60
http_async_connection<Tag,version_major,version_minor>::shared_from_this (),
61
+ port (request),
59
62
_1, _2)));
60
63
61
64
return temp;
62
65
}
63
66
64
67
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));
68
97
}
69
98
}
70
99
71
- void handle_connected () {
100
+ void handle_connected (resolver_iterator_pair endpoint_range, boost::system::error_code const & ec ) {
72
101
if (!ec) {
73
102
async_send (); // FIXME -- wire the correct parameters
74
103
}
@@ -102,6 +131,7 @@ namespace boost { namespace network { namespace http { namespace impl {
102
131
resolve_function resolve_;
103
132
bool follow_redirect_;
104
133
boost::shared_ptr<boost::asio::io_service::strand> request_strand_;
134
+ boost::shared_ptr<boost::asio::ip::tcp::socket> socket_;
105
135
boost::promise<string_type> version_promise;
106
136
boost::promise<boost::uint16_t > status_promise;
107
137
boost::promise<string_type> status_message_promise;
0 commit comments