diff --git a/libraries/ESP8266WebServer/keywords.txt b/libraries/ESP8266WebServer/keywords.txt index 22e3d74e42..4f35e1ffe3 100644 --- a/libraries/ESP8266WebServer/keywords.txt +++ b/libraries/ESP8266WebServer/keywords.txt @@ -34,3 +34,4 @@ onNotFound KEYWORD2 HTTP_GET LITERAL1 HTTP_POST LITERAL1 HTTP_ANY LITERAL1 +CONTENT_LENGTH_UNKNOWN LITERAL1 diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp index 6b97505ee1..d1a0f04357 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp @@ -433,6 +433,9 @@ void ESP8266WebServer::sendContent(const String& content) { _currentClient.write(content.c_str(), len); if(_chunked){ _currentClient.write(footer, 2); + if (len == 0) { + _chunked = false; + } } } @@ -453,6 +456,9 @@ void ESP8266WebServer::sendContent_P(PGM_P content, size_t size) { _currentClient.write_P(content, size); if(_chunked){ _currentClient.write(footer, 2); + if (size == 0) { + _chunked = false; + } } } @@ -560,19 +566,27 @@ void ESP8266WebServer::_handleRequest() { } #endif } - + if (!handled && _notFoundHandler) { + _notFoundHandler(); + handled = true; + } if (!handled) { - if(_notFoundHandler) { - _notFoundHandler(); - } - else { - send(404, "text/plain", String("Not found: ") + _currentUri); - } + send(404, "text/plain", String("Not found: ") + _currentUri); + handled = true; + } + if (handled) { + _finalizeResponse(); } - _currentUri = String(); } + +void ESP8266WebServer::_finalizeResponse() { + if (_chunked) { + sendContent(""); + } +} + String ESP8266WebServer::_responseCodeToString(int code) { switch (code) { case 100: return F("Continue"); diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.h b/libraries/ESP8266WebServer/src/ESP8266WebServer.h index 6eeb9f9789..6ccb7d06df 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.h @@ -142,6 +142,7 @@ template size_t streamFile(T &file, const String& contentType){ protected: void _addRequestHandler(RequestHandler* handler); void _handleRequest(); + void _finalizeResponse(); bool _parseRequest(WiFiClient& client); void _parseArguments(String data); static String _responseCodeToString(int code);