D++ (DPP)
C++ Discord API Bot Library
|
Implements a websocket client based on the SSL client. More...
#include <wsclient.h>
Public Member Functions | |
websocket_client (cluster *creator, 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) override |
Processes incoming frames from the SSL socket input buffer. More... | |
virtual void | close () override |
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 () override |
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... | |
virtual void | on_disconnect () |
Called on HTTP socket closure. More... | |
void | enable_raw_tracing () |
For low-level debugging, calling this function will enable low level I/O logging for this connection to the logger. This can be very loud, and output a lot of data, so only enable it selectively where you need it. 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... | |
uint64_t | get_unique_id () const |
Every request made has a unique ID. This increments for every request, starting at 1. You can use this for statistics, or to associate requests and replies in external event loops. More... | |
std::string | get_cipher () |
Get SSL cipher name. More... | |
void | read_loop () |
Set up non blocking I/O and configure on_read, on_write and on_error. 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... | |
void | complete_handshake (const struct socket_events *ev) |
Called while SSL handshake is in progress. If the handshake completes, the state of the socket is progressed to an established state. More... | |
void | on_read (dpp::socket fd, const struct dpp::socket_events &ev) |
Called when the TCP socket has data to read. More... | |
void | on_write (dpp::socket fd, const struct dpp::socket_events &e) |
Called when the TCP socket can be written to without blocking. More... | |
void | on_error (dpp::socket fd, const struct dpp::socket_events &, int error_code) |
Called when there is an error on the TCP socket. More... | |
Public Attributes | |
bool | keepalive |
True if we are keeping the connection alive after it has finished. More... | |
class cluster * | owner |
Owning cluster. More... | |
Protected Member Functions | |
virtual void | connect () override |
Connect to websocket server. More... | |
ws_state | get_state () const |
Get websocket state. More... | |
void | do_raw_trace (const std::string &message) const |
If raw_trace is set to true, log a debug message for this connection. More... | |
Protected Attributes | |
bool | timed_out |
If true the connection timed out while waiting, when waiting for SSL negotiation, TCP connect(), or HTTP. More... | |
time_t | timeout |
Time at which the connection should be abandoned, if we are still connecting or negotiating with a HTTP server. More... | |
std::string | buffer |
Input buffer received from socket. More... | |
std::string | obuffer |
Output buffer for sending to socket. 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... | |
time_t | start |
Start time of connection. More... | |
uint8_t | connect_retries {0} |
How many times we retried connect() 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 | connected {false} |
True if connection is completed. More... | |
bool | tcp_connect_done {false} |
True if tcp connect() succeeded. More... | |
timer | timer_handle |
Timer handle for one second timer. More... | |
uint64_t | unique_id |
Unique ID of socket used as a nonce You can use this to identify requests vs reply if you want. D++ itself only sets this, and does not use it in any logic. It starts at 1 and increments for each request made. More... | |
bool | raw_trace {false} |
Set this to true to log all IO to debug for this connection. This is an internal developer facility. Do not enable it unless you need to, as it will be very noisy. More... | |
Implements a websocket client based on the SSL client.
dpp::websocket_client::websocket_client | ( | cluster * | creator, |
const std::string & | hostname, | ||
const std::string & | port = "443" , |
||
const std::string & | urlpath = "" , |
||
ws_opcode | opcode = OP_BINARY |
||
) |
Connect to a specific websocket server.
creator | Creating cluster |
hostname | Hostname to connect to |
port | Port to connect to |
urlpath | The URL path components of the HTTP request to send |
opcode | The encoding type to use, either OP_BINARY or OP_TEXT |
|
virtualdefault |
Destroy the websocket client object.
|
overridevirtual |
Close websocket.
Reimplemented from dpp::ssl_client.
|
inherited |
Called while SSL handshake is in progress. If the handshake completes, the state of the socket is progressed to an established state.
ev | Socket events for the socket |
|
overrideprotectedvirtual |
Connect to websocket server.
Reimplemented from dpp::ssl_client.
|
protectedinherited |
If raw_trace is set to true, log a debug message for this connection.
message | debug message |
|
inherited |
For low-level debugging, calling this function will enable low level I/O logging for this connection to the logger. This can be very loud, and output a lot of data, so only enable it selectively where you need it.
Generally, you won't need this, it is a library development utility.
|
virtual |
Called upon error frame.
errorcode | The error code from the websocket server |
Reimplemented in dpp::discord_client, and dpp::discord_voice_client.
|
inherited |
Get total bytes received.
|
inherited |
Get the bytes out objectGet total bytes sent.
|
inherited |
Get SSL cipher name.
|
protected |
Get websocket state.
|
inherited |
Every request made has a unique ID. This increments for every request, starting at 1. You can use this for statistics, or to associate requests and replies in external event loops.
|
overridevirtual |
Processes incoming frames from the SSL socket input buffer.
buffer | The buffer contents. Can modify this value removing the head elements when processed. |
Reimplemented from dpp::ssl_client.
|
virtual |
Receives raw frame content only without headers.
buffer | The buffer contents |
opcode | Frame type, e.g. OP_TEXT, OP_BINARY |
Reimplemented in dpp::discord_client, and dpp::discord_voice_client.
|
virtualinherited |
Log a message.
severity | severity of log message |
msg | Log message to send |
Reimplemented in dpp::discord_client, and dpp::discord_voice_client.
|
virtual |
Called on HTTP socket closure.
Reimplemented in dpp::discord_client, and dpp::discord_voice_client.
|
inherited |
Called when there is an error on the TCP socket.
fd | File descriptor |
error_code | Error code |
|
inherited |
Called when the TCP socket has data to read.
fd | File descriptor |
ev | Socket events |
|
inherited |
Called when the TCP socket can be written to without blocking.
fd | File descriptor |
e | Socket events |
|
overridevirtual |
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.
|
inherited |
Set up non blocking I/O and configure on_read, on_write and on_error.
std::exception | Any std::exception (or derivative) thrown from read_loop() indicates setup failed |
void dpp::websocket_client::send_close_packet | ( | ) |
Send OP_CLOSE error code 1000 to the other side of the connection. This indicates graceful close.
|
inherited |
Write to the output buffer.
data | Data to be written to the buffer. |
|
virtual |
Write to websocket. Encapsulates data in frames if the status is CONNECTED.
data | The data to send. |
_opcode | The opcode of the data to send, either binary or text. The default is to use the socket's opcode as set in the constructor. |
|
protectedinherited |
Input buffer received from socket.
|
protectedinherited |
Bytes in.
|
protectedinherited |
Bytes out.
|
protectedinherited |
SSL cipher in use.
|
protectedinherited |
How many times we retried connect()
|
protectedinherited |
True if connection is completed.
|
protectedinherited |
Hostname connected to.
|
inherited |
True if we are keeping the connection alive after it has finished.
|
protectedinherited |
For timers.
|
protectedinherited |
Output buffer for sending to socket.
|
inherited |
Owning cluster.
|
protectedinherited |
True for a plain text connection.
|
protectedinherited |
Port connected to.
|
protectedinherited |
Set this to true to log all IO to debug for this connection. This is an internal developer facility. Do not enable it unless you need to, as it will be very noisy.
|
protectedinherited |
Raw file descriptor of connection.
|
protectedinherited |
Openssl opaque contexts.
|
protectedinherited |
Start time of connection.
|
protectedinherited |
True if tcp connect() succeeded.
|
protected |
If true the connection timed out while waiting, when waiting for SSL negotiation, TCP connect(), or HTTP.
|
protected |
Time at which the connection should be abandoned, if we are still connecting or negotiating with a HTTP server.
|
protectedinherited |
Timer handle for one second timer.
|
protectedinherited |
Unique ID of socket used as a nonce You can use this to identify requests vs reply if you want. D++ itself only sets this, and does not use it in any logic. It starts at 1 and increments for each request made.