feat(http): Enhance response buffer management with pre-allocation and capacity tracking

This commit is contained in:
GW_MC
2026-04-20 15:12:04 +08:00
parent 48c6b97062
commit 4cfa7333f1
2 changed files with 11 additions and 1 deletions

View File

@@ -3,6 +3,7 @@
#include "esp_log.h"
#include "string.h"
#include <cstring>
#include <algorithm>
esp_err_t http_event_handler(esp_http_client_event_t *evt) {
HttpHandler* handler = static_cast<HttpHandler*>(evt->user_data);
@@ -10,7 +11,14 @@ esp_err_t http_event_handler(esp_http_client_event_t *evt) {
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];
// Pre-allocate with some extra capacity to reduce reallocations
size_t new_capacity = handler->response_size + evt->data_len + 1;
// Double capacity if we already have data, to amortize reallocation cost
if (handler->response_size > 0) {
new_capacity = std::max(new_capacity, (handler->response_size * 2) + 1);
new_capacity = std::min(new_capacity, (size_t)65536); // Cap at 64KB
}
char* new_buffer = new char[new_capacity];
if (handler->response_buffer && handler->response_size > 0) {
memcpy(new_buffer, handler->response_buffer, handler->response_size);
delete[] handler->response_buffer;
@@ -19,6 +27,7 @@ esp_err_t http_event_handler(esp_http_client_event_t *evt) {
handler->response_size += evt->data_len;
new_buffer[handler->response_size] = '\0';
handler->response_buffer = new_buffer;
handler->response_capacity = new_capacity;
}
break;
default:

View File

@@ -55,4 +55,5 @@ private:
WifiHandler* wifiHandler;
char* response_buffer;
size_t response_size;
size_t response_capacity = 0;
};