feat: Enhance HttpHandler to manage response data dynamically and improve memory handling
This commit is contained in:
@@ -2,16 +2,46 @@
|
||||
#include "esp_http_client.h"
|
||||
#include "esp_log.h"
|
||||
#include "string.h"
|
||||
#include <cstring>
|
||||
|
||||
esp_err_t http_event_handler(esp_http_client_event_t *evt) {
|
||||
HttpHandler* handler = static_cast<HttpHandler*>(evt->user_data);
|
||||
|
||||
switch (evt->event_id) {
|
||||
case HTTP_EVENT_ON_DATA:
|
||||
if (handler && evt->data_len > 0) {
|
||||
char* new_buffer = new char[handler->response_size + evt->data_len + 1];
|
||||
if (handler->response_buffer && handler->response_size > 0) {
|
||||
memcpy(new_buffer, handler->response_buffer, handler->response_size);
|
||||
delete[] handler->response_buffer;
|
||||
}
|
||||
memcpy(new_buffer + handler->response_size, evt->data, evt->data_len);
|
||||
handler->response_size += evt->data_len;
|
||||
new_buffer[handler->response_size] = '\0';
|
||||
handler->response_buffer = new_buffer;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
HttpHandler::HttpHandler(const esp_http_client_config_t&& config, WifiHandler* wifiHandler)
|
||||
: wifiHandler(wifiHandler) {
|
||||
this->client = esp_http_client_init(&config);
|
||||
: wifiHandler(wifiHandler), response_buffer(nullptr), response_size(0) {
|
||||
esp_http_client_config_t modified_config = config;
|
||||
modified_config.event_handler = http_event_handler;
|
||||
modified_config.user_data = this;
|
||||
this->client = esp_http_client_init(&modified_config);
|
||||
}
|
||||
|
||||
HttpHandler::~HttpHandler() {
|
||||
if (this->client) {
|
||||
esp_http_client_cleanup(this->client);
|
||||
}
|
||||
if (response_buffer) {
|
||||
delete[] response_buffer;
|
||||
}
|
||||
}
|
||||
|
||||
esp_err_t HttpHandler::set_method(esp_http_client_method_t method) {
|
||||
@@ -34,18 +64,13 @@ void HttpHandler::get_body(
|
||||
char*& buffer,
|
||||
int& total_len
|
||||
) {
|
||||
total_len = esp_http_client_get_content_length(this->client);
|
||||
buffer = new char[total_len + 1]; // +1 for null-terminator
|
||||
if (buffer) {
|
||||
int read_len = esp_http_client_read(this->client, buffer, total_len);
|
||||
if (read_len >= 0) {
|
||||
buffer[read_len] = '\0'; // null-terminate
|
||||
} else {
|
||||
delete[] buffer;
|
||||
buffer = nullptr;
|
||||
total_len = 0;
|
||||
}
|
||||
total_len = response_size;
|
||||
if (response_buffer && response_size > 0) {
|
||||
buffer = new char[response_size + 1];
|
||||
memcpy(buffer, response_buffer, response_size);
|
||||
buffer[response_size] = '\0';
|
||||
} else {
|
||||
buffer = nullptr;
|
||||
total_len = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@ public:
|
||||
|
||||
// only NetworkHandler can create HttpHandler instances
|
||||
friend class NetworkHandler;
|
||||
friend esp_err_t http_event_handler(esp_http_client_event_t *evt);
|
||||
// disable copy constructor and assignment operator
|
||||
HttpHandler(const HttpHandler&) = delete;
|
||||
HttpHandler& operator=(const HttpHandler&) = delete;
|
||||
@@ -52,4 +53,6 @@ private:
|
||||
esp_http_client_handle_t client;
|
||||
// backreference to WifiHandler to ensure WiFi is connected, DO NOT DELETE
|
||||
WifiHandler* wifiHandler;
|
||||
char* response_buffer;
|
||||
size_t response_size;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user