stability improvements for low memory
This commit is contained in:
parent
ced8ac1c4c
commit
b1e1450bfb
|
@ -267,6 +267,7 @@ class AsyncWebServerResponse {
|
|||
virtual bool _started();
|
||||
virtual bool _finished();
|
||||
virtual bool _failed();
|
||||
virtual bool _sourceValid();
|
||||
virtual void _respond(AsyncWebServerRequest *request);
|
||||
virtual size_t _ack(AsyncWebServerRequest *request, size_t len, uint32_t time);
|
||||
};
|
||||
|
|
|
@ -181,6 +181,8 @@ void AsyncWebServerRequest::_onDisconnect(){
|
|||
}
|
||||
|
||||
void AsyncWebServerRequest::_addParam(AsyncWebParameter *p){
|
||||
if(p == NULL)
|
||||
return;
|
||||
if(_params == NULL)
|
||||
_params = p;
|
||||
else {
|
||||
|
@ -252,6 +254,8 @@ bool AsyncWebServerRequest::_parseReqHead(){
|
|||
bool AsyncWebServerRequest::_parseReqHeader(){
|
||||
if(_temp.indexOf(':')){
|
||||
AsyncWebHeader *h = new AsyncWebHeader(_temp);
|
||||
if(h == NULL)
|
||||
return false;
|
||||
if(h->name() == "Host"){
|
||||
_host = h->value();
|
||||
delete h;
|
||||
|
@ -610,14 +614,19 @@ void AsyncWebServerRequest::addInterestingHeader(String name){
|
|||
if(!_interestingHeaders->contains(name)) _interestingHeaders->add(name);
|
||||
}
|
||||
|
||||
|
||||
void AsyncWebServerRequest::send(AsyncWebServerResponse *response){
|
||||
_response = response;
|
||||
_response->_respond(this);
|
||||
if(_response == NULL){
|
||||
_client->close(true);
|
||||
_onDisconnect();
|
||||
return;
|
||||
}
|
||||
if(!_response->_sourceValid())
|
||||
send(500);
|
||||
else
|
||||
_response->_respond(this);
|
||||
}
|
||||
|
||||
|
||||
|
||||
AsyncWebServerResponse * AsyncWebServerRequest::beginResponse(int code, String contentType, String content){
|
||||
return new AsyncBasicResponse(code, contentType, content);
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@ class AsyncBasicResponse: public AsyncWebServerResponse {
|
|||
AsyncBasicResponse(int code, String contentType=String(), String content=String());
|
||||
void _respond(AsyncWebServerRequest *request);
|
||||
size_t _ack(AsyncWebServerRequest *request, size_t len, uint32_t time);
|
||||
bool _sourceValid(){ return true; }
|
||||
};
|
||||
|
||||
class AsyncAbstractResponse: public AsyncWebServerResponse {
|
||||
|
@ -36,8 +37,8 @@ class AsyncAbstractResponse: public AsyncWebServerResponse {
|
|||
public:
|
||||
void _respond(AsyncWebServerRequest *request);
|
||||
size_t _ack(AsyncWebServerRequest *request, size_t len, uint32_t time);
|
||||
bool _sourceValid(){ return false; }
|
||||
virtual size_t _fillBuffer(uint8_t *buf, size_t maxLen){ return 0; }
|
||||
virtual bool _sourceValid(){ return false; }
|
||||
};
|
||||
|
||||
class AsyncFileResponse: public AsyncAbstractResponse {
|
||||
|
|
|
@ -144,6 +144,7 @@ String AsyncWebServerResponse::_assembleHead(uint8_t version){
|
|||
bool AsyncWebServerResponse::_started(){ return _state > RESPONSE_SETUP; }
|
||||
bool AsyncWebServerResponse::_finished(){ return _state > RESPONSE_WAIT_ACK; }
|
||||
bool AsyncWebServerResponse::_failed(){ return _state == RESPONSE_FAILED; }
|
||||
bool AsyncWebServerResponse::_sourceValid(){ return false; }
|
||||
void AsyncWebServerResponse::_respond(AsyncWebServerRequest *request){ _state = RESPONSE_END; request->client()->close(); }
|
||||
size_t AsyncWebServerResponse::_ack(AsyncWebServerRequest *request, size_t len, uint32_t time){ return 0; }
|
||||
|
||||
|
@ -227,11 +228,6 @@ size_t AsyncBasicResponse::_ack(AsyncWebServerRequest *request, size_t len, uint
|
|||
* */
|
||||
|
||||
void AsyncAbstractResponse::_respond(AsyncWebServerRequest *request){
|
||||
if(!_sourceValid()){
|
||||
_state = RESPONSE_FAILED;
|
||||
request->send(500);
|
||||
return;
|
||||
}
|
||||
_head = _assembleHead(request->version());
|
||||
_state = RESPONSE_HEADERS;
|
||||
_ack(request, 0, 0);
|
||||
|
|
|
@ -22,9 +22,19 @@
|
|||
#include "WebHandlerImpl.h"
|
||||
|
||||
|
||||
AsyncWebServer::AsyncWebServer(uint16_t port):_server(port), _handlers(0), _catchAllHandler(new AsyncCallbackWebHandler()){
|
||||
AsyncWebServer::AsyncWebServer(uint16_t port):_server(port), _handlers(0){
|
||||
_catchAllHandler = new AsyncCallbackWebHandler();
|
||||
if(_catchAllHandler == NULL)
|
||||
return;
|
||||
_server.onClient([](void *s, AsyncClient* c){
|
||||
new AsyncWebServerRequest((AsyncWebServer*)s, c);
|
||||
if(c == NULL)
|
||||
return;
|
||||
AsyncWebServerRequest *r = new AsyncWebServerRequest((AsyncWebServer*)s, c);
|
||||
if(r == NULL){
|
||||
c->close(true);
|
||||
c->free();
|
||||
delete c;
|
||||
}
|
||||
}, this);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue