26#ifndef ROUTING_BASIC_PROTOCOL_SPLICER_INCLUDED 
   27#define ROUTING_BASIC_PROTOCOL_SPLICER_INCLUDED 
   42#include <openssl/ssl.h>   
   69      return "change-cipher-spec";
 
   99  [[nodiscard]] 
virtual std::vector<std::pair<std::string, std::string>>
 
  107template <
class Protocol>
 
  110#ifdef NET_TS_HAS_UNIX_SOCKET 
  125template <
class Protocol>
 
  144    return sock_.release().and_then(
 
  150          if (!assign_res) 
return assign_res;
 
  159                  std::function<
void(std::error_code ec, 
size_t transferred)>
 
  160                      completion)
 override {
 
  162                    std::move(completion));
 
  166                  std::function<
void(std::error_code ec, 
size_t transferred)>
 
  167                      completion)
 override {
 
  168    if (
sock_.native_non_blocking()) {
 
  175                                          transferred = *write_res]() {
 
  176          completion({}, transferred);
 
  181      const auto ec = write_res.error();
 
  187                                          ec]() { completion(ec, 0); });
 
  195                     std::move(completion));
 
  199      std::function<
void(std::error_code ec)> completion)
 override {
 
  204      std::function<
void(std::error_code ec)> completion)
 override {
 
  209      std::function<
void(std::error_code ec)> completion)
 override {
 
  213  [[nodiscard]] 
bool is_open()
 const override { 
return sock_.is_open(); }
 
  217    return sock_.native_handle();
 
  221    return sock_.close();
 
  225    return sock_.cancel();
 
  230    return sock_.shutdown(st);
 
  233  [[nodiscard]] std::string 
endpoint()
 const override {
 
  241  template <
class GettableSocketOption>
 
  243      GettableSocketOption &opt)
 const {
 
  244    return sock_.get_option(opt);
 
  261template <
class Protocol>
 
  269  [[nodiscard]] std::vector<std::pair<std::string, std::string>>
 
  287#ifdef NET_TS_HAS_UNIX_SOCKET 
  316                          std::unique_ptr<RoutingConnectionBase> routing_conn,
 
  318                          std::unique_ptr<ProtocolStateBase> state)
 
  328                          std::unique_ptr<RoutingConnectionBase> routing_conn,
 
  330                          std::unique_ptr<ProtocolStateBase> state)
 
  339  [[nodiscard]] std::vector<std::pair<std::string, std::string>>
 
  348    conn_ = std::move(conn);
 
  356  template <
class Func>
 
  365                      [
this, func = std::forward<Func>(func)](
 
  366                          std::error_code ec, 
size_t transferred) {
 
  367                        if (ec == std::error_code()) {
 
  368                          channel_->view_sync_raw();
 
  371                        func(ec, transferred);
 
  380  template <
class Func>
 
  382    conn_->async_send(channel_->send_buffer(), std::forward<Func>(func));
 
  390  template <
class Func>
 
  392    conn_->async_wait_send(std::forward<Func>(func));
 
  395  template <
class Func>
 
  397    conn_->async_wait_error(std::forward<Func>(func));
 
  406  [[nodiscard]] 
bool is_open()
 const { 
return conn_ && conn_->is_open(); }
 
  409    return conn_->native_handle();
 
  416    return conn_->close();
 
  424    return conn_->shutdown(st);
 
  428    if (!is_open()) 
return "";
 
  430    return conn_->endpoint();
 
  435    return routing_conn_->reset_error_count(blocked_endpoints);
 
  440    return routing_conn_->increment_error_count(blocked_endpoints);
 
  444    if (!conn_) 
return {};
 
  446    return conn_->cancel();
 
  452    return protocol_.get();
 
  455  std::unique_ptr<ConnectionBase> &
connection() { 
return conn_; }
 
  464    return conn_->is_secure_transport() || channel_->ssl();
 
  469  std::unique_ptr<ConnectionBase> 
conn_;
 
  491  template <
class Func>
 
  496  template <
class Func>
 
  501  template <
class Func>
 
  506  template <
class Func>
 
  511  template <
class Func>
 
  516  template <
class Func>
 
  557      const auto flush_res = 
channel->flush_from_recv_buf();
 
  558      if (!flush_res) 
return flush_res.get_unexpected();
 
  561    if (!
channel->tls_init_is_finished()) {
 
  562      const auto res = 
channel->tls_accept();
 
  566        const auto flush_res = 
channel->flush_to_send_buf();
 
  568          const auto ec = flush_res.error();
 
  570            return flush_res.get_unexpected();
 
  576        return res.get_unexpected();
 
std::string tls_content_type_to_string(TlsContentType v)
Definition: basic_protocol_splicer.h:66
 
TlsContentType
Definition: basic_protocol_splicer.h:58
 
basic connection which wraps a net-ts Protocol.
Definition: basic_protocol_splicer.h:126
 
stdx::expected< void, std::error_code > set_io_context(net::io_context &new_ctx) override
Definition: basic_protocol_splicer.h:139
 
stdx::expected< void, std::error_code > get_option(GettableSocketOption &opt) const
Definition: basic_protocol_splicer.h:242
 
stdx::expected< void, std::error_code > close() override
Definition: basic_protocol_splicer.h:220
 
void async_wait_error(std::function< void(std::error_code ec)> completion) override
Definition: basic_protocol_splicer.h:208
 
std::string endpoint() const override
Definition: basic_protocol_splicer.h:233
 
void async_wait_recv(std::function< void(std::error_code ec)> completion) override
Definition: basic_protocol_splicer.h:203
 
net::impl::socket::native_handle_type native_handle() const override
Definition: basic_protocol_splicer.h:215
 
void async_recv(recv_buffer_type &buf, std::function< void(std::error_code ec, size_t transferred)> completion) override
Definition: basic_protocol_splicer.h:158
 
stdx::expected< void, std::error_code > cancel() override
Definition: basic_protocol_splicer.h:224
 
bool is_open() const override
Definition: basic_protocol_splicer.h:213
 
socket_type sock_
Definition: basic_protocol_splicer.h:257
 
typename protocol_type::socket socket_type
Definition: basic_protocol_splicer.h:129
 
BasicConnection(socket_type sock, endpoint_type ep)
Definition: basic_protocol_splicer.h:134
 
bool is_secure_transport() const override
check if the underlying transport is secure.
Definition: basic_protocol_splicer.h:252
 
net::io_context & io_ctx() override
Definition: basic_protocol_splicer.h:137
 
endpoint_type ep_
Definition: basic_protocol_splicer.h:258
 
stdx::expected< void, std::error_code > shutdown(net::socket_base::shutdown_type st) override
Definition: basic_protocol_splicer.h:228
 
void async_send(recv_buffer_type &buf, std::function< void(std::error_code ec, size_t transferred)> completion) override
Definition: basic_protocol_splicer.h:165
 
void async_wait_send(std::function< void(std::error_code ec)> completion) override
Definition: basic_protocol_splicer.h:198
 
typename protocol_type::endpoint endpoint_type
Definition: basic_protocol_splicer.h:130
 
Definition: blocked_endpoints.h:34
 
uint64_t increment_error_count(const net::ip::tcp::endpoint &endpoint)
increments the error count of an endpoint.
Definition: blocked_endpoints.cc:45
 
uint64_t reset_error_count(const net::ip::tcp::endpoint &endpoint)
resets error counter for an endpoint.
Definition: blocked_endpoints.cc:58
 
SSL aware socket buffers.
Definition: channel.h:64
 
virtual base-class of BasicConnection.
Definition: connection_base.h:42
 
std::vector< uint8_t, default_init_allocator< uint8_t > > recv_buffer_type
Definition: connection_base.h:47
 
splices two connections together.
Definition: basic_protocol_splicer.h:484
 
void async_send_client(Func &&func)
Definition: basic_protocol_splicer.h:512
 
void async_client_wait_error(Func &&func)
Definition: basic_protocol_splicer.h:517
 
TlsSwitchableConnection client_conn_
Definition: basic_protocol_splicer.h:584
 
void async_send_server(Func &&func)
Definition: basic_protocol_splicer.h:502
 
const TlsSwitchableConnection & server_conn() const
Definition: basic_protocol_splicer.h:529
 
void async_wait_send_server(Func &&func)
Definition: basic_protocol_splicer.h:492
 
Channel * server_channel()
Definition: basic_protocol_splicer.h:547
 
void async_recv_server(Func &&func)
Definition: basic_protocol_splicer.h:497
 
const Channel * client_channel() const
Definition: basic_protocol_splicer.h:543
 
Channel * client_channel()
Definition: basic_protocol_splicer.h:541
 
void async_recv_client(Func &&func)
Definition: basic_protocol_splicer.h:507
 
stdx::expected< void, std::error_code > tls_accept()
accept a TLS connection from the client_channel_.
Definition: basic_protocol_splicer.h:552
 
TlsSwitchableConnection & client_conn()
Definition: basic_protocol_splicer.h:521
 
SslMode dest_ssl_mode() const
Definition: basic_protocol_splicer.h:537
 
SslMode source_ssl_mode() const
Definition: basic_protocol_splicer.h:533
 
ProtocolSplicerBase(TlsSwitchableConnection client_conn, TlsSwitchableConnection server_conn)
Definition: basic_protocol_splicer.h:486
 
TlsSwitchableConnection server_conn_
Definition: basic_protocol_splicer.h:585
 
TlsSwitchableConnection & server_conn()
Definition: basic_protocol_splicer.h:527
 
const TlsSwitchableConnection & client_conn() const
Definition: basic_protocol_splicer.h:523
 
Definition: basic_protocol_splicer.h:291
 
virtual ~ProtocolStateBase()=default
 
Definition: protocol.h:33
 
Definition: basic_protocol_splicer.h:95
 
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:262
 
typename protocol_type::endpoint endpoint_type
Definition: basic_protocol_splicer.h:265
 
std::vector< std::pair< std::string, std::string > > initial_connection_attributes() const override
Definition: basic_protocol_splicer.h:270
 
uint64_t increment_error_count(BlockedEndpoints &blocked_endpoints) override
Definition: basic_protocol_splicer.h:278
 
RoutingConnection(endpoint_type ep)
Definition: basic_protocol_splicer.h:267
 
endpoint_type ep_
Definition: basic_protocol_splicer.h:283
 
uint64_t reset_error_count(BlockedEndpoints &blocked_endpoints) override
Definition: basic_protocol_splicer.h:274
 
a Connection that can be switched to TLS.
Definition: basic_protocol_splicer.h:306
 
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:327
 
stdx::expected< void, std::error_code > shutdown(net::socket_base::shutdown_type st) const
Definition: basic_protocol_splicer.h:419
 
std::unique_ptr< ProtocolStateBase > protocol_
Definition: basic_protocol_splicer.h:478
 
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:315
 
void async_send(Func &&func)
async send data from the channel's send buffer to the connection.
Definition: basic_protocol_splicer.h:381
 
void assign_connection(std::unique_ptr< ConnectionBase > conn)
assign a low-level connection.
Definition: basic_protocol_splicer.h:347
 
std::unique_ptr< RoutingConnectionBase > routing_conn_
Definition: basic_protocol_splicer.h:470
 
bool is_secure_transport() const
check if the channel is secure.
Definition: basic_protocol_splicer.h:463
 
void async_wait_error(Func &&func)
Definition: basic_protocol_splicer.h:396
 
std::string endpoint() const
Definition: basic_protocol_splicer.h:427
 
stdx::expected< void, std::error_code > close() const
Definition: basic_protocol_splicer.h:412
 
const Channel * channel() const
Definition: basic_protocol_splicer.h:402
 
void async_recv(Func &&func)
async receive data from connection into the channel's receive buffer.
Definition: basic_protocol_splicer.h:357
 
SslMode ssl_mode_
Definition: basic_protocol_splicer.h:472
 
const ProtocolStateBase * protocol() const
Definition: basic_protocol_splicer.h:451
 
Channel * channel()
Definition: basic_protocol_splicer.h:400
 
void async_wait_send(Func &&func)
async wait until connection allows to send data.
Definition: basic_protocol_splicer.h:391
 
uint64_t reset_error_count(BlockedEndpoints &blocked_endpoints)
Definition: basic_protocol_splicer.h:433
 
std::vector< std::pair< std::string, std::string > > initial_connection_attributes() const
Definition: basic_protocol_splicer.h:340
 
std::unique_ptr< ConnectionBase > & connection()
Definition: basic_protocol_splicer.h:455
 
net::impl::socket::native_handle_type native_handle() const
Definition: basic_protocol_splicer.h:408
 
std::unique_ptr< Channel > channel_
Definition: basic_protocol_splicer.h:475
 
bool is_open() const
Definition: basic_protocol_splicer.h:406
 
uint64_t increment_error_count(BlockedEndpoints &blocked_endpoints)
Definition: basic_protocol_splicer.h:438
 
static constexpr size_t kRecvBufferSize
Definition: basic_protocol_splicer.h:313
 
ProtocolStateBase * protocol()
Definition: basic_protocol_splicer.h:449
 
std::unique_ptr< ConnectionBase > conn_
Definition: basic_protocol_splicer.h:469
 
SslMode ssl_mode() const
Definition: basic_protocol_splicer.h:404
 
stdx::expected< void, std::error_code > cancel()
Definition: basic_protocol_splicer.h:443
 
Definition: basic_protocol_splicer.h:83
 
SslMode ssl_mode() const
Definition: basic_protocol_splicer.h:89
 
SslMode ssl_mode_
Definition: basic_protocol_splicer.h:92
 
std::function< SSL_CTX *(const std::string &id)> ssl_ctx_gettor_type
Definition: basic_protocol_splicer.h:85
 
TlsSwitchable(SslMode ssl_mode)
Definition: basic_protocol_splicer.h:87
 
Definition: io_context.h:61
 
executor_type get_executor() noexcept
Definition: io_context.h:1093
 
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:944
 
#define harness_assert(COND)
Improved assert()
Definition: harness_assert.h:37
 
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:43
 
static std::string to_string(const LEX_STRING &str)
Definition: lex_string.h:50
 
static MYSQL * sock
Definition: mysqlcheck.cc:56
 
Definition: buf0block_hint.cc:30
 
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: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
 
dynamic_vector_buffer< T, Allocator > dynamic_buffer(std::vector< T, Allocator > &vec) noexcept
Definition: buffer.h:663
 
auto defer(CompletionToken &&token)
Definition: executor.h:804
 
std::enable_if_t< is_const_buffer_sequence< ConstBufferSequence >::value, stdx::expected< size_t, std::error_code > > write(SyncWriteStream &stream, const ConstBufferSequence &buffers)
Definition: buffer.h:992
 
std::enable_if_t< is_dynamic_buffer< DynamicBuffer >::value, void > async_read(AsyncReadStream &stream, DynamicBuffer &&b, CompletionCondition completion_condition, CompletionToken &&token)
Definition: buffer.h:928
 
std::error_condition make_error_condition(net::stream_errc e) noexcept
Definition: buffer.h:107
 
std::enable_if_t< is_dynamic_buffer< DynamicBuffer >::value, void > async_write(AsyncWriteStream &stream, DynamicBuffer &&b, CompletionCondition cond, CompletionToken &&token)
Definition: buffer.h:1074
 
Definition: gcs_xcom_synode.h:64
 
constexpr auto make_unexpected(E &&e) -> unexpected< std::decay_t< E > >
Definition: expected.h:125
 
std::basic_ostringstream< char, std::char_traits< char >, ut::allocator< char > > ostringstream
Specialization of basic_ostringstream which uses ut::allocator.
Definition: ut0new.h:2875
 
static void swap(String &a, String &b) noexcept
Definition: sql_string.h:642
 
SslMode
Definition: ssl_mode.h:29
 
Definition: basic_protocol_splicer.h:108
 
unsigned long id[MAX_DEAD]
Definition: xcom_base.cc:510