Implements a HTTPS socket client based on the SSL client. More...
#include "httpsclient.h"
Public Member Functions | |
https_client (const std::string &hostname, uint16_t port=443, const std::string &urlpath="/", const std::string &verb="GET", const std::string &req_body="", const http_headers &extra_headers={}, bool plaintext_connection=false, uint16_t request_timeout=5, const std::string &protocol="1.1") | |
Connect to a specific HTTP(S) server and complete a request. More... | |
virtual | ~https_client ()=default |
Destroy the https client object. More... | |
virtual void | close () |
Close HTTPS socket. More... | |
uint64_t | get_bytes_in () |
Get total bytes received. More... | |
uint64_t | get_bytes_out () |
Get the bytes out objectGet total bytes sent. More... | |
std::string | get_cipher () |
Get SSL cipher name. More... | |
const std::string | get_content () const |
Get the response content. More... | |
const std::string | get_header (std::string header_name) const |
Get a HTTP response header. More... | |
size_t | get_header_count (std::string header_name) const |
Get the number of headers with the same header name. More... | |
const std::list< std::string > | get_header_list (std::string header_name) const |
Get a set of HTTP response headers with a common name. More... | |
const std::multimap< std::string, std::string > | get_headers () const |
Get all HTTP response headers. More... | |
uint16_t | get_status () const |
Get the response HTTP status, e.g. More... | |
virtual bool | handle_buffer (std::string &buffer) |
Processes incoming data from the SSL socket input buffer. More... | |
virtual void | log (dpp::loglevel severity, const std::string &msg) const |
Log a message. More... | |
virtual void | one_second_timer () |
Fires every second from the underlying socket I/O loop, used for timeouts. More... | |
void | read_loop () |
Nonblocking I/O loop. More... | |
virtual void | write (const std::string &data) |
Write to the output buffer. More... | |
Static Public Member Functions | |
static multipart_content | build_multipart (const std::string &json, const std::vector< std::string > &filenames={}, const std::vector< std::string > &contents={}, const std::vector< std::string > &mimetypes={}) |
Build a multipart content from a set of files and some json. More... | |
static http_connect_info | get_host_info (std::string url) |
Break down a scheme, hostname and port into a http_connect_info. 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_notification_t | custom_readable_ready |
This event will be called when you can read from the custom fd. 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_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 () |
Start the connection. More... | |
http_state | get_state () |
Get request state. More... | |
Protected Attributes | |
std::string | buffer |
Input buffer received from socket. More... | |
uint64_t | bytes_in |
Bytes in. More... | |
uint64_t | bytes_out |
Bytes out. More... | |
std::string | cipher |
SSL cipher in use. More... | |
std::string | hostname |
Hostname connected to. More... | |
time_t | last_tick |
For timers. More... | |
bool | make_new |
True if we are establishing a new connection, false if otherwise. More... | |
bool | nonblocking |
True if in nonblocking mode. More... | |
std::string | obuffer |
Output buffer for sending to socket. More... | |
bool | plaintext |
True for a plain text connection. More... | |
std::string | port |
Port connected to. More... | |
dpp::socket | sfd |
Raw file descriptor of connection. More... | |
openssl_connection * | ssl |
Openssl opaque contexts. More... | |
Implements a HTTPS socket client based on the SSL client.
dpp::https_client::https_client | ( | const std::string & | hostname, |
uint16_t | port = 443 , |
||
const std::string & | urlpath = "/" , |
||
const std::string & | verb = "GET" , |
||
const std::string & | req_body = "" , |
||
const http_headers & | extra_headers = {} , |
||
bool | plaintext_connection = false , |
||
uint16_t | request_timeout = 5 , |
||
const std::string & | protocol = "1.1" |
||
) |
Connect to a specific HTTP(S) server and complete a request.
The constructor will attempt the connection, and return the content. By the time the constructor completes, the HTTP request will be stored in the object.
hostname | Hostname to connect to |
port | Port number to connect to, usually 443 for SSL and 80 for plaintext |
urlpath | path part of URL, e.g. "/api" |
verb | Request verb, e.g. GET or POST |
req_body | Request body, use dpp::https_client::build_multipart() to build a multipart MIME body (e.g. for multiple file upload) |
extra_headers | Additional request headers, e.g. user-agent, authorization, etc |
plaintext_connection | Set to true to make the connection plaintext (turns off SSL) |
request_timeout | How many seconds before the connection is considered failed if not finished |
protocol | Request HTTP protocol (default: 1.1) |
References dpp::unicode_emoji::v.
|
virtualdefault |
Destroy the https client object.
|
static |
Build a multipart content from a set of files and some json.
json | The json content |
filenames | File names of files to send |
contents | Contents of each of the files to send |
mimetypes | MIME types of each of the files to send |
Referenced by main().
|
virtual |
Close HTTPS socket.
Reimplemented from dpp::ssl_client.
|
protectedvirtual |
Start the connection.
Reimplemented from dpp::ssl_client.
|
inherited |
|
inherited |
Get the bytes out objectGet total bytes sent.
References dpp::ssl_client::bytes_out.
|
inherited |
const std::string dpp::https_client::get_content | ( | ) | const |
Get the response content.
Referenced by dpp::http_request::http_request().
const std::string dpp::https_client::get_header | ( | std::string | header_name | ) | const |
Get a HTTP response header.
header_name | Header name to find, case insensitive |
Referenced by dpp::http_request::complete(), and main().
size_t dpp::https_client::get_header_count | ( | std::string | header_name | ) | const |
Get the number of headers with the same header name.
header_name |
const std::list< std::string > dpp::https_client::get_header_list | ( | std::string | header_name | ) | const |
Get a set of HTTP response headers with a common name.
header_name |
References dpp::HTTPS_HEADERS.
const std::multimap< std::string, std::string > dpp::https_client::get_headers | ( | ) | const |
Get all HTTP response headers.
Referenced by dpp::http_request::http_request().
|
static |
Break down a scheme, hostname and port into a http_connect_info.
All but the hostname portion are optional. The path component should not be passed to this function.
url | URL to break down |
Referenced by main().
|
protected |
Get request state.
References dpp::http_connect_info::is_ssl, dpp::http_connect_info::port, and dpp::http_connect_info::scheme.
uint16_t dpp::https_client::get_status | ( | ) | const |
Get the response HTTP status, e.g.
200 for OK, 404 for not found, 429 for rate limited. A value of 0 indicates the request was not completed.
References dpp::ssl_client::close(), and dpp::HTTPS_DONE.
Referenced by dpp::http_request::http_request().
|
virtual |
Processes incoming data 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.
References dpp::HTTPS_CHUNK_LEN, dpp::HTTPS_CONTENT, dpp::unicode_emoji::key, and dpp::utility::tokenize().
|
virtualinherited |
Log a message.
severity | severity of log message |
msg | Log message to send |
Reimplemented in dpp::discord_voice_client, and dpp::discord_client.
Referenced by dpp::ssl_client::read_loop().
|
virtual |
Fires every second from the underlying socket I/O loop, used for timeouts.
Reimplemented from dpp::ssl_client.
|
inherited |
Nonblocking I/O loop.
std::exception | Any std::exception (or derivative) thrown from read_loop() causes reconnection of the shard |
References dpp::ssl_client::buffer, dpp::ssl_client::bytes_in, dpp::ssl_client::bytes_out, dpp::ssl_client::custom_readable_fd, dpp::ssl_client::custom_readable_ready, dpp::ssl_client::custom_writeable_fd, dpp::ssl_client::custom_writeable_ready, DPP_BUFSIZE, dpp::err_invalid_socket, dpp::err_nonblocking_failure, dpp::err_socket_error, dpp::ssl_client::handle_buffer(), INVALID_SOCKET, dpp::ssl_client::last_tick, dpp::ll_warning, dpp::ssl_client::log(), dpp::ssl_client::nonblocking, dpp::ssl_client::obuffer, dpp::ssl_client::one_second_timer(), dpp::ssl_client::plaintext, dpp::set_nonblocking(), dpp::ssl_client::sfd, dpp::openssl_connection::ssl, and dpp::ssl_client::ssl.
|
virtualinherited |
Write to the output buffer.
data | Data to be written to the buffer |
Reimplemented in dpp::websocket_client.
References dpp::err_ssl_write, dpp::err_write, INVALID_SOCKET, dpp::ssl_client::nonblocking, dpp::ssl_client::obuffer, dpp::ssl_client::plaintext, dpp::ssl_client::sfd, dpp::openssl_connection::ssl, and dpp::ssl_client::ssl.
|
protectedinherited |
Input buffer received from socket.
Referenced by dpp::ssl_client::close(), dpp::discord_client::handle_frame(), and dpp::ssl_client::read_loop().
|
protectedinherited |
Bytes in.
Referenced by dpp::ssl_client::get_bytes_in(), and dpp::ssl_client::read_loop().
|
protectedinherited |
Bytes out.
Referenced by dpp::ssl_client::get_bytes_out(), and dpp::ssl_client::read_loop().
|
protectedinherited |
SSL cipher in use.
Referenced by dpp::ssl_client::connect(), and dpp::ssl_client::get_cipher().
|
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.
Referenced by dpp::discord_voice_client::handle_frame(), and dpp::ssl_client::read_loop().
|
inherited |
This event will be called when you can read from the custom fd.
Referenced by dpp::discord_voice_client::handle_frame(), and dpp::ssl_client::read_loop().
|
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).
Referenced by dpp::discord_voice_client::handle_frame(), and dpp::ssl_client::read_loop().
|
inherited |
This event will be called when you can write to a custom fd.
Referenced by dpp::discord_voice_client::handle_frame(), and dpp::ssl_client::read_loop().
|
protectedinherited |
Hostname connected to.
Referenced by dpp::ssl_client::close(), dpp::ssl_client::connect(), and dpp::ssl_client::ssl_client().
|
inherited |
True if we are keeping the connection alive after it has finished.
Referenced by dpp::ssl_client::close(), and dpp::ssl_client::ssl_client().
|
protectedinherited |
For timers.
Referenced by dpp::ssl_client::read_loop().
|
protectedinherited |
True if we are establishing a new connection, false if otherwise.
Referenced by dpp::ssl_client::connect(), and dpp::ssl_client::ssl_client().
|
protectedinherited |
True if in nonblocking mode.
The socket switches to nonblocking mode once ReadLoop is called.
Referenced by dpp::ssl_client::connect(), dpp::ssl_client::read_loop(), and dpp::ssl_client::write().
|
protectedinherited |
Output buffer for sending to socket.
Referenced by dpp::ssl_client::close(), dpp::ssl_client::read_loop(), and dpp::ssl_client::write().
|
protectedinherited |
True for a plain text connection.
Referenced by dpp::ssl_client::close(), dpp::ssl_client::connect(), dpp::ssl_client::read_loop(), dpp::ssl_client::ssl_client(), and dpp::ssl_client::write().
|
protectedinherited |
Port connected to.
Referenced by dpp::ssl_client::close(), dpp::ssl_client::connect(), and dpp::ssl_client::ssl_client().
|
protectedinherited |
Raw file descriptor of connection.
Referenced by dpp::ssl_client::close(), dpp::ssl_client::connect(), dpp::discord_client::one_second_timer(), dpp::ssl_client::read_loop(), dpp::ssl_client::ssl_client(), and dpp::ssl_client::write().
|
protectedinherited |
Openssl opaque contexts.
Referenced by dpp::ssl_client::close(), dpp::ssl_client::connect(), dpp::ssl_client::read_loop(), dpp::ssl_client::ssl_client(), and dpp::ssl_client::write().