From 0260cd66a3438ae09811f6cd16efd51944004af4 Mon Sep 17 00:00:00 2001 From: WebDust21 Date: Thu, 11 Aug 2022 07:44:22 -0400 Subject: [PATCH] =?UTF-8?q?WebServer:=20rename=20&=20expose=20internal=20'?= =?UTF-8?q?contentLength'=20variable=20for=20POST=E2=80=A6=20(#7012)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libraries/WebServer/src/Parsing.cpp | 19 +++++++++---------- libraries/WebServer/src/WebServer.cpp | 2 ++ libraries/WebServer/src/WebServer.h | 13 ++++++++----- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/libraries/WebServer/src/Parsing.cpp b/libraries/WebServer/src/Parsing.cpp index a5bfb0710..1debeb730 100644 --- a/libraries/WebServer/src/Parsing.cpp +++ b/libraries/WebServer/src/Parsing.cpp @@ -80,7 +80,7 @@ bool WebServer::_parseRequest(WiFiClient& client) { //reset header value for (int i = 0; i < _headerKeysCount; ++i) { _currentHeaders[i].value =String(); - } + } // First line of HTTP request looks like "GET /path HTTP/1.1" // Retrieve the "/path" part by finding the spaces @@ -103,6 +103,7 @@ bool WebServer::_parseRequest(WiFiClient& client) { } _currentUri = url; _chunked = false; + _clientContentLength = 0; // not known yet, or invalid HTTPMethod method = HTTP_ANY; size_t num_methods = sizeof(_http_method_str) / sizeof(const char *); @@ -136,7 +137,6 @@ bool WebServer::_parseRequest(WiFiClient& client) { String headerValue; bool isForm = false; bool isEncoded = false; - uint32_t contentLength = 0; //parse headers while(1){ req = client.readStringUntil('\r'); @@ -167,7 +167,7 @@ bool WebServer::_parseRequest(WiFiClient& client) { isForm = true; } } else if (headerName.equalsIgnoreCase(F("Content-Length"))){ - contentLength = headerValue.toInt(); + _clientContentLength = headerValue.toInt(); } else if (headerName.equalsIgnoreCase(F("Host"))){ _hostHeader = headerValue; } @@ -175,12 +175,12 @@ bool WebServer::_parseRequest(WiFiClient& client) { if (!isForm){ size_t plainLength; - char* plainBuf = readBytesWithTimeout(client, contentLength, plainLength, HTTP_MAX_POST_WAIT); - if (plainLength < contentLength) { + char* plainBuf = readBytesWithTimeout(client, _clientContentLength, plainLength, HTTP_MAX_POST_WAIT); + if (plainLength < _clientContentLength) { free(plainBuf); return false; } - if (contentLength > 0) { + if (_clientContentLength > 0) { if(isEncoded){ //url encoded form if (searchStr != "") searchStr += '&'; @@ -200,11 +200,10 @@ bool WebServer::_parseRequest(WiFiClient& client) { // No content - but we can still have arguments in the URL. _parseArguments(searchStr); } - } - - if (isForm){ + } else { + // it IS a form _parseArguments(searchStr); - if (!_parseForm(client, boundaryStr, contentLength)) { + if (!_parseForm(client, boundaryStr, _clientContentLength)) { return false; } } diff --git a/libraries/WebServer/src/WebServer.cpp b/libraries/WebServer/src/WebServer.cpp index 2acc8acb9..66c01198f 100644 --- a/libraries/WebServer/src/WebServer.cpp +++ b/libraries/WebServer/src/WebServer.cpp @@ -57,6 +57,7 @@ WebServer::WebServer(IPAddress addr, int port) , _headerKeysCount(0) , _currentHeaders(nullptr) , _contentLength(0) +, _clientContentLength(0) , _chunked(false) { log_v("WebServer::Webserver(addr=%s, port=%d)", addr.toString().c_str(), port); @@ -80,6 +81,7 @@ WebServer::WebServer(int port) , _headerKeysCount(0) , _currentHeaders(nullptr) , _contentLength(0) +, _clientContentLength(0) , _chunked(false) { log_v("WebServer::Webserver(port=%d)", port); diff --git a/libraries/WebServer/src/WebServer.h b/libraries/WebServer/src/WebServer.h index e0a92a46e..fc60d1649 100644 --- a/libraries/WebServer/src/WebServer.h +++ b/libraries/WebServer/src/WebServer.h @@ -105,11 +105,13 @@ public: int args(); // get arguments count bool hasArg(String name); // check if argument exists void collectHeaders(const char* headerKeys[], const size_t headerKeysCount); // set the request headers to collect - String header(String name); // get request header value by name - String header(int i); // get request header value by number - String headerName(int i); // get request header name by number - int headers(); // get header count - bool hasHeader(String name); // check if header exists + String header(String name); // get request header value by name + String header(int i); // get request header value by number + String headerName(int i); // get request header name by number + int headers(); // get header count + bool hasHeader(String name); // check if header exists + + int clientContentLength() { return _clientContentLength; } // return "content-length" of incoming HTTP header from "_currentClient" String hostHeader(); // get request host header if available or empty String if not @@ -198,6 +200,7 @@ protected: int _headerKeysCount; RequestArgument* _currentHeaders; size_t _contentLength; + int _clientContentLength; // "Content-Length" from header of incoming POST or GET request String _responseHeaders; String _hostHeader;