From 0672a5fb7493c5ceed4adbf711971f98432f2713 Mon Sep 17 00:00:00 2001 From: GW_MC <72297530+GWMCwing@users.noreply.github.com> Date: Tue, 3 Feb 2026 19:26:42 +0800 Subject: [PATCH] feat: Enhance HttpHandler to manage response data dynamically and improve memory handling --- main/network/http_handler.cpp | 51 ++++++++++++++++++++++++++--------- main/network/http_handler.h | 3 +++ 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/main/network/http_handler.cpp b/main/network/http_handler.cpp index 00fd7e8..2edd158 100644 --- a/main/network/http_handler.cpp +++ b/main/network/http_handler.cpp @@ -2,16 +2,46 @@ #include "esp_http_client.h" #include "esp_log.h" #include "string.h" +#include + +esp_err_t http_event_handler(esp_http_client_event_t *evt) { + HttpHandler* handler = static_cast(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; } } diff --git a/main/network/http_handler.h b/main/network/http_handler.h index 1be7670..44e6c11 100644 --- a/main/network/http_handler.h +++ b/main/network/http_handler.h @@ -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; };