D++ (DPP)
C++ Discord API Bot Library
dpp::ssl_client Class Reference

Implements a simple non-blocking SSL stream client. More...

+ Inheritance diagram for dpp::ssl_client:
+ Collaboration diagram for dpp::ssl_client:

Public Member Functions

uint64_t get_bytes_out ()
 Get the bytes out objectGet total bytes sent. More...
 
uint64_t get_bytes_in ()
 Get total bytes received. More...
 
std::string get_cipher ()
 Get SSL cipher name. More...
 
 ssl_client (const std::string &_hostname, const std::string &_port="443", bool plaintext_downgrade=false, bool reuse=false)
 Connect to a specified host and port. Throws std::runtime_error on fatal error. More...
 
void read_loop ()
 Nonblocking I/O loop. More...
 
virtual ~ssl_client ()
 Destroy the ssl_client object. More...
 
virtual bool handle_buffer (std::string &buffer)
 Handle input from the input buffer. This function will be called until all data in the buffer has been processed and the buffer is empty. More...
 
virtual void write (const std::string_view data)
 Write to the output buffer. More...
 
virtual void close ()
 Close socket connection. More...
 
virtual void log (dpp::loglevel severity, const std::string &msg) const
 Log a message. More...
 

Public Attributes

socket_callback_t custom_readable_fd
 Attaching an additional file descriptor to this function will send notifications when there is data to read. More...
 
socket_callback_t custom_writeable_fd
 Attaching an additional file descriptor to this function will send notifications when you are able to write to the socket. More...
 
socket_notification_t custom_readable_ready
 This event will be called when you can read from the custom fd. More...
 
socket_notification_t custom_writeable_ready
 This event will be called when you can write to a custom fd. More...
 
bool keepalive
 True if we are keeping the connection alive after it has finished. More...
 

Protected Member Functions

virtual void one_second_timer ()
 Called every second. More...
 
virtual void connect ()
 Start SSL connection and connect to TCP endpoint. More...
 

Protected Attributes

std::string buffer
 Input buffer received from socket. More...
 
std::string obuffer
 Output buffer for sending to socket. More...
 
bool nonblocking
 True if in nonblocking mode. The socket switches to nonblocking mode once ReadLoop is called. More...
 
dpp::socket sfd
 Raw file descriptor of connection. More...
 
openssl_connection * ssl
 Openssl opaque contexts. More...
 
std::string cipher
 SSL cipher in use. More...
 
time_t last_tick
 For timers. More...
 
std::string hostname
 Hostname connected to. More...
 
std::string port
 Port connected to. More...
 
uint64_t bytes_out
 Bytes out. More...
 
uint64_t bytes_in
 Bytes in. More...
 
bool plaintext
 True for a plain text connection. More...
 
bool make_new
 True if we are establishing a new connection, false if otherwise. More...
 

Detailed Description

Implements a simple non-blocking SSL stream client.

Note
although the design is non-blocking the run() method will execute in an infinite loop until the socket disconnects. This is intended to be run within a std::thread.

Constructor & Destructor Documentation

◆ ssl_client()

dpp::ssl_client::ssl_client ( const std::string &  _hostname,
const std::string &  _port = "443",
bool  plaintext_downgrade = false,
bool  reuse = false 
)

Connect to a specified host and port. Throws std::runtime_error on fatal error.

Parameters
_hostnameThe hostname to connect to
_portthe Port number to connect to
plaintext_downgradeSet to true to connect using plaintext only, without initialising SSL.
reuseAttempt to reuse previous connections for this hostname and port, if available Note that no Discord endpoints will function when downgraded. This option is provided only for connection to non-Discord addresses such as within dpp::cluster::request().
Exceptions
dpp::exceptionFailed to initialise connection

◆ ~ssl_client()

virtual dpp::ssl_client::~ssl_client ( )
virtual

Destroy the ssl_client object.

Member Function Documentation

◆ close()

virtual void dpp::ssl_client::close ( )
virtual

Close socket connection.

Reimplemented in dpp::https_client, and dpp::websocket_client.

◆ connect()

virtual void dpp::ssl_client::connect ( )
protectedvirtual

Start SSL connection and connect to TCP endpoint.

Exceptions
dpp::exceptionFailed to initialise connection

Reimplemented in dpp::https_client, and dpp::websocket_client.

◆ get_bytes_in()

uint64_t dpp::ssl_client::get_bytes_in ( )

Get total bytes received.

Returns
uint64_t bytes received

◆ get_bytes_out()

uint64_t dpp::ssl_client::get_bytes_out ( )

Get the bytes out objectGet total bytes sent.

Returns
uint64_t bytes sent

◆ get_cipher()

std::string dpp::ssl_client::get_cipher ( )

Get SSL cipher name.

Returns
std::string ssl cipher name

◆ handle_buffer()

virtual bool dpp::ssl_client::handle_buffer ( std::string &  buffer)
virtual

Handle input from the input buffer. This function will be called until all data in the buffer has been processed and the buffer is empty.

Parameters
bufferthe buffer content. Will be modified removing any processed front elements
Returns
bool True if the socket should remain connected

Reimplemented in dpp::https_client, and dpp::websocket_client.

◆ log()

virtual void dpp::ssl_client::log ( dpp::loglevel  severity,
const std::string &  msg 
) const
virtual

Log a message.

Parameters
severityseverity of log message
msgLog message to send

Reimplemented in dpp::discord_voice_client, and dpp::discord_client.

◆ one_second_timer()

virtual void dpp::ssl_client::one_second_timer ( )
protectedvirtual

◆ read_loop()

void dpp::ssl_client::read_loop ( )

Nonblocking I/O loop.

Exceptions
std::exceptionAny std::exception (or derivative) thrown from read_loop() causes reconnection of the shard

◆ write()

virtual void dpp::ssl_client::write ( const std::string_view  data)
virtual

Write to the output buffer.

Parameters
dataData to be written to the buffer.
Note
The data may not be written immediately and may be written at a later time to the socket.

Reimplemented in dpp::websocket_client.

Member Data Documentation

◆ buffer

std::string dpp::ssl_client::buffer
protected

Input buffer received from socket.

◆ bytes_in

uint64_t dpp::ssl_client::bytes_in
protected

Bytes in.

◆ bytes_out

uint64_t dpp::ssl_client::bytes_out
protected

Bytes out.

◆ cipher

std::string dpp::ssl_client::cipher
protected

SSL cipher in use.

◆ custom_readable_fd

socket_callback_t dpp::ssl_client::custom_readable_fd

Attaching an additional file descriptor to this function will send notifications when there is data to read.

NOTE: Only hook this if you NEED it as it can increase CPU usage of the thread! Returning -1 means that you don't want to be notified.

◆ custom_readable_ready

socket_notification_t dpp::ssl_client::custom_readable_ready

This event will be called when you can read from the custom fd.

◆ custom_writeable_fd

socket_callback_t dpp::ssl_client::custom_writeable_fd

Attaching an additional file descriptor to this function will send notifications when you are able to write to the socket.

NOTE: Only hook this if you NEED it as it can increase CPU usage of the thread! You should toggle this to -1 when you do not have anything to write otherwise it'll keep triggering repeatedly (it is level triggered).

◆ custom_writeable_ready

socket_notification_t dpp::ssl_client::custom_writeable_ready

This event will be called when you can write to a custom fd.

◆ hostname

std::string dpp::ssl_client::hostname
protected

Hostname connected to.

◆ keepalive

bool dpp::ssl_client::keepalive

True if we are keeping the connection alive after it has finished.

◆ last_tick

time_t dpp::ssl_client::last_tick
protected

For timers.

◆ make_new

bool dpp::ssl_client::make_new
protected

True if we are establishing a new connection, false if otherwise.

◆ nonblocking

bool dpp::ssl_client::nonblocking
protected

True if in nonblocking mode. The socket switches to nonblocking mode once ReadLoop is called.

◆ obuffer

std::string dpp::ssl_client::obuffer
protected

Output buffer for sending to socket.

◆ plaintext

bool dpp::ssl_client::plaintext
protected

True for a plain text connection.

◆ port

std::string dpp::ssl_client::port
protected

Port connected to.

◆ sfd

dpp::socket dpp::ssl_client::sfd
protected

Raw file descriptor of connection.

◆ ssl

openssl_connection* dpp::ssl_client::ssl
protected

Openssl opaque contexts.

D++ Library version 9.0.13D++ Library version 9.0.12D++ Library version 9.0.11D++ Library version 9.0.10D++ Library version 9.0.9D++ Library version 9.0.8D++ Library version 9.0.7D++ Library version 9.0.6D++ Library version 9.0.5D++ Library version 9.0.4D++ Library version 9.0.3D++ Library version 9.0.2D++ Library version 9.0.1D++ Library version 9.0.0D++ Library version 1.0.2D++ Library version 1.0.1D++ Library version 1.0.0