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