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

Implements a websocket client based on the SSL client. More...

#include <wsclient.h>

+ Inheritance diagram for dpp::websocket_client:
+ Collaboration diagram for dpp::websocket_client:

Public Member Functions

 websocket_client (const std::string &hostname, const std::string &port="443", const std::string &urlpath="", ws_opcode opcode=OP_BINARY)
 Connect to a specific websocket server. More...
 
virtual ~websocket_client ()=default
 Destroy the websocket client object. More...
 
virtual void write (const std::string_view data, ws_opcode _opcode=OP_AUTO)
 Write to websocket. Encapsulates data in frames if the status is CONNECTED. More...
 
virtual bool handle_buffer (std::string &buffer)
 Processes incoming frames from the SSL socket input buffer. More...
 
virtual void close ()
 Close websocket. More...
 
virtual bool handle_frame (const std::string &buffer, ws_opcode opcode)
 Receives raw frame content only without headers. More...
 
virtual void error (uint32_t errorcode)
 Called upon error frame. More...
 
virtual void one_second_timer ()
 Fires every second from the underlying socket I/O loop, used for sending websocket pings. More...
 
void send_close_packet ()
 Send OP_CLOSE error code 1000 to the other side of the connection. This indicates graceful close. More...
 
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...
 
void read_loop ()
 Nonblocking I/O loop. More...
 
void socket_write (const std::string_view data)
 Write to the output buffer. 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 connect ()
 (Re)connect More...
 
ws_state get_state () const
 Get websocket state. 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 websocket client based on the SSL client.

Constructor & Destructor Documentation

◆ websocket_client()

dpp::websocket_client::websocket_client ( const std::string &  hostname,
const std::string &  port = "443",
const std::string &  urlpath = "",
ws_opcode  opcode = OP_BINARY 
)

Connect to a specific websocket server.

Parameters
hostnameHostname to connect to
portPort to connect to
urlpathThe URL path components of the HTTP request to send
opcodeThe encoding type to use, either OP_BINARY or OP_TEXT
Note
Voice websockets only support OP_TEXT, and other websockets must be OP_BINARY if you are going to send ETF.

◆ ~websocket_client()

virtual dpp::websocket_client::~websocket_client ( )
virtualdefault

Destroy the websocket client object.

Member Function Documentation

◆ close()

virtual void dpp::websocket_client::close ( )
virtual

Close websocket.

Reimplemented from dpp::ssl_client.

◆ connect()

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

(Re)connect

Reimplemented from dpp::ssl_client.

◆ error()

virtual void dpp::websocket_client::error ( uint32_t  errorcode)
virtual

Called upon error frame.

Parameters
errorcodeThe error code from the websocket server

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

◆ get_bytes_in()

uint64_t dpp::ssl_client::get_bytes_in ( )
inherited

Get total bytes received.

Returns
uint64_t bytes received

◆ get_bytes_out()

uint64_t dpp::ssl_client::get_bytes_out ( )
inherited

Get the bytes out objectGet total bytes sent.

Returns
uint64_t bytes sent

◆ get_cipher()

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

Get SSL cipher name.

Returns
std::string ssl cipher name

◆ get_state()

ws_state dpp::websocket_client::get_state ( ) const
protected

Get websocket state.

Returns
websocket state

◆ handle_buffer()

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

Processes incoming frames from the SSL socket input buffer.

Parameters
bufferThe buffer contents. Can modify this value removing the head elements when processed.

Reimplemented from dpp::ssl_client.

◆ handle_frame()

virtual bool dpp::websocket_client::handle_frame ( const std::string &  buffer,
ws_opcode  opcode 
)
virtual

Receives raw frame content only without headers.

Parameters
bufferThe buffer contents
opcodeFrame type, e.g. OP_TEXT, OP_BINARY
Returns
True if the frame was successfully handled. False if no valid frame is in the buffer.

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

◆ log()

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

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::websocket_client::one_second_timer ( )
virtual

Fires every second from the underlying socket I/O loop, used for sending websocket pings.

Reimplemented from dpp::ssl_client.

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

◆ read_loop()

void dpp::ssl_client::read_loop ( )
inherited

Nonblocking I/O loop.

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

◆ send_close_packet()

void dpp::websocket_client::send_close_packet ( )

Send OP_CLOSE error code 1000 to the other side of the connection. This indicates graceful close.

◆ socket_write()

void dpp::ssl_client::socket_write ( const std::string_view  data)
inherited

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.

◆ write()

virtual void dpp::websocket_client::write ( const std::string_view  data,
ws_opcode  _opcode = OP_AUTO 
)
virtual

Write to websocket. Encapsulates data in frames if the status is CONNECTED.

Parameters
dataThe data to send.
_opcodeThe opcode of the data to send, either binary or text. The default is to use the socket's opcode as set in the constructor.

Member Data Documentation

◆ buffer

std::string dpp::ssl_client::buffer
protectedinherited

Input buffer received from socket.

◆ bytes_in

uint64_t dpp::ssl_client::bytes_in
protectedinherited

Bytes in.

◆ bytes_out

uint64_t dpp::ssl_client::bytes_out
protectedinherited

Bytes out.

◆ cipher

std::string dpp::ssl_client::cipher
protectedinherited

SSL cipher in use.

◆ custom_readable_fd

socket_callback_t dpp::ssl_client::custom_readable_fd
inherited

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
inherited

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
inherited

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
inherited

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

◆ hostname

std::string dpp::ssl_client::hostname
protectedinherited

Hostname connected to.

◆ keepalive

bool dpp::ssl_client::keepalive
inherited

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

◆ last_tick

time_t dpp::ssl_client::last_tick
protectedinherited

For timers.

◆ make_new

bool dpp::ssl_client::make_new
protectedinherited

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

◆ nonblocking

bool dpp::ssl_client::nonblocking
protectedinherited

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

◆ obuffer

std::string dpp::ssl_client::obuffer
protectedinherited

Output buffer for sending to socket.

◆ plaintext

bool dpp::ssl_client::plaintext
protectedinherited

True for a plain text connection.

◆ port

std::string dpp::ssl_client::port
protectedinherited

Port connected to.

◆ sfd

dpp::socket dpp::ssl_client::sfd
protectedinherited

Raw file descriptor of connection.

◆ ssl

openssl_connection* dpp::ssl_client::ssl
protectedinherited

Openssl opaque contexts.

D++ Library version 10.0.35D++ Library version 10.0.34D++ Library version 10.0.33D++ Library version 10.0.32D++ Library version 10.0.31D++ Library version 10.0.30D++ 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