19 #ifndef IRCCD_CONNECTOR_HPP
20 #define IRCCD_CONNECTOR_HPP
30 #include <system_error>
32 #include <boost/asio.hpp>
34 #if defined(IRCCD_HAVE_SSL)
35 # include <boost/asio/ssl.hpp>
38 #include <boost/filesystem/path.hpp>
58 using handler = std::function<void (std::error_code, std::shared_ptr<stream>)>;
109 auto get_service() const noexcept -> const boost::asio::io_context&;
116 auto
get_service() noexcept -> boost::asio::io_context&;
150 boost::asio::ip::tcp::resolver resolver_;
152 std::string hostname_;
159 bool is_connecting_{
false};
162 template <
typename Handler>
177 std::string hostname,
180 bool ipv6 =
true) noexcept;
189 template <typename Socket, typename Handler>
198 template <typename Handler>
201 using boost::asio::ip::tcp;
204 resolver_.async_resolve(hostname_, port_,
handler);
206 resolver_.async_resolve(tcp::v6(), hostname_, port_,
handler);
208 resolver_.async_resolve(tcp::v4(), hostname_, port_,
handler);
212 std::string hostname,
218 , hostname_(std::move(hostname))
219 , port_(std::move(port))
223 assert(!hostname_.empty());
224 assert(!port_.empty());
225 assert(ipv4 || ipv6);
228 template <
typename Socket,
typename Handler>
232 assert(!is_connecting_);
234 is_connecting_ =
true;
237 resolve([
this, &sc,
handler] (
auto code,
auto res) {
239 is_connecting_ =
false;
248 async_connect(sc, res, [
handler] (
auto code,
auto) {
260 handler(std::move(code), nullptr);
262 handler(std::move(code), std::move(stream));
270 #if defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)
284 boost::filesystem::path path_;
287 bool is_connecting_{
false};
298 boost::filesystem::path path) noexcept;
307 template <
typename Socket,
typename Handler>
317 boost::filesystem::path path) noexcept
319 , path_(std::move(path))
323 template <
typename Socket,
typename Handler>
327 assert(!is_connecting_);
329 is_connecting_ =
true;
332 sc.async_connect({ path_.string() }, [
this,
handler] (
auto code) {
334 is_connecting_ =
false;
347 handler(std::move(code), nullptr);
349 handler(std::move(code), std::move(stream));
353 #endif // !BOOST_ASIO_HAS_LOCAL_SOCKETS
359 #if defined(IRCCD_HAVE_SSL)
366 template <
typename SocketConnector>
375 std::shared_ptr<boost::asio::ssl::context> context_;
376 SocketConnector connector_;
385 template <
typename... Args>
386 tls_connector(boost::asio::ssl::context context, Args&&... args);
394 template <
typename SocketConnector>
395 template <
typename... Args>
397 : context_(
std::make_shared<boost::asio::ssl::context>(
std::move(context)))
398 , connector_(
std::forward<Args>(args)...)
402 template <
typename SocketConnector>
405 using boost::asio::ssl::stream_base;
409 auto stream = std::make_shared<tls_stream<socket_type>>(connector_.get_service(), context_);
419 handler(std::move(code),
nullptr);
431 #if defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)
438 #endif // !BOOST_ASIO_HAS_LOCAL_SOCKETS
440 #endif // !IRCCD_HAVE_SSL
446 #endif // !IRCCD_CONNECTOR_HPP