Skip to content

Commit 58d5f94

Browse files
committed
Made async_resolver and ABC; added implementation in tcp_resolver.
1 parent 416fe04 commit 58d5f94

File tree

4 files changed

+133
-78
lines changed

4 files changed

+133
-78
lines changed

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

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#include <network/http/v2/method.hpp>
1212
#include <network/http/v2/client/request.hpp>
1313
#include <network/http/v2/client/response.hpp>
14-
#include <network/http/v2/client/connection/async_resolver.hpp>
14+
#include <network/http/v2/client/connection/tcp_resolver.hpp>
1515
#include <network/http/v2/client/connection/normal_connection.hpp>
1616

1717
namespace network {
@@ -65,8 +65,8 @@ namespace network {
6565

6666
client_options options_;
6767
boost::asio::io_service io_service_;
68-
async_resolver resolver_;
69-
normal_connection connection_;
68+
std::unique_ptr<async_resolver> resolver_;
69+
std::unique_ptr<async_connection> connection_;
7070
std::unique_ptr<boost::asio::io_service::work> sentinel_;
7171
std::thread lifetime_thread_;
7272

@@ -81,8 +81,8 @@ namespace network {
8181

8282
client::impl::impl(client_options options)
8383
: options_(options)
84-
, resolver_(io_service_, options.cache_resolved())
85-
, connection_(io_service_)
84+
, resolver_(new tcp_resolver(io_service_, options.cache_resolved()))
85+
, connection_(new normal_connection(io_service_))
8686
, sentinel_(new boost::asio::io_service::work(io_service_))
8787
, lifetime_thread_([=] () { io_service_.run(); }) {
8888

@@ -96,14 +96,12 @@ namespace network {
9696
void client::impl::connect(const boost::system::error_code &ec,
9797
tcp::resolver::iterator endpoint_iterator) {
9898
tcp::endpoint endpoint(*endpoint_iterator);
99-
std::cout << "Resolved " << endpoint << std::endl;
10099
//connection_.async_connect(endpoint,
101100
// [=] (const boost::system::error_code &ec) {
102101
// if (ec) {
103102
// return;
104103
// }
105104
//
106-
// std::cout << "Oh." << std::endl;
107105
// //response_promise_.set_value(v2::response());
108106
// //write_request(ec);
109107
// });
@@ -117,11 +115,11 @@ namespace network {
117115
return;
118116
}
119117

120-
connection_.async_write(request_,
121-
[=] (const boost::system::error_code &ec,
122-
std::size_t bytes_written) {
123-
read_response_status(ec, bytes_written);
124-
});
118+
connection_->async_write(request_,
119+
[=] (const boost::system::error_code &ec,
120+
std::size_t bytes_written) {
121+
read_response_status(ec, bytes_written);
122+
});
125123
}
126124

127125
void client::impl::read_response_status(const boost::system::error_code &ec,
@@ -132,13 +130,13 @@ namespace network {
132130
return;
133131
}
134132

135-
connection_.async_read_until(response_,
136-
"\r\n",
137-
[=] (const boost::system::error_code &ec,
138-
std::size_t bytes_read) {
139-
// fill headers
140-
read_response_headers(ec, bytes_read);
141-
});
133+
connection_->async_read_until(response_,
134+
"\r\n",
135+
[=] (const boost::system::error_code &ec,
136+
std::size_t bytes_read) {
137+
// fill headers
138+
read_response_headers(ec, bytes_read);
139+
});
142140
}
143141

144142
void client::impl::read_response_headers(const boost::system::error_code &ec,
@@ -149,12 +147,12 @@ namespace network {
149147
return;
150148
}
151149

152-
connection_.async_read_until(response_,
153-
"\r\n\r\n",
154-
[=] (const boost::system::error_code &ec,
155-
std::size_t bytes_read) {
156-
// um...
157-
});
150+
connection_->async_read_until(response_,
151+
"\r\n\r\n",
152+
[=] (const boost::system::error_code &ec,
153+
std::size_t bytes_read) {
154+
// um...
155+
});
158156
}
159157

160158
std::future<response> client::impl::do_request(method met,

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

Lines changed: 6 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,8 @@
88
#ifndef NETWORK_HTTP_V2_CLIENT_CONNECTION_ASYNC_RESOLVER_INC
99
#define NETWORK_HTTP_V2_CLIENT_CONNECTION_ASYNC_RESOLVER_INC
1010

11-
#include <stdexcept>
12-
#include <cstdint>
13-
#include <string>
14-
#include <boost/asio/io_service.hpp>
15-
#include <boost/asio/strand.hpp>
11+
#include <functional>
1612
#include <boost/asio/ip/tcp.hpp>
17-
#include <boost/exception/all.hpp>
18-
#include <network/config.hpp>
19-
#include <network/http/v2/client/connection/endpoint_cache.hpp>
2013

2114
namespace network {
2215
namespace http {
@@ -51,17 +44,14 @@ namespace network {
5144
/**
5245
* \brief Constructor.
5346
*/
54-
async_resolver(boost::asio::io_service &service, bool cache_resolved = false)
55-
: resolver_(service)
56-
, resolver_strand_(new boost::asio::io_service::strand(service))
57-
, cache_resolved_(cache_resolved) {
47+
async_resolver() {
5848

5949
}
6050

6151
/**
6252
* \brief Destructor.
6353
*/
64-
~async_resolver() noexcept {
54+
virtual ~async_resolver() noexcept {
6555

6656
}
6757

@@ -71,48 +61,13 @@ namespace network {
7161
* \param port The port number.
7262
* \param callback A callback handler.
7363
*/
74-
void async_resolve(const std::string &host, std::uint16_t port, resolve_callback handler) {
75-
if (cache_resolved_) {
76-
auto it = endpoint_cache_.find(host);
77-
if (it != endpoint_cache_.end()) {
78-
boost::system::error_code ec;
79-
handler(ec, it->second);
80-
return;
81-
}
82-
}
83-
84-
resolver::query query(host, std::to_string(port));
85-
resolver_.async_resolve(query,
86-
resolver_strand_->wrap(
87-
[&host, &handler, this](const boost::system::error_code &ec,
88-
resolver_iterator endpoint_iterator) {
89-
if (ec) {
90-
handler(ec, resolver_iterator());
91-
}
92-
else {
93-
if (cache_resolved_) {
94-
endpoint_cache_.insert(host, endpoint_iterator);
95-
}
96-
handler(ec, endpoint_iterator);
97-
}
98-
}));
99-
}
64+
virtual void async_resolve(const std::string &host, std::uint16_t port,
65+
resolve_callback handler) = 0;
10066

10167
/**
10268
* \brief Clears the cache of already resolved endpoints.
10369
*/
104-
void clear_resolved_cache() {
105-
endpoint_cache_.clear();
106-
}
107-
108-
private:
109-
110-
typedef boost::asio::io_service::strand strand;
111-
112-
resolver resolver_;
113-
std::unique_ptr<strand> resolver_strand_;
114-
bool cache_resolved_;
115-
endpoint_cache endpoint_cache_;
70+
virtual void clear_resolved_cache() = 0;
11671

11772
};
11873
} // namespace v2
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// Copyright (C) 2013 by Glyn Matthews
2+
// Copyright 2011 Dean Michael Berris <dberris@google.com>.
3+
// Copyright 2011 Google, Inc.
4+
// Distributed under the Boost Software License, Version 1.0.
5+
// (See accompanying file LICENSE_1_0.txt or copy at
6+
// http://www.boost.org/LICENSE_1_0.txt)
7+
8+
#ifndef NETWORK_HTTP_V2_CLIENT_CONNECTION_TCP_RESOLVER_INC
9+
#define NETWORK_HTTP_V2_CLIENT_CONNECTION_TCP_RESOLVER_INC
10+
11+
#include <stdexcept>
12+
#include <cstdint>
13+
#include <string>
14+
#include <boost/asio/io_service.hpp>
15+
#include <boost/asio/strand.hpp>
16+
#include <boost/asio/ip/tcp.hpp>
17+
#include <boost/exception/all.hpp>
18+
#include <network/config.hpp>
19+
#include <network/http/v2/client/connection/async_resolver.hpp>
20+
#include <network/http/v2/client/connection/endpoint_cache.hpp>
21+
22+
namespace network {
23+
namespace http {
24+
namespace v2 {
25+
/**
26+
* \class tcp_resolver network/http/v2/client/connection/tcp_resolver.hpp
27+
* \brief Resolves and maintains a cache of hosts.
28+
*/
29+
class tcp_resolver : public async_resolver {
30+
31+
tcp_resolver(const tcp_resolver &) = delete;
32+
tcp_resolver &operator = (const tcp_resolver &) = delete;
33+
34+
public:
35+
36+
using async_resolver::resolver;
37+
using async_resolver::resolver_iterator;
38+
using async_resolver::resolve_callback;
39+
40+
/**
41+
* \brief Constructor.
42+
*/
43+
tcp_resolver(boost::asio::io_service &service, bool cache_resolved = false)
44+
: resolver_(service)
45+
, resolver_strand_(new boost::asio::io_service::strand(service))
46+
, cache_resolved_(cache_resolved) {
47+
48+
}
49+
50+
/**
51+
* \brief Destructor.
52+
*/
53+
virtual ~tcp_resolver() noexcept {
54+
55+
}
56+
57+
virtual void async_resolve(const std::string &host, std::uint16_t port, resolve_callback handler) {
58+
if (cache_resolved_) {
59+
auto it = endpoint_cache_.find(host);
60+
if (it != endpoint_cache_.end()) {
61+
boost::system::error_code ec;
62+
handler(ec, it->second);
63+
return;
64+
}
65+
}
66+
67+
resolver::query query(host, std::to_string(port));
68+
resolver_.async_resolve(query,
69+
resolver_strand_->wrap(
70+
[&host, &handler, this](const boost::system::error_code &ec,
71+
resolver_iterator endpoint_iterator) {
72+
if (ec) {
73+
handler(ec, resolver_iterator());
74+
}
75+
else {
76+
if (cache_resolved_) {
77+
endpoint_cache_.insert(host, endpoint_iterator);
78+
}
79+
handler(ec, endpoint_iterator);
80+
}
81+
}));
82+
}
83+
84+
virtual void clear_resolved_cache() {
85+
endpoint_cache_.clear();
86+
}
87+
88+
private:
89+
90+
typedef boost::asio::io_service::strand strand;
91+
92+
resolver resolver_;
93+
std::unique_ptr<strand> resolver_strand_;
94+
bool cache_resolved_;
95+
endpoint_cache endpoint_cache_;
96+
97+
};
98+
} // namespace v2
99+
} // namespace http
100+
} // namespace network
101+
102+
#endif // NETWORK_HTTP_V2_CLIENT_CONNECTION_TCP_RESOLVER_INC

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include <iostream>
77
#include <igloo/igloo_alt.h>
88
#include <boost/asio.hpp>
9-
#include "network/http/v2/client/connection/async_resolver.hpp"
9+
#include "network/http/v2/client/connection/tcp_resolver.hpp"
1010

1111
using namespace igloo;
1212
using boost::asio::ip::tcp;
@@ -19,7 +19,7 @@ Describe(async_resolver) {
1919
// maybe execute a script
2020

2121
io_service_.reset(new boost::asio::io_service);
22-
resolver_.reset(new http::async_resolver(*io_service_));
22+
resolver_.reset(new http::tcp_resolver(*io_service_));
2323
}
2424

2525
It(resolves_localhost) {

0 commit comments

Comments
 (0)