stability improvements for low memory

This commit is contained in:
Me No Dev 2016-04-08 17:43:16 +03:00
parent ced8ac1c4c
commit b1e1450bfb
5 changed files with 29 additions and 12 deletions

View File

@ -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);
};

View File

@ -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);
}

View File

@ -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 {

View File

@ -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);

View File

@ -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);
}