EVOG2-Spiffs-Avery/HTTPSHandler.h

223 lines
6.9 KiB
C++

#ifndef HTTPS_HANDLER_H
#define HTTPS_HANDLER_H
#include <WiFiClientSecure.h>
#include "SD_MMC.h"
/**
* @class HTTPSHandler
*
* This class provides functionality to handle HTTPS connections, including downloading,
* uploading, and sending post requests. It uses a state machine internally to track the
* status of downloads.
*/
class HTTPSHandler
{
public:
/**
* @enum HttpsState
*
* Enumerates the possible states for the https class.
*/
enum class HttpsState
{
IDLE, // Initial state, no download in progress.
CONNECTING, // Connecting to the server.
WAITING, // Waiting for server response.
COMPLETE, // Response is complete.
ERROR // An error occurred during the download.
};
/**
* @enum Type of http request
*/
enum class RequestType
{
GET,
DOWNLOAD,
POST,
UPLOAD
};
// A callback type that notifies about download progress.
using ProgressCallback = void (*)(int bytesDownloaded, int totalBytes);
private:
WiFiClientSecure _client;
// The server's certificate for SSL/TLS connection. Typically the root CA certificate.
const char *_serverCert;
// Must be a domain name, not an IP address.
const char *_host;
// Range between 0 and 65535.
int _port = 443;
// Duration in seconds.
uint8_t _downloadTimeout = 90;
// Duration in seconds.
uint8_t _responseTimeout = 100;
// Callback function to get download progress updates.
ProgressCallback _progressCallback = nullptr;
// Current state of the download.
HttpsState _currentState = HttpsState::IDLE;
// Type of http request.
RequestType _requestType;
// Boundaries for upload.
const String _BOUNDARY = "----WebKitFormBoundary7MA4YWxkTrZu0gW";
String _response;
// The File object where the downloaded data will be saved.
File _destinationFile;
// The path or endpoint on the server.
const char *_path;
// A header to be sent with the request.
String _customHeader;
/**
* Establish a connection to the server.
* @return true if connected successfully, false otherwise.
*/
bool _connect();
/**
* Internal method to get the content length from the server's response headers.
* @return The content length as an integer.
*/
int _getContentLength();
/**
* Processes the server's response for a given request.
* This method reads the available data from the client, appends it to
* the internal response string, and updates the current state
* of the HTTPSHandler based on the contents of the response.
*/
void _processResponse();
/**
* Process the download once initiated.
* @param dest The File object where the downloaded data will be saved.
*/
void _processDownload(File &dest);
/**
* Get only the file name from a given path.
*/
String _extractFileName(const String &fullPath);
/**
* Create boundary for multipart upload.
* Used in http request header.
*/
String _createBoundary(const String &fileNameToUpload);
public:
/**
* Constructor for the HTTPSHandler class.
* @param host The server's domain or IP address.
* @param port The port to connect on the server.
* @param serverCert The server's certificate for SSL/TLS connection.
*/
HTTPSHandler(const char *serverCert);
/**
* Destructor for the HTTPSHandler class.
*/
~HTTPSHandler();
/**
* Establish a connection to the server.
* @param host The server host to connect to.
* @param port The server port to connect to. Defaults to 443.
* @param serverCert The server certificate. Defaults to nullptr.
* @return true if connected successfully, false otherwise.
*/
bool connect(const char *host, int port = 443, const char *serverCert = nullptr);
/**
* Retrieves the server's response for the most recent request.
*
* @return A string containing the full response from the server.
*/
String getResponse() { return _response; }
/**
* Checks if the server's response for the most recent request is complete.
*
* @return True if the response is complete, otherwise false.
*/
bool isResponseComplete() { return _currentState == HttpsState::COMPLETE; }
/**
* Set a callback function to get download progress updates.
* @param callback A function pointer to the callback.
*/
void setProgressCallback(ProgressCallback callback) { _progressCallback = callback; }
/**
* Get the current download state.
* @return The current state of the download.
*/
HttpsState getState() const { return _currentState; }
/**
* Set a custom header for the next HTTP request.
* @param header The header string to set.
*/
void setCustomHeader(const String &header) { _customHeader = header; }
/**
* Initiate the download process.
* @param path The path or endpoint on the server from where to download.
*/
void getRequest(const char *path);
/**
* Upload a file to the server.
* @param path The path or endpoint on the server where to upload.
* @param source The File object containing the data to be uploaded.
* @param fileName The name that will be used for the uploaded file on the server.
* If not specified, the name of the source file will be used.
* @return true if the upload was successful, false otherwise.
*/
bool uploadFile(const char *path, File &source, const String &fileName = "");
/**
* Send a POST request to the server.
* @param path The path or endpoint on the server to send the POST request.
* @param postData The data to be sent in the POST request.
* @return true if the request was successful, false otherwise.
*/
bool postRequest(const char *path, const String &postData);
/**
* Set the target from a given path and destination file.
* @param path The path or endpoint on the server from where to download.
* @param dest The File object where the downloaded data will be saved.
*/
void setTarget(const char *sourcePath, File &dest);
/**
* Continue processing the state machine.
*/
void advanceStateMachine();
/**
* Check if an error occurred during the download.
* @return true if an error occurred, false otherwise.
*/
bool isErrorOccurred() { return _currentState == HttpsState::ERROR; }
/**
* Close the current connection with the server.
*/
void close();
/**
*
*/
// void get(const String &url, Callback callback);
};
#endif // HTTPS_HANDLER_H