diff --git a/main/network/http_handler.cpp b/main/network/http_handler.cpp index 2edd158..278efbe 100644 --- a/main/network/http_handler.cpp +++ b/main/network/http_handler.cpp @@ -3,6 +3,7 @@ #include "esp_log.h" #include "string.h" #include +#include esp_err_t http_event_handler(esp_http_client_event_t *evt) { HttpHandler* handler = static_cast(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: diff --git a/main/network/http_handler.h b/main/network/http_handler.h index 44e6c11..b043595 100644 --- a/main/network/http_handler.h +++ b/main/network/http_handler.h @@ -55,4 +55,5 @@ private: WifiHandler* wifiHandler; char* response_buffer; size_t response_size; + size_t response_capacity = 0; };