Log errors if too less memory for webapi is available
This commit is contained in:
parent
97bc964b6c
commit
759f8b7208
@ -31,6 +31,8 @@ public:
|
||||
static bool checkCredentials(AsyncWebServerRequest* request);
|
||||
static bool checkCredentialsReadonly(AsyncWebServerRequest* request);
|
||||
|
||||
static void sendTooManyRequests(AsyncWebServerRequest* request);
|
||||
|
||||
private:
|
||||
AsyncWebServer _server;
|
||||
AsyncEventSource _events;
|
||||
|
||||
@ -90,4 +90,11 @@ bool WebApiClass::checkCredentialsReadonly(AsyncWebServerRequest* request)
|
||||
}
|
||||
}
|
||||
|
||||
void WebApiClass::sendTooManyRequests(AsyncWebServerRequest* request)
|
||||
{
|
||||
auto response = request->beginResponse(429, "text/plain", "Too Many Requests");
|
||||
response->addHeader("Retry-After", "60");
|
||||
request->send(response);
|
||||
}
|
||||
|
||||
WebApiClass WebApi;
|
||||
@ -5,7 +5,9 @@
|
||||
*/
|
||||
#include "WebApi_prometheus.h"
|
||||
#include "Configuration.h"
|
||||
#include "MessageOutput.h"
|
||||
#include "NetworkSettings.h"
|
||||
#include "WebApi.h"
|
||||
#include <Hoymiles.h>
|
||||
|
||||
void WebApiPrometheusClass::init(AsyncWebServer* server)
|
||||
@ -23,6 +25,7 @@ void WebApiPrometheusClass::loop()
|
||||
|
||||
void WebApiPrometheusClass::onPrometheusMetricsGet(AsyncWebServerRequest* request)
|
||||
{
|
||||
try {
|
||||
auto stream = request->beginResponseStream("text/plain; charset=utf-8", 40960);
|
||||
|
||||
stream->print(F("# HELP opendtu_build Build info\n"));
|
||||
@ -88,6 +91,12 @@ void WebApiPrometheusClass::onPrometheusMetricsGet(AsyncWebServerRequest* reques
|
||||
}
|
||||
stream->addHeader(F("Cache-Control"), F("no-cache"));
|
||||
request->send(stream);
|
||||
|
||||
} catch (std::bad_alloc& bad_alloc) {
|
||||
MessageOutput.printf("Call to /api/prometheus/metrics temporarely out of resources. Reason: \"%s\".\r\n", bad_alloc.what());
|
||||
|
||||
WebApi.sendTooManyRequests(request);
|
||||
}
|
||||
}
|
||||
|
||||
void WebApiPrometheusClass::addField(AsyncResponseStream* stream, String& serial, uint8_t idx, std::shared_ptr<InverterAbstract> inv, ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId, const char* channelName)
|
||||
|
||||
@ -60,6 +60,7 @@ void WebApiWsLiveClass::loop()
|
||||
// Update on every inverter change or at least after 10 seconds
|
||||
if (millis() - _lastWsPublish > (10 * 1000) || (maxTimeStamp != _newestInverterTimestamp)) {
|
||||
|
||||
try {
|
||||
DynamicJsonDocument root(40960);
|
||||
JsonVariant var = root;
|
||||
generateJsonResponse(var);
|
||||
@ -77,6 +78,10 @@ void WebApiWsLiveClass::loop()
|
||||
_ws.textAll(buffer);
|
||||
}
|
||||
|
||||
} catch (std::bad_alloc& bad_alloc) {
|
||||
MessageOutput.printf("Call to /api/livedata/status temporarely out of resources. Reason: \"%s\".\r\n", bad_alloc.what());
|
||||
}
|
||||
|
||||
_lastWsPublish = millis();
|
||||
}
|
||||
}
|
||||
@ -220,6 +225,7 @@ void WebApiWsLiveClass::onLivedataStatus(AsyncWebServerRequest* request)
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
AsyncJsonResponse* response = new AsyncJsonResponse(false, 40960U);
|
||||
JsonVariant root = response->getRoot();
|
||||
|
||||
@ -227,4 +233,10 @@ void WebApiWsLiveClass::onLivedataStatus(AsyncWebServerRequest* request)
|
||||
|
||||
response->setLength();
|
||||
request->send(response);
|
||||
|
||||
} catch (std::bad_alloc& bad_alloc) {
|
||||
MessageOutput.printf("Call to /api/livedata/status temporarely out of resources. Reason: \"%s\".\r\n", bad_alloc.what());
|
||||
|
||||
WebApi.sendTooManyRequests(request);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user