26#ifndef ROUTER_CONNECTION_POOL_CONNECTION_BASE_INCLUDED
27#define ROUTER_CONNECTION_POOL_CONNECTION_BASE_INCLUDED
32#include <system_error>
42#include <openssl/ssl.h>
60 std::vector<uint8_t, default_init_allocator<uint8_t>>;
66 std::function<
void(std::error_code ec,
size_t transferred)>) = 0;
70 std::function<
void(std::error_code ec,
size_t transferred)>) = 0;
76 [[nodiscard]]
virtual bool is_open()
const = 0;
85 [[nodiscard]]
virtual std::string
endpoint()
const = 0;
95template <
class Protocol>
98#ifdef NET_TS_HAS_UNIX_SOCKET
113template <
class Protocol>
132 return sock_.release().and_then(
138 if (!assign_res)
return assign_res;
147 std::function<
void(std::error_code ec,
size_t transferred)>
148 completion)
override {
150 std::move(completion));
154 std::function<
void(std::error_code ec,
size_t transferred)>
155 completion)
override {
156 if (
sock_.native_non_blocking()) {
163 transferred = *write_res]() {
164 completion({}, transferred);
169 const auto ec = write_res.error();
175 ec]() { completion(ec, 0); });
183 std::move(completion));
187 std::function<
void(std::error_code ec)> completion)
override {
192 std::function<
void(std::error_code ec)> completion)
override {
197 std::function<
void(std::error_code ec)> completion)
override {
201 [[nodiscard]]
bool is_open()
const override {
return sock_.is_open(); }
205 return sock_.native_handle();
209 return sock_.close();
213 return sock_.cancel();
218 return sock_.shutdown(st);
221 [[nodiscard]] std::string
endpoint()
const override {
229 template <
class GettableSocketOption>
231 GettableSocketOption &opt)
const {
232 return sock_.get_option(opt);
250#ifdef NET_TS_HAS_UNIX_SOCKET
298 conn_ = std::move(conn);
303 SSL_set_info_callback(
ssl,
nullptr);
304 SSL_set_msg_callback_arg(
ssl,
nullptr);
317 template <
class Func>
325 [
this, func = std::forward<Func>(func)](
326 std::error_code ec,
size_t transferred) {
327 if (ec == std::error_code()) {
328 channel_.view_sync_raw();
331 func(ec, transferred);
340 template <
class Func>
342 conn_->async_send(channel_.send_buffer(), std::forward<Func>(func));
350 template <
class Func>
352 conn_->async_wait_send(std::forward<Func>(func));
355 template <
class Func>
357 conn_->async_wait_error(std::forward<Func>(func));
366 [[nodiscard]]
bool is_open()
const {
return conn_ && conn_->is_open(); }
369 return conn_->native_handle();
376 return conn_->close();
384 return conn_->shutdown(st);
388 if (!is_open())
return "";
390 return conn_->endpoint();
394 if (!conn_)
return {};
396 return conn_->cancel();
405 std::unique_ptr<ConnectionBase> &
connection() {
return conn_; }
407 const std::unique_ptr<ConnectionBase> &
connection()
const {
return conn_; }
416 return conn_->is_secure_transport() || (channel_.ssl() !=
nullptr);
421 std::unique_ptr<ConnectionBase>
conn_;
basic connection which wraps a net-ts Protocol.
Definition: connection_base.h:114
stdx::expected< void, std::error_code > set_io_context(net::io_context &new_ctx) override
Definition: connection_base.h:127
stdx::expected< void, std::error_code > get_option(GettableSocketOption &opt) const
Definition: connection_base.h:230
stdx::expected< void, std::error_code > close() override
Definition: connection_base.h:208
void async_wait_error(std::function< void(std::error_code ec)> completion) override
Definition: connection_base.h:196
std::string endpoint() const override
Definition: connection_base.h:221
void async_wait_recv(std::function< void(std::error_code ec)> completion) override
Definition: connection_base.h:191
net::impl::socket::native_handle_type native_handle() const override
Definition: connection_base.h:203
void async_recv(recv_buffer_type &buf, std::function< void(std::error_code ec, size_t transferred)> completion) override
Definition: connection_base.h:146
stdx::expected< void, std::error_code > cancel() override
Definition: connection_base.h:212
bool is_open() const override
Definition: connection_base.h:201
socket_type sock_
Definition: connection_base.h:245
typename protocol_type::socket socket_type
Definition: connection_base.h:117
BasicConnection(socket_type sock, endpoint_type ep)
Definition: connection_base.h:122
bool is_secure_transport() const override
check if the underlying transport is secure.
Definition: connection_base.h:240
net::io_context & io_ctx() override
Definition: connection_base.h:125
endpoint_type ep_
Definition: connection_base.h:246
stdx::expected< void, std::error_code > shutdown(net::socket_base::shutdown_type st) override
Definition: connection_base.h:216
void async_send(recv_buffer_type &buf, std::function< void(std::error_code ec, size_t transferred)> completion) override
Definition: connection_base.h:153
void async_wait_send(std::function< void(std::error_code ec)> completion) override
Definition: connection_base.h:186
typename protocol_type::endpoint endpoint_type
Definition: connection_base.h:118
SSL aware socket buffers.
Definition: channel.h:65
void view_discard_raw()
Definition: channel.cc:313
void clear()
clears all buffers.
Definition: channel.h:79
SSL * ssl() const
get access to the raw SSL handle.
Definition: channel.h:324
recv_buffer_type & recv_buffer()
buffer of data that was received from the socket.
Definition: channel.h:240
virtual base-class of BasicConnection.
Definition: connection_base.h:55
virtual void async_send(recv_buffer_type &, std::function< void(std::error_code ec, size_t transferred)>)=0
std::vector< uint8_t, default_init_allocator< uint8_t > > recv_buffer_type
Definition: connection_base.h:60
virtual void async_wait_recv(std::function< void(std::error_code ec)>)=0
virtual stdx::expected< void, std::error_code > close()=0
virtual void async_recv(recv_buffer_type &, std::function< void(std::error_code ec, size_t transferred)>)=0
virtual void async_wait_send(std::function< void(std::error_code ec)>)=0
virtual bool is_secure_transport() const =0
virtual net::impl::socket::native_handle_type native_handle() const =0
virtual net::io_context & io_ctx()=0
virtual std::string endpoint() const =0
virtual bool is_open() const =0
virtual stdx::expected< void, std::error_code > shutdown(net::socket_base::shutdown_type st)=0
virtual stdx::expected< void, std::error_code > cancel()=0
virtual stdx::expected< void, std::error_code > set_io_context(net::io_context &new_ctx)=0
virtual void async_wait_error(std::function< void(std::error_code ec)>)=0
virtual ~ConnectionBase()=default
Definition: protocol.h:33
a Connection that can be switched to TLS.
Definition: connection_base.h:265
void prepare_for_pool()
Definition: connection_base.h:301
SslMode ssl_mode_
Definition: connection_base.h:423
Channel & channel()
Definition: connection_base.h:360
std::unique_ptr< ConnectionBase > conn_
Definition: connection_base.h:421
T protocol_state_type
Definition: connection_base.h:273
bool is_secure_transport() const
check if the channel is secure.
Definition: connection_base.h:415
void async_wait_send(Func &&func)
async wait until connection allows to send data.
Definition: connection_base.h:351
std::string endpoint() const
Definition: connection_base.h:387
protocol_state_type protocol_
Definition: connection_base.h:429
protocol_state_type & protocol()
Definition: connection_base.h:399
const protocol_state_type & protocol() const
Definition: connection_base.h:401
const std::unique_ptr< ConnectionBase > & connection() const
Definition: connection_base.h:407
bool is_open() const
Definition: connection_base.h:366
void async_send(Func &&func)
async send data from the channel's send buffer to the connection.
Definition: connection_base.h:341
std::unique_ptr< ConnectionBase > & connection()
Definition: connection_base.h:405
TlsSwitchableConnection(std::unique_ptr< ConnectionBase > conn, SslMode ssl_mode, protocol_state_type state)
Definition: connection_base.h:275
void async_recv(Func &&func)
async receive data from connection into the channel's receive buffer.
Definition: connection_base.h:318
net::impl::socket::native_handle_type native_handle() const
Definition: connection_base.h:368
stdx::expected< void, std::error_code > cancel()
Definition: connection_base.h:393
void assign_connection(std::unique_ptr< ConnectionBase > conn)
assign a low-level connection.
Definition: connection_base.h:297
void async_wait_error(Func &&func)
Definition: connection_base.h:356
Channel channel_
Definition: connection_base.h:426
stdx::expected< void, std::error_code > shutdown(net::socket_base::shutdown_type st) const
Definition: connection_base.h:379
stdx::expected< void, std::error_code > close() const
Definition: connection_base.h:372
const Channel & channel() const
Definition: connection_base.h:362
static constexpr size_t kRecvBufferSize
Definition: connection_base.h:272
SslMode ssl_mode() const
Definition: connection_base.h:364
TlsSwitchableConnection(std::unique_ptr< ConnectionBase > conn, SslMode ssl_mode, Channel channel, protocol_state_type state)
Definition: connection_base.h:284
Definition: io_context.h:61
executor_type get_executor() noexcept
Definition: io_context.h:1094
static constexpr wait_type wait_read
Definition: socket.h:168
shutdown_type
Definition: socket.h:172
static constexpr wait_type wait_write
Definition: socket.h:169
static constexpr wait_type wait_error
Definition: socket.h:170
Definition: expected.h:286
#define harness_assert(COND)
Improved assert()
Definition: harness_assert.h:37
#define T
Definition: jit_executor_value.cc:373
static MYSQL * sock
Definition: mysqlcheck.cc:57
Definition: buf0block_hint.cc:30
constexpr value_type ssl
Definition: classic_protocol_constants.h:49
Protocol
Definition: protocol.h:35
std::error_code make_error_code(DynamicLoaderErrc ec)
make error_code from a DynamicLoaderErrc.
Definition: dynamic_loader.cc:79
stdx::expected< native_handle_type, error_type > socket(int family, int sock_type, int protocol)
Definition: socket.h:63
int native_handle_type
Definition: socket_constants.h:51
void async_read(AsyncReadStream &stream, DynamicBuffer &&b, CompletionCondition completion_condition, CompletionToken &&token)
Definition: buffer.h:933
stdx::expected< size_t, std::error_code > write(SyncWriteStream &stream, const ConstBufferSequence &buffers)
Definition: buffer.h:977
dynamic_vector_buffer< T, Allocator > dynamic_buffer(std::vector< T, Allocator > &vec) noexcept
Definition: buffer.h:661
auto defer(CompletionToken &&token)
Definition: executor.h:779
void async_write(AsyncWriteStream &stream, const ConstBufferSequence &buffers, CompletionCondition cond, CompletionToken &&token)
Definition: buffer.h:1066
std::error_condition make_error_condition(net::stream_errc e) noexcept
Definition: buffer.h:107
Definition: gcs_xcom_synode.h:64
unexpected(E) -> unexpected< E >
std::basic_ostringstream< char, std::char_traits< char >, ut::allocator< char > > ostringstream
Specialization of basic_ostringstream which uses ut::allocator.
Definition: ut0new.h:2872
static void swap(String &a, String &b) noexcept
Definition: sql_string.h:650
SslMode
Definition: ssl_mode.h:29
Definition: connection_base.h:96