feat(http): Enhance response buffer management with pre-allocation and capacity tracking
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user