Increase JSON buffer size on overflow (#3475)

This commit is contained in:
[pʲɵs] 2022-05-15 09:53:43 +02:00 committed by Jesse Hills
parent ff72d6a146
commit 01222dbab7
No known key found for this signature in database
GPG key ID: BEAAE804EFD8E83A

View file

@ -26,22 +26,34 @@ std::string build_json(const json_build_t &f) {
const size_t free_heap = heap_caps_get_largest_free_block(MALLOC_CAP_8BIT); const size_t free_heap = heap_caps_get_largest_free_block(MALLOC_CAP_8BIT);
#endif #endif
const size_t request_size = std::min(free_heap, (size_t) 512); size_t request_size = std::min(free_heap, (size_t) 512);
while (true) {
ESP_LOGV(TAG, "Attempting to allocate %u bytes for JSON serialization", request_size);
DynamicJsonDocument json_document(request_size); DynamicJsonDocument json_document(request_size);
if (json_document.capacity() == 0) { if (json_document.capacity() == 0) {
ESP_LOGE(TAG, "Could not allocate memory for JSON document! Requested %u bytes, largest free heap block: %u bytes", ESP_LOGE(TAG,
"Could not allocate memory for JSON document! Requested %u bytes, largest free heap block: %u bytes",
request_size, free_heap); request_size, free_heap);
return "{}"; return "{}";
} }
JsonObject root = json_document.to<JsonObject>(); JsonObject root = json_document.to<JsonObject>();
f(root); f(root);
if (json_document.overflowed()) {
if (request_size == free_heap) {
ESP_LOGE(TAG, "Could not allocate memory for JSON document! Overflowed largest free heap block: %u bytes",
free_heap);
return "{}";
}
request_size = std::min(request_size * 2, free_heap);
continue;
}
json_document.shrinkToFit(); json_document.shrinkToFit();
ESP_LOGV(TAG, "Size after shrink %u bytes", json_document.capacity()); ESP_LOGV(TAG, "Size after shrink %u bytes", json_document.capacity());
std::string output; std::string output;
serializeJson(json_document, output); serializeJson(json_document, output);
return output; return output;
} }
}
void parse_json(const std::string &data, const json_parse_t &f) { void parse_json(const std::string &data, const json_parse_t &f) {
// Here we are allocating 1.5 times the data size, // Here we are allocating 1.5 times the data size,