From aab147e7e7e8b0c1a71214fb813d02c1405e7b2a Mon Sep 17 00:00:00 2001 From: Mathieu Carbou Date: Thu, 19 Dec 2024 10:36:02 +0100 Subject: [PATCH 1/2] Reset connection when appropriate + some code cleanup --- src/WebRequest.cpp | 18 +++++++----------- src/WebServer.cpp | 3 +-- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/WebRequest.cpp b/src/WebRequest.cpp index 18ac9c8..e96ec5f 100644 --- a/src/WebRequest.cpp +++ b/src/WebRequest.cpp @@ -89,7 +89,7 @@ void AsyncWebServerRequest::_onData(void* buf, size_t len) { // Check for null characters in header if (!str[i]) { _parseState = PARSE_REQ_FAIL; - _client->close(true); + _client->abort(); return; } if (str[i] == '\n') { @@ -160,6 +160,8 @@ void AsyncWebServerRequest::_onData(void* buf, size_t len) { if (!_sent) { if (!_response) send(501, T_text_plain, "Handler did not handle the request"); + else if (!_response->_sourceValid()) + send(500, T_text_plain, "Invalid data in handler"); _client->setRxTimeout(0); _response->_respond(this); _sent = true; @@ -587,13 +589,13 @@ void AsyncWebServerRequest::_parseLine() { if (_parseState == PARSE_REQ_START) { if (!_temp.length()) { _parseState = PARSE_REQ_FAIL; - _client->close(); + _client->abort(); } else { if (_parseReqHead()) { _parseState = PARSE_REQ_HEADERS; } else { _parseState = PARSE_REQ_FAIL; - _client->close(); + _client->abort(); } } return; @@ -616,6 +618,8 @@ void AsyncWebServerRequest::_parseLine() { if (!_sent) { if (!_response) send(501, T_text_plain, "Handler did not handle the request"); + else if (!_response->_sourceValid()) + send(500, T_text_plain, "Invalid data in handler"); _client->setRxTimeout(0); _response->_respond(this); _sent = true; @@ -792,14 +796,6 @@ void AsyncWebServerRequest::send(AsyncWebServerResponse* response) { if (_response) delete _response; _response = response; - if (_response == NULL) { - _client->close(true); - _onDisconnect(); - _sent = true; - return; - } - if (!_response->_sourceValid()) - send(500); } void AsyncWebServerRequest::redirect(const char* url, int code) { diff --git a/src/WebServer.cpp b/src/WebServer.cpp index 588bd01..ebf126a 100644 --- a/src/WebServer.cpp +++ b/src/WebServer.cpp @@ -56,8 +56,7 @@ AsyncWebServer::AsyncWebServer(uint16_t port) c->setRxTimeout(3); AsyncWebServerRequest* r = new AsyncWebServerRequest((AsyncWebServer*)s, c); if (r == NULL) { - c->close(true); - c->free(); + c->abort(); delete c; } }, From 55fa42ab1edda4b76015d268cc6c9762a481766e Mon Sep 17 00:00:00 2001 From: Mathieu Carbou Date: Thu, 19 Dec 2024 10:51:55 +0100 Subject: [PATCH 2/2] Added use case for connection reset when https://192.168.4.1:80 is called --- examples/SimpleServer/SimpleServer.ino | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/SimpleServer/SimpleServer.ino b/examples/SimpleServer/SimpleServer.ino index 5b2e555..c8d74a5 100644 --- a/examples/SimpleServer/SimpleServer.ino +++ b/examples/SimpleServer/SimpleServer.ino @@ -750,6 +750,10 @@ websocat: error running } }); + // Reset connection on HTTP request: + // for i in {1..20}; do curl -v -X GET https://192.168.4.1:80; done; + // The heap size should not decrease over time. + #if __has_include("ArduinoJson.h") server.addHandler(jsonHandler); server.addHandler(msgPackHandler);