From da872a9638eac1e573dc9389c644729ec8f24cac Mon Sep 17 00:00:00 2001 From: Christian Schuster Date: Tue, 17 Oct 2017 22:07:17 +0200 Subject: [PATCH] allocate HTTPUpload struct on demand (#2557) --- .../ESP8266WebServer/src/ESP8266WebServer.cpp | 5 ++ .../ESP8266WebServer/src/ESP8266WebServer.h | 5 +- libraries/ESP8266WebServer/src/Parsing.cpp | 49 ++++++++++--------- 3 files changed, 33 insertions(+), 26 deletions(-) diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp index 8bc385328e..54386068b4 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp @@ -279,6 +279,7 @@ void ESP8266WebServer::handleClient() { if (!_currentClient.connected()) { _currentClient = WiFiClient(); _currentStatus = HC_NONE; + _currentUpload.reset(); return; } @@ -288,6 +289,7 @@ void ESP8266WebServer::handleClient() { if (millis() - _statusChange > HTTP_MAX_DATA_WAIT) { _currentClient = WiFiClient(); _currentStatus = HC_NONE; + _currentUpload.reset(); } yield(); return; @@ -296,6 +298,7 @@ void ESP8266WebServer::handleClient() { if (!_parseRequest(_currentClient)) { _currentClient = WiFiClient(); _currentStatus = HC_NONE; + _currentUpload.reset(); return; } _currentClient.setTimeout(HTTP_MAX_SEND_WAIT); @@ -305,6 +308,7 @@ void ESP8266WebServer::handleClient() { if (!_currentClient.connected()) { _currentClient = WiFiClient(); _currentStatus = HC_NONE; + _currentUpload.reset(); return; } else { _currentStatus = HC_WAIT_CLOSE; @@ -317,6 +321,7 @@ void ESP8266WebServer::handleClient() { if (millis() - _statusChange > HTTP_MAX_CLOSE_WAIT) { _currentClient = WiFiClient(); _currentStatus = HC_NONE; + _currentUpload.reset(); } else { yield(); return; diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.h b/libraries/ESP8266WebServer/src/ESP8266WebServer.h index cd410f5b3e..1c31d8c78a 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.h @@ -25,6 +25,7 @@ #define ESP8266WEBSERVER_H #include +#include #include enum HTTPMethod { HTTP_ANY, HTTP_GET, HTTP_POST, HTTP_PUT, HTTP_PATCH, HTTP_DELETE, HTTP_OPTIONS }; @@ -93,7 +94,7 @@ class ESP8266WebServer String uri() { return _currentUri; } HTTPMethod method() { return _currentMethod; } WiFiClient client() { return _currentClient; } - HTTPUpload& upload() { return _currentUpload; } + HTTPUpload& upload() { return *_currentUpload; } String arg(String name); // get request argument value by name String arg(int i); // get request argument value by number @@ -177,7 +178,7 @@ template size_t streamFile(T &file, const String& contentType){ int _currentArgCount; RequestArgument* _currentArgs; - HTTPUpload _currentUpload; + std::unique_ptr _currentUpload; int _headerKeysCount; RequestArgument* _currentHeaders; diff --git a/libraries/ESP8266WebServer/src/Parsing.cpp b/libraries/ESP8266WebServer/src/Parsing.cpp index 84b2cceca2..581439227b 100644 --- a/libraries/ESP8266WebServer/src/Parsing.cpp +++ b/libraries/ESP8266WebServer/src/Parsing.cpp @@ -345,13 +345,13 @@ void ESP8266WebServer::_parseArguments(String data) { } void ESP8266WebServer::_uploadWriteByte(uint8_t b){ - if (_currentUpload.currentSize == HTTP_UPLOAD_BUFLEN){ + if (_currentUpload->currentSize == HTTP_UPLOAD_BUFLEN){ if(_currentHandler && _currentHandler->canUpload(_currentUri)) - _currentHandler->upload(*this, _currentUri, _currentUpload); - _currentUpload.totalSize += _currentUpload.currentSize; - _currentUpload.currentSize = 0; + _currentHandler->upload(*this, _currentUri, *_currentUpload); + _currentUpload->totalSize += _currentUpload->currentSize; + _currentUpload->currentSize = 0; } - _currentUpload.buf[_currentUpload.currentSize++] = b; + _currentUpload->buf[_currentUpload->currentSize++] = b; } uint8_t ESP8266WebServer::_uploadReadByte(WiFiClient& client){ @@ -453,21 +453,22 @@ bool ESP8266WebServer::_parseForm(WiFiClient& client, String boundary, uint32_t break; } } else { - _currentUpload.status = UPLOAD_FILE_START; - _currentUpload.name = argName; - _currentUpload.filename = argFilename; - _currentUpload.type = argType; - _currentUpload.totalSize = 0; - _currentUpload.currentSize = 0; + _currentUpload.reset(new HTTPUpload()); + _currentUpload->status = UPLOAD_FILE_START; + _currentUpload->name = argName; + _currentUpload->filename = argFilename; + _currentUpload->type = argType; + _currentUpload->totalSize = 0; + _currentUpload->currentSize = 0; #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("Start File: "); - DEBUG_OUTPUT.print(_currentUpload.filename); + DEBUG_OUTPUT.print(_currentUpload->filename); DEBUG_OUTPUT.print(" Type: "); - DEBUG_OUTPUT.println(_currentUpload.type); + DEBUG_OUTPUT.println(_currentUpload->type); #endif if(_currentHandler && _currentHandler->canUpload(_currentUri)) - _currentHandler->upload(*this, _currentUri, _currentUpload); - _currentUpload.status = UPLOAD_FILE_WRITE; + _currentHandler->upload(*this, _currentUri, *_currentUpload); + _currentUpload->status = UPLOAD_FILE_WRITE; uint8_t argByte = _uploadReadByte(client); readfile: while(argByte != 0x0D){ @@ -503,18 +504,18 @@ bool ESP8266WebServer::_parseForm(WiFiClient& client, String boundary, uint32_t if (strstr((const char*)endBuf, boundary.c_str()) != NULL){ if(_currentHandler && _currentHandler->canUpload(_currentUri)) - _currentHandler->upload(*this, _currentUri, _currentUpload); - _currentUpload.totalSize += _currentUpload.currentSize; - _currentUpload.status = UPLOAD_FILE_END; + _currentHandler->upload(*this, _currentUri, *_currentUpload); + _currentUpload->totalSize += _currentUpload->currentSize; + _currentUpload->status = UPLOAD_FILE_END; if(_currentHandler && _currentHandler->canUpload(_currentUri)) - _currentHandler->upload(*this, _currentUri, _currentUpload); + _currentHandler->upload(*this, _currentUri, *_currentUpload); #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("End File: "); - DEBUG_OUTPUT.print(_currentUpload.filename); + DEBUG_OUTPUT.print(_currentUpload->filename); DEBUG_OUTPUT.print(" Type: "); - DEBUG_OUTPUT.print(_currentUpload.type); + DEBUG_OUTPUT.print(_currentUpload->type); DEBUG_OUTPUT.print(" Size: "); - DEBUG_OUTPUT.println(_currentUpload.totalSize); + DEBUG_OUTPUT.println(_currentUpload->totalSize); #endif line = client.readStringUntil(0x0D); client.readStringUntil(0x0A); @@ -604,8 +605,8 @@ String ESP8266WebServer::urlDecode(const String& text) } bool ESP8266WebServer::_parseFormUploadAborted(){ - _currentUpload.status = UPLOAD_FILE_ABORTED; + _currentUpload->status = UPLOAD_FILE_ABORTED; if(_currentHandler && _currentHandler->canUpload(_currentUri)) - _currentHandler->upload(*this, _currentUri, _currentUpload); + _currentHandler->upload(*this, _currentUri, *_currentUpload); return false; }