Skip to content

Commit 3442d76

Browse files
committed
Resolver now uses asynchronous futures.
1 parent 3faaa69 commit 3442d76

File tree

6 files changed

+50
-31
lines changed

6 files changed

+50
-31
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ endif()
144144
find_package(Doxygen)
145145
if (DOXYGEN_FOUND)
146146
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
147-
add_custom_target(doc ALL
147+
add_custom_target(doc
148148
${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
149149
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
150150
COMMENT "Generating API documentation with Doxygen" VERBATIM)

http/src/http/v2/client/client.cpp

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,7 @@ namespace network {
4646
request_.set_method(method_);
4747

4848
std::future<response> response;
49-
resolver_.resolve(request_.host(), request_.port(),
50-
[&response] (const boost::system::error_code &ec,
51-
boost::iterator_range<async_resolver_delegate::resolver_iterator> resolvers) {
52-
if (ec) {
53-
return;
54-
}
55-
56-
// make TCP connection
57-
});
58-
59-
49+
auto endpoints = resolver_.resolve(request_.host(), request_.port());
6050
return response;
6151
}
6252

http/src/network/http/v2/client/connection/async_resolver_delegate.hpp

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,28 +52,35 @@ namespace network {
5252
/**
5353
* \brief Resolves a host asynchronously.
5454
*/
55-
virtual void resolve(const std::string &host, std::uint16_t port, on_resolved_fn on_resolved) {
55+
virtual std::future<resolver_iterator_range>
56+
resolve(const std::string &host, std::uint16_t port) {
5657
if (cache_resolved_) {
5758
endpoint_cache::iterator it = endpoint_cache_.find(boost::to_lower_copy(host));
5859
if (it != endpoint_cache_.end()) {
5960
boost::system::error_code ignored;
60-
on_resolved(ignored, it->second);
61-
return;
61+
promise_.set_value(it->second);
62+
return promise_.get_future();
6263
}
6364
}
6465

6566
resolver::query query(host, std::to_string(port));
6667
resolver_.async_resolve(query,
6768
resolver_strand_->wrap(
68-
[=](const boost::system::error_code &ec,
69-
resolver_iterator endpoint_iterator) {
70-
71-
auto resolvers = std::make_pair(endpoint_iterator, resolver_iterator());
72-
if (!ec && cache_resolved_) {
73-
endpoint_cache_.insert(std::make_pair(host, resolvers));
69+
[&host, this](const boost::system::error_code &ec,
70+
resolver_iterator endpoint_iterator) {
71+
if (ec) {
72+
promise_.set_value(std::make_pair(resolver_iterator(), resolver_iterator()));
73+
}
74+
else {
75+
auto resolvers = std::make_pair(endpoint_iterator, resolver_iterator());
76+
if (cache_resolved_) {
77+
endpoint_cache_.insert(std::make_pair(host, resolvers));
78+
}
79+
promise_.set_value(resolvers);
7480
}
75-
on_resolved(ec, resolvers);
7681
}));
82+
83+
return promise_.get_future();
7784
}
7885

7986
/**
@@ -87,6 +94,7 @@ namespace network {
8794

8895
typedef boost::asio::io_service::strand strand;
8996
typedef std::unordered_map<std::string, resolver_iterator_range> endpoint_cache;
97+
std::promise<resolver_iterator_range> promise_;
9098

9199
resolver resolver_;
92100
std::unique_ptr<strand> resolver_strand_;

http/src/network/http/v2/client/connection/resolver_delegate.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
#include <cstdint>
1010
#include <string>
1111
#include <functional>
12+
#include <utility>
13+
#include <future>
1214
#include <boost/asio/ip/tcp.hpp>
1315
#include <boost/range/iterator_range.hpp>
1416

@@ -27,6 +29,7 @@ namespace network {
2729
public:
2830

2931
typedef boost::asio::ip::tcp::resolver resolver;
32+
typedef boost::asio::ip::tcp::endpoint endpoint;
3033
typedef resolver::iterator resolver_iterator;
3134
typedef boost::iterator_range<resolver_iterator> resolver_iterator_range;
3235
typedef std::function<void (const boost::system::error_code &,
@@ -36,7 +39,8 @@ namespace network {
3639

3740
virtual ~resolver_delegate() noexcept { }
3841

39-
virtual void resolve(const std::string &host, std::uint16_t port, on_resolved_fn on_resolved) = 0;
42+
virtual std::future<resolver_iterator_range>
43+
resolve(const std::string &host, std::uint16_t port) = 0;
4044

4145
virtual void clear_resolved_cache() = 0;
4246

http/test/v2/features/client/async_resolver_test.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,12 @@ Describe(async_resolver) {
2222
// An HTTP server must be running on 127.0.0.1:80
2323
// maybe execute a script
2424

25-
resolver_->resolve("127.0.0.1", 80,
26-
[] (const boost::system::error_code &ec,
27-
const http::async_resolver_delegate::resolver_iterator_range &endpoints) {
28-
for (auto endpoint : endpoints) {
29-
Assert::That(endpoint.endpoint().address().to_string(), Equals("127.0.0.1"));
30-
Assert::That(endpoint.endpoint().port(), Equals(80));
31-
}
32-
});
25+
auto endpoints = resolver_->resolve("127.0.0.1", 80);
3326
io_service_->run_one();
27+
for (auto endpoint : endpoints.get()) {
28+
Assert::That(endpoint.endpoint().address().to_string(), Equals("127.0.0.1"));
29+
Assert::That(endpoint.endpoint().port(), Equals(80));
30+
}
3431
}
3532

3633
std::unique_ptr<boost::asio::io_service> io_service_;

http/test/v2/features/client/normal_connection_test.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// (See accompanying file LICENSE_1_0.txt or copy at
44
// http://www.boost.org/LICENSE_1_0.txt)
55

6+
#include <memory>
67
#include <igloo/igloo_alt.h>
78
#include <boost/asio.hpp>
89
#include "network/http/v2/client/connection/normal_connection_delegate.hpp"
@@ -11,6 +12,25 @@ using namespace igloo;
1112
using boost::asio::ip::tcp;
1213
namespace http = network::http::v2;
1314

15+
Describe(normal_http_connection) {
16+
17+
//void SetUp() {
18+
// io_service_.reset(new boost::asio::io_service);
19+
// connection_.reset(new normal_http_connection(io_service));
20+
//
21+
// // resolve endpoints
22+
//}
23+
24+
It(connects_to_localhost) {
25+
//auto ec = connection_.connect(endpoint_, "127.0.0.1");
26+
// ec
27+
}
28+
29+
std::unique_ptr<boost::asio::io_service> io_service_;
30+
std::unique_ptr<http::connection_delegate> connection_;
31+
32+
};
33+
1434
int
1535
main(int argc, char *argv[]) {
1636
return TestRunner::RunAllTests(argc, const_cast<const char **>(argv));

0 commit comments

Comments
 (0)