forked from me-no-dev/ESPAsyncWebServer
stability improvements for low memory
This commit is contained in:
@@ -267,6 +267,7 @@ class AsyncWebServerResponse {
|
|||||||
virtual bool _started();
|
virtual bool _started();
|
||||||
virtual bool _finished();
|
virtual bool _finished();
|
||||||
virtual bool _failed();
|
virtual bool _failed();
|
||||||
|
virtual bool _sourceValid();
|
||||||
virtual void _respond(AsyncWebServerRequest *request);
|
virtual void _respond(AsyncWebServerRequest *request);
|
||||||
virtual size_t _ack(AsyncWebServerRequest *request, size_t len, uint32_t time);
|
virtual size_t _ack(AsyncWebServerRequest *request, size_t len, uint32_t time);
|
||||||
};
|
};
|
||||||
|
@@ -181,6 +181,8 @@ void AsyncWebServerRequest::_onDisconnect(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void AsyncWebServerRequest::_addParam(AsyncWebParameter *p){
|
void AsyncWebServerRequest::_addParam(AsyncWebParameter *p){
|
||||||
|
if(p == NULL)
|
||||||
|
return;
|
||||||
if(_params == NULL)
|
if(_params == NULL)
|
||||||
_params = p;
|
_params = p;
|
||||||
else {
|
else {
|
||||||
@@ -252,6 +254,8 @@ bool AsyncWebServerRequest::_parseReqHead(){
|
|||||||
bool AsyncWebServerRequest::_parseReqHeader(){
|
bool AsyncWebServerRequest::_parseReqHeader(){
|
||||||
if(_temp.indexOf(':')){
|
if(_temp.indexOf(':')){
|
||||||
AsyncWebHeader *h = new AsyncWebHeader(_temp);
|
AsyncWebHeader *h = new AsyncWebHeader(_temp);
|
||||||
|
if(h == NULL)
|
||||||
|
return false;
|
||||||
if(h->name() == "Host"){
|
if(h->name() == "Host"){
|
||||||
_host = h->value();
|
_host = h->value();
|
||||||
delete h;
|
delete h;
|
||||||
@@ -610,14 +614,19 @@ void AsyncWebServerRequest::addInterestingHeader(String name){
|
|||||||
if(!_interestingHeaders->contains(name)) _interestingHeaders->add(name);
|
if(!_interestingHeaders->contains(name)) _interestingHeaders->add(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void AsyncWebServerRequest::send(AsyncWebServerResponse *response){
|
void AsyncWebServerRequest::send(AsyncWebServerResponse *response){
|
||||||
_response = 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){
|
AsyncWebServerResponse * AsyncWebServerRequest::beginResponse(int code, String contentType, String content){
|
||||||
return new AsyncBasicResponse(code, contentType, content);
|
return new AsyncBasicResponse(code, contentType, content);
|
||||||
}
|
}
|
||||||
|
@@ -28,6 +28,7 @@ class AsyncBasicResponse: public AsyncWebServerResponse {
|
|||||||
AsyncBasicResponse(int code, String contentType=String(), String content=String());
|
AsyncBasicResponse(int code, String contentType=String(), String content=String());
|
||||||
void _respond(AsyncWebServerRequest *request);
|
void _respond(AsyncWebServerRequest *request);
|
||||||
size_t _ack(AsyncWebServerRequest *request, size_t len, uint32_t time);
|
size_t _ack(AsyncWebServerRequest *request, size_t len, uint32_t time);
|
||||||
|
bool _sourceValid(){ return true; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class AsyncAbstractResponse: public AsyncWebServerResponse {
|
class AsyncAbstractResponse: public AsyncWebServerResponse {
|
||||||
@@ -36,8 +37,8 @@ class AsyncAbstractResponse: public AsyncWebServerResponse {
|
|||||||
public:
|
public:
|
||||||
void _respond(AsyncWebServerRequest *request);
|
void _respond(AsyncWebServerRequest *request);
|
||||||
size_t _ack(AsyncWebServerRequest *request, size_t len, uint32_t time);
|
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 size_t _fillBuffer(uint8_t *buf, size_t maxLen){ return 0; }
|
||||||
virtual bool _sourceValid(){ return false; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class AsyncFileResponse: public AsyncAbstractResponse {
|
class AsyncFileResponse: public AsyncAbstractResponse {
|
||||||
|
@@ -144,6 +144,7 @@ String AsyncWebServerResponse::_assembleHead(uint8_t version){
|
|||||||
bool AsyncWebServerResponse::_started(){ return _state > RESPONSE_SETUP; }
|
bool AsyncWebServerResponse::_started(){ return _state > RESPONSE_SETUP; }
|
||||||
bool AsyncWebServerResponse::_finished(){ return _state > RESPONSE_WAIT_ACK; }
|
bool AsyncWebServerResponse::_finished(){ return _state > RESPONSE_WAIT_ACK; }
|
||||||
bool AsyncWebServerResponse::_failed(){ return _state == RESPONSE_FAILED; }
|
bool AsyncWebServerResponse::_failed(){ return _state == RESPONSE_FAILED; }
|
||||||
|
bool AsyncWebServerResponse::_sourceValid(){ return false; }
|
||||||
void AsyncWebServerResponse::_respond(AsyncWebServerRequest *request){ _state = RESPONSE_END; request->client()->close(); }
|
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; }
|
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){
|
void AsyncAbstractResponse::_respond(AsyncWebServerRequest *request){
|
||||||
if(!_sourceValid()){
|
|
||||||
_state = RESPONSE_FAILED;
|
|
||||||
request->send(500);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
_head = _assembleHead(request->version());
|
_head = _assembleHead(request->version());
|
||||||
_state = RESPONSE_HEADERS;
|
_state = RESPONSE_HEADERS;
|
||||||
_ack(request, 0, 0);
|
_ack(request, 0, 0);
|
||||||
|
@@ -22,9 +22,19 @@
|
|||||||
#include "WebHandlerImpl.h"
|
#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){
|
_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);
|
}, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user