25#ifndef ROUTING_BASIC_PROTOCOL_SPLICER_INCLUDED
26#define ROUTING_BASIC_PROTOCOL_SPLICER_INCLUDED
41#include <openssl/ssl.h>
68 return "change-cipher-spec";
98 [[nodiscard]]
virtual std::vector<std::pair<std::string, std::string>>
106template <
class Protocol>
109#ifdef NET_TS_HAS_UNIX_SOCKET
124template <
class Protocol>
143 return sock_.release().and_then(
149 if (!assign_res)
return assign_res;
158 std::function<
void(std::error_code ec,
size_t transferred)>
159 completion)
override {
161 std::move(completion));
165 std::function<
void(std::error_code ec,
size_t transferred)>
166 completion)
override {
167 if (
sock_.native_non_blocking()) {
174 transferred = *write_res]() {
175 completion({}, transferred);
180 const auto ec = write_res.error();
186 ec]() { completion(ec, 0); });
194 std::move(completion));
198 std::function<
void(std::error_code ec)> completion)
override {
203 std::function<
void(std::error_code ec)> completion)
override {
208 std::function<
void(std::error_code ec)> completion)
override {
212 [[nodiscard]]
bool is_open()
const override {
return sock_.is_open(); }
216 return sock_.native_handle();
220 return sock_.close();
224 return sock_.cancel();
229 return sock_.shutdown(st);
232 [[nodiscard]] std::string
endpoint()
const override {
240 template <
class GettableSocketOption>
242 GettableSocketOption &opt)
const {
243 return sock_.get_option(opt);
260template <
class Protocol>
268 [[nodiscard]] std::vector<std::pair<std::string, std::string>>
286#ifdef NET_TS_HAS_UNIX_SOCKET
315 std::unique_ptr<RoutingConnectionBase> routing_conn,
317 std::unique_ptr<ProtocolStateBase> state)
327 std::unique_ptr<RoutingConnectionBase> routing_conn,
329 std::unique_ptr<ProtocolStateBase> state)
338 [[nodiscard]] std::vector<std::pair<std::string, std::string>>
347 conn_ = std::move(conn);
355 template <
class Func>
364 [
this, func = std::forward<Func>(func)](
365 std::error_code ec,
size_t transferred) {
366 channel_->view_sync_raw();
368 func(ec, transferred);
377 template <
class Func>
379 conn_->async_send(
channel_->send_buffer(), std::forward<Func>(func));
387 template <
class Func>
389 conn_->async_wait_send(std::forward<Func>(func));
392 template <
class Func>
394 conn_->async_wait_error(std::forward<Func>(func));
406 return conn_->native_handle();
413 return conn_->close();
421 return conn_->shutdown(st);
427 return conn_->endpoint();
437 return routing_conn_->increment_error_count(blocked_endpoints);
441 if (!
conn_)
return {};
443 return conn_->cancel();
466 std::unique_ptr<ConnectionBase>
conn_;
488 template <
class Func>
493 template <
class Func>
498 template <
class Func>
503 template <
class Func>
508 template <
class Func>
513 template <
class Func>
554 const auto flush_res =
channel->flush_from_recv_buf();
555 if (!flush_res)
return flush_res.get_unexpected();
558 if (!
channel->tls_init_is_finished()) {
559 const auto res =
channel->tls_accept();
563 const auto flush_res =
channel->flush_to_send_buf();
565 const auto ec = flush_res.error();
567 return flush_res.get_unexpected();
573 return res.get_unexpected();
std::string tls_content_type_to_string(TlsContentType v)
Definition: basic_protocol_splicer.h:65
TlsContentType
Definition: basic_protocol_splicer.h:57
basic connection which wraps a net-ts Protocol.
Definition: basic_protocol_splicer.h:125
stdx::expected< void, std::error_code > set_io_context(net::io_context &new_ctx) override
Definition: basic_protocol_splicer.h:138
stdx::expected< void, std::error_code > get_option(GettableSocketOption &opt) const
Definition: basic_protocol_splicer.h:241
stdx::expected< void, std::error_code > close() override
Definition: basic_protocol_splicer.h:219
void async_wait_error(std::function< void(std::error_code ec)> completion) override
Definition: basic_protocol_splicer.h:207
std::string endpoint() const override
Definition: basic_protocol_splicer.h:232
void async_wait_recv(std::function< void(std::error_code ec)> completion) override
Definition: basic_protocol_splicer.h:202
net::impl::socket::native_handle_type native_handle() const override
Definition: basic_protocol_splicer.h:214
void async_recv(recv_buffer_type &buf, std::function< void(std::error_code ec, size_t transferred)> completion) override
Definition: basic_protocol_splicer.h:157
stdx::expected< void, std::error_code > cancel() override
Definition: basic_protocol_splicer.h:223
bool is_open() const override
Definition: basic_protocol_splicer.h:212
socket_type sock_
Definition: basic_protocol_splicer.h:256
typename protocol_type::socket socket_type
Definition: basic_protocol_splicer.h:128
BasicConnection(socket_type sock, endpoint_type ep)
Definition: basic_protocol_splicer.h:133
bool is_secure_transport() const override
check if the underlying transport is secure.
Definition: basic_protocol_splicer.h:251
net::io_context & io_ctx() override
Definition: basic_protocol_splicer.h:136
endpoint_type ep_
Definition: basic_protocol_splicer.h:257
stdx::expected< void, std::error_code > shutdown(net::socket_base::shutdown_type st) override
Definition: basic_protocol_splicer.h:227
void async_send(recv_buffer_type &buf, std::function< void(std::error_code ec, size_t transferred)> completion) override
Definition: basic_protocol_splicer.h:164
void async_wait_send(std::function< void(std::error_code ec)> completion) override
Definition: basic_protocol_splicer.h:197
typename protocol_type::endpoint endpoint_type
Definition: basic_protocol_splicer.h:129
Definition: blocked_endpoints.h:33
uint64_t increment_error_count(const net::ip::tcp::endpoint &endpoint)
increments the error count of an endpoint.
Definition: blocked_endpoints.cc:44
uint64_t reset_error_count(const net::ip::tcp::endpoint &endpoint)
resets error counter for an endpoint.
Definition: blocked_endpoints.cc:57
SSL aware socket buffers.
Definition: channel.h:63
virtual base-class of BasicConnection.
Definition: connection_base.h:41
std::vector< uint8_t, default_init_allocator< uint8_t > > recv_buffer_type
Definition: connection_base.h:46
splices two connections together.
Definition: basic_protocol_splicer.h:481
void async_send_client(Func &&func)
Definition: basic_protocol_splicer.h:509
void async_client_wait_error(Func &&func)
Definition: basic_protocol_splicer.h:514
TlsSwitchableConnection client_conn_
Definition: basic_protocol_splicer.h:581
void async_send_server(Func &&func)
Definition: basic_protocol_splicer.h:499
const TlsSwitchableConnection & server_conn() const
Definition: basic_protocol_splicer.h:526
void async_wait_send_server(Func &&func)
Definition: basic_protocol_splicer.h:489
Channel * server_channel()
Definition: basic_protocol_splicer.h:544
void async_recv_server(Func &&func)
Definition: basic_protocol_splicer.h:494
const Channel * client_channel() const
Definition: basic_protocol_splicer.h:540
Channel * client_channel()
Definition: basic_protocol_splicer.h:538
void async_recv_client(Func &&func)
Definition: basic_protocol_splicer.h:504
stdx::expected< void, std::error_code > tls_accept()
accept a TLS connection from the client_channel_.
Definition: basic_protocol_splicer.h:549
TlsSwitchableConnection & client_conn()
Definition: basic_protocol_splicer.h:518
SslMode dest_ssl_mode() const
Definition: basic_protocol_splicer.h:534
SslMode source_ssl_mode() const
Definition: basic_protocol_splicer.h:530
ProtocolSplicerBase(TlsSwitchableConnection client_conn, TlsSwitchableConnection server_conn)
Definition: basic_protocol_splicer.h:483
TlsSwitchableConnection server_conn_
Definition: basic_protocol_splicer.h:582
TlsSwitchableConnection & server_conn()
Definition: basic_protocol_splicer.h:524
const TlsSwitchableConnection & client_conn() const
Definition: basic_protocol_splicer.h:520
Definition: basic_protocol_splicer.h:290
virtual ~ProtocolStateBase()=default
Definition: protocol.h:32
Definition: basic_protocol_splicer.h:94
virtual std::vector< std::pair< std::string, std::string > > initial_connection_attributes() const =0
virtual ~RoutingConnectionBase()=default
virtual uint64_t increment_error_count(BlockedEndpoints &blocked_endpoints)=0
virtual uint64_t reset_error_count(BlockedEndpoints &blocked_endpoints)=0
Definition: basic_protocol_splicer.h:261
typename protocol_type::endpoint endpoint_type
Definition: basic_protocol_splicer.h:264
std::vector< std::pair< std::string, std::string > > initial_connection_attributes() const override
Definition: basic_protocol_splicer.h:269
uint64_t increment_error_count(BlockedEndpoints &blocked_endpoints) override
Definition: basic_protocol_splicer.h:277
RoutingConnection(endpoint_type ep)
Definition: basic_protocol_splicer.h:266
endpoint_type ep_
Definition: basic_protocol_splicer.h:282
uint64_t reset_error_count(BlockedEndpoints &blocked_endpoints) override
Definition: basic_protocol_splicer.h:273
a Connection that can be switched to TLS.
Definition: basic_protocol_splicer.h:305
TlsSwitchableConnection(std::unique_ptr< ConnectionBase > conn, std::unique_ptr< RoutingConnectionBase > routing_conn, SslMode ssl_mode, std::unique_ptr< Channel > channel, std::unique_ptr< ProtocolStateBase > state)
Definition: basic_protocol_splicer.h:326
stdx::expected< void, std::error_code > shutdown(net::socket_base::shutdown_type st) const
Definition: basic_protocol_splicer.h:416
std::unique_ptr< ProtocolStateBase > protocol_
Definition: basic_protocol_splicer.h:475
TlsSwitchableConnection(std::unique_ptr< ConnectionBase > conn, std::unique_ptr< RoutingConnectionBase > routing_conn, SslMode ssl_mode, std::unique_ptr< ProtocolStateBase > state)
Definition: basic_protocol_splicer.h:314
void async_send(Func &&func)
async send data from the channel's send buffer to the connection.
Definition: basic_protocol_splicer.h:378
void assign_connection(std::unique_ptr< ConnectionBase > conn)
assign a low-level connection.
Definition: basic_protocol_splicer.h:346
std::unique_ptr< RoutingConnectionBase > routing_conn_
Definition: basic_protocol_splicer.h:467
bool is_secure_transport() const
check if the channel is secure.
Definition: basic_protocol_splicer.h:460
void async_wait_error(Func &&func)
Definition: basic_protocol_splicer.h:393
std::string endpoint() const
Definition: basic_protocol_splicer.h:424
stdx::expected< void, std::error_code > close() const
Definition: basic_protocol_splicer.h:409
const Channel * channel() const
Definition: basic_protocol_splicer.h:399
void async_recv(Func &&func)
async receive data from connection into the channel's receive buffer.
Definition: basic_protocol_splicer.h:356
SslMode ssl_mode_
Definition: basic_protocol_splicer.h:469
const ProtocolStateBase * protocol() const
Definition: basic_protocol_splicer.h:448
Channel * channel()
Definition: basic_protocol_splicer.h:397
void async_wait_send(Func &&func)
async wait until connection allows to send data.
Definition: basic_protocol_splicer.h:388
uint64_t reset_error_count(BlockedEndpoints &blocked_endpoints)
Definition: basic_protocol_splicer.h:430
std::vector< std::pair< std::string, std::string > > initial_connection_attributes() const
Definition: basic_protocol_splicer.h:339
std::unique_ptr< ConnectionBase > & connection()
Definition: basic_protocol_splicer.h:452
net::impl::socket::native_handle_type native_handle() const
Definition: basic_protocol_splicer.h:405
std::unique_ptr< Channel > channel_
Definition: basic_protocol_splicer.h:472
bool is_open() const
Definition: basic_protocol_splicer.h:403
uint64_t increment_error_count(BlockedEndpoints &blocked_endpoints)
Definition: basic_protocol_splicer.h:435
static constexpr size_t kRecvBufferSize
Definition: basic_protocol_splicer.h:312
ProtocolStateBase * protocol()
Definition: basic_protocol_splicer.h:446
std::unique_ptr< ConnectionBase > conn_
Definition: basic_protocol_splicer.h:466
SslMode ssl_mode() const
Definition: basic_protocol_splicer.h:401
stdx::expected< void, std::error_code > cancel()
Definition: basic_protocol_splicer.h:440
Definition: basic_protocol_splicer.h:82
SslMode ssl_mode() const
Definition: basic_protocol_splicer.h:88
SslMode ssl_mode_
Definition: basic_protocol_splicer.h:91
std::function< SSL_CTX *(const std::string &id)> ssl_ctx_gettor_type
Definition: basic_protocol_splicer.h:84
TlsSwitchable(SslMode ssl_mode)
Definition: basic_protocol_splicer.h:86
Definition: io_context.h:60
executor_type get_executor() noexcept
Definition: io_context.h:1079
static constexpr wait_type wait_read
Definition: socket.h:167
shutdown_type
Definition: socket.h:171
static constexpr wait_type wait_write
Definition: socket.h:168
static constexpr wait_type wait_error
Definition: socket.h:169
Definition: expected.h:943
#define harness_assert(COND)
Improved assert()
Definition: harness_assert.h:36
std::vector< std::pair< std::string, std::string > > initial_connection_attributes(const net::ip::tcp::endpoint &ep)
TCP/IP socket related connection attributes.
Definition: initial_connection_attributes.h:42
static std::string to_string(const LEX_STRING &str)
Definition: lex_string.h:49
static MYSQL * sock
Definition: mysqlcheck.cc:56
Definition: buf0block_hint.cc:29
Unique_ptr< T, std::nullptr_t > make_unique(size_t size)
In-place constructs a new unique pointer with no specific allocator and with array type T.
std::error_code make_error_code(DynamicLoaderErrc ec)
make error_code from a DynamicLoaderErrc.
Definition: dynamic_loader.cc:78
stdx::expected< native_handle_type, error_type > socket(int family, int sock_type, int protocol)
Definition: socket.h:62
int native_handle_type
Definition: socket_constants.h:50
dynamic_vector_buffer< T, Allocator > dynamic_buffer(std::vector< T, Allocator > &vec) noexcept
Definition: buffer.h:660
auto defer(CompletionToken &&token)
Definition: executor.h:786
std::enable_if_t< is_const_buffer_sequence_v< ConstBufferSequence >, stdx::expected< size_t, std::error_code > > write(SyncWriteStream &stream, const ConstBufferSequence &buffers)
Definition: buffer.h:990
std::enable_if_t< is_dynamic_buffer< DynamicBuffer >::value, void > async_read(AsyncReadStream &stream, DynamicBuffer &&b, CompletionCondition completion_condition, CompletionToken &&token)
Definition: buffer.h:926
std::enable_if_t< is_const_buffer_sequence_v< ConstBufferSequence >, void > async_write(AsyncWriteStream &stream, const ConstBufferSequence &buffers, CompletionCondition cond, CompletionToken &&token)
Definition: buffer.h:1073
std::error_condition make_error_condition(net::stream_errc e) noexcept
Definition: buffer.h:106
Definition: varlen_sort.h:174
constexpr auto make_unexpected(E &&e) -> unexpected< std::decay_t< E > >
Definition: expected.h:124
std::basic_ostringstream< char, std::char_traits< char >, ut::allocator< char > > ostringstream
Specialization of basic_ostringstream which uses ut::allocator.
Definition: ut0new.h:2869
SslMode
Definition: ssl_mode.h:28
Definition: basic_protocol_splicer.h:107
void swap(const varlen_element &a, const varlen_element &b)
Definition: varlen_sort.h:65
unsigned long id[MAX_DEAD]
Definition: xcom_base.cc:509