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 "esp_log.h"
#include "string.h" #include "string.h"
#include <cstring> #include <cstring>
#include <algorithm>
esp_err_t http_event_handler(esp_http_client_event_t *evt) { esp_err_t http_event_handler(esp_http_client_event_t *evt) {
HttpHandler* handler = static_cast<HttpHandler*>(evt->user_data); 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) { switch (evt->event_id) {
case HTTP_EVENT_ON_DATA: case HTTP_EVENT_ON_DATA:
if (handler && evt->data_len > 0) { 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) { if (handler->response_buffer && handler->response_size > 0) {
memcpy(new_buffer, handler->response_buffer, handler->response_size); memcpy(new_buffer, handler->response_buffer, handler->response_size);
delete[] handler->response_buffer; 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; handler->response_size += evt->data_len;
new_buffer[handler->response_size] = '\0'; new_buffer[handler->response_size] = '\0';
handler->response_buffer = new_buffer; handler->response_buffer = new_buffer;
handler->response_capacity = new_capacity;
} }
break; break;
default: default:

View File

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