diff --git a/src/ESPAsyncWebServer.h b/src/ESPAsyncWebServer.h index c4c48c7..d7056b1 100644 --- a/src/ESPAsyncWebServer.h +++ b/src/ESPAsyncWebServer.h @@ -322,6 +322,7 @@ class AsyncWebHandler { virtual void handleRequest(AsyncWebServerRequest *request __attribute__((unused))){} virtual void handleUpload(AsyncWebServerRequest *request __attribute__((unused)), const String& filename __attribute__((unused)), size_t index __attribute__((unused)), uint8_t *data __attribute__((unused)), size_t len __attribute__((unused)), bool final __attribute__((unused))){} virtual void handleBody(AsyncWebServerRequest *request __attribute__((unused)), uint8_t *data __attribute__((unused)), size_t len __attribute__((unused)), size_t index __attribute__((unused)), size_t total __attribute__((unused))){} + virtual bool isRequestHandlerTrivial(){return true;} }; /* diff --git a/src/SPIFFSEditor.h b/src/SPIFFSEditor.h index 115a3df..3586429 100644 --- a/src/SPIFFSEditor.h +++ b/src/SPIFFSEditor.h @@ -18,6 +18,7 @@ class SPIFFSEditor: public AsyncWebHandler { virtual bool canHandle(AsyncWebServerRequest *request) override final; virtual void handleRequest(AsyncWebServerRequest *request) override final; virtual void handleUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) override final; + virtual bool isRequestHandlerTrivial() override final {return false;} }; #endif diff --git a/src/WebHandlerImpl.h b/src/WebHandlerImpl.h index b3c84e3..b2da6fe 100644 --- a/src/WebHandlerImpl.h +++ b/src/WebHandlerImpl.h @@ -104,6 +104,7 @@ class AsyncCallbackWebHandler: public AsyncWebHandler { if(_onBody) _onBody(request, data, len, index, total); } + virtual bool isRequestHandlerTrivial() override final {return _onRequest ? false : true;} }; #endif /* ASYNCWEBSERVERHANDLERIMPL_H_ */ diff --git a/src/WebRequest.cpp b/src/WebRequest.cpp index 1a1d6d5..daf652a 100644 --- a/src/WebRequest.cpp +++ b/src/WebRequest.cpp @@ -127,12 +127,18 @@ void AsyncWebServerRequest::_onData(void *buf, size_t len){ } } } else if(_parseState == PARSE_REQ_BODY){ + // A handler should be already attached at this point in _parseLine function. + // If handler does nothing (_onRequest is NULL), we don't need to really parse the body. + const bool needParse = _handler && !_handler->isRequestHandlerTrivial(); if(_isMultipart){ - size_t i; - for(i=0; ihandleBody(this, (uint8_t*)buf, len, _parsedLength, _contentLength); _parsedLength += len; - } else { + } else if(needParse) { size_t i; for(i=0; i