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

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

#include <sslclient.h>

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

Public Member Functions

uint64_t get_bytes_out ()
 
uint64_t get_bytes_in ()
 
std::string get_cipher ()
 
 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. More...
 
virtual void write (const std::string &data)
 Write to the output buffer. More...
 
virtual void close ()
 Close SSL 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 ()
 
virtual void connect ()
 Start SSL connection and connect to TCP endpoint. More...
 

Protected Attributes

std::string buffer
 
std::string obuffer
 
bool nonblocking
 
dpp::socket sfd
 
opensslcontext * ssl
 
std::string cipher
 
time_t last_tick
 
std::string hostname
 
std::string port
 
uint64_t bytes_out
 
uint64_t bytes_in
 
bool plaintext
 
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 that 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 SSL 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

◆ get_bytes_out()

uint64_t dpp::ssl_client::get_bytes_out ( )

Get total bytes sent

◆ get_cipher()

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

Get SSL cipher name

◆ handle_buffer()

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

Handle input from the input buffer.

Parameters
bufferthe buffer content. Will be modified removing any processed front elements

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_client, and dpp::discord_voice_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 &  data)
virtual

Write to the output buffer.

Parameters
dataData to be written to the buffer

Reimplemented in dpp::websocket_client.

Member Data Documentation

◆ buffer

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

Input buffer received from openssl

◆ 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 openssl

◆ 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

opensslcontext* dpp::ssl_client::ssl
protected

Openssl opaque contexts

D++ Library version 10.0.29D++ Library version 10.0.28D++ Library version 10.0.27D++ Library version 10.0.26D++ Library version 10.0.25D++ Library version 10.0.24D++ Library version 10.0.23D++ Library version 10.0.22D++ Library version 10.0.21D++ Library version 10.0.20D++ Library version 10.0.19D++ Library version 10.0.18D++ Library version 10.0.17D++ Library version 10.0.16D++ Library version 10.0.15D++ Library version 10.0.14D++ Library version 10.0.13D++ Library version 10.0.12D++ Library version 10.0.11D++ Library version 10.0.10D++ Library version 10.0.9D++ Library version 10.0.8D++ Library version 10.0.7D++ Library version 10.0.6D++ Library version 10.0.5D++ Library version 10.0.4D++ Library version 10.0.3D++ Library version 10.0.2D++ Library version 10.0.1D++ Library version 10.0.0D++ Library version 9.0.19D++ Library version 9.0.18D++ Library version 9.0.17D++ Library version 9.0.16D++ Library version 9.0.15D++ Library version 9.0.14D++ 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