From 85539d0ff2b9bd870462d19ad9a6848cb8e1f611 Mon Sep 17 00:00:00 2001 From: anschrammh Date: Mon, 15 Apr 2019 08:00:27 +0200 Subject: [PATCH] Reworked timeout + other improvements --- src/app/WEBServerManager.cpp | 48 ++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/src/app/WEBServerManager.cpp b/src/app/WEBServerManager.cpp index 342462a..c6ff148 100644 --- a/src/app/WEBServerManager.cpp +++ b/src/app/WEBServerManager.cpp @@ -84,15 +84,22 @@ boolean WEBServerManager::parseQuery(WiFiClient *wifiClient) { char readChar(0), *parseBuffer(NULL), *parseKey(NULL), *parseValue(NULL); boolean smallTimeout(false), isKey(true); + unsigned int shortTimeout = 100, longTimeout = 5000, activeTimeout = shortTimeout; + /* Better way to read data + char temp[2048]; + temp[wifiClient->read((uint8_t*)temp,2040)] = '\0'; + Serial.print(temp); + */ _httpParserState = INIT; _clientTimeout = millis(); - boolean slashesOrantiSlashesOnly(true); - while(wifiClient->available() || millis() - _clientTimeout < (smallTimeout ? 100 : 5000)) + boolean slashesOrAntiSlashesOnly(true); + while(wifiClient->available() || millis() - _clientTimeout < (smallTimeout ? activeTimeout : 10000)) { if(wifiClient->available()) { readChar = (char)wifiClient->read(); + #ifdef DEBUG_RAW Serial.print(readChar); #endif @@ -109,12 +116,11 @@ boolean WEBServerManager::parseQuery(WiFiClient *wifiClient) _httpParserState = ERROR; break; case LINE_BREAK: - if(readChar == '\n') - _httpParserState = BODY_SECTION; - else if(readChar != '\r') - _httpParserState = PARAMETER_SECTION; - - break; + if(readChar == '\n') + _httpParserState = BODY_SECTION; + else if(readChar != '\r') + _httpParserState = PARAMETER_SECTION; + break; case HTTP_VERB_SECTION: if(readChar >= 65 && readChar <= 90) { @@ -132,17 +138,20 @@ boolean WEBServerManager::parseQuery(WiFiClient *wifiClient) _httpParserState = ERROR; break; case HTTP_RESOURCE_SECTION: - if(readChar == '?' ) - { - free(_httpRequestData.httpResource);_httpRequestData.httpResource = NULL; - _httpRequestData.httpResource = parseBuffer;parseBuffer = NULL; + if(_httpRequestData.HRM == POST) + activeTimeout = longTimeout; + + if(readChar == '?' ) + { + free(_httpRequestData.httpResource);_httpRequestData.httpResource = NULL; + _httpRequestData.httpResource = parseBuffer;parseBuffer = NULL; - _httpParserState = HTTP_RESOURCE_PARAM_SECTION; - } + _httpParserState = HTTP_RESOURCE_PARAM_SECTION; + } else if(readChar == ' ') { free(_httpRequestData.httpResource);_httpRequestData.httpResource = NULL; - if(slashesOrantiSlashesOnly) + if(slashesOrAntiSlashesOnly) { free(parseBuffer);parseBuffer = NULL; _httpRequestData.httpResource = (char *) malloc(sizeof(char)*2); @@ -155,7 +164,7 @@ boolean WEBServerManager::parseQuery(WiFiClient *wifiClient) } else { - if(readChar != '/' && readChar != '\\') slashesOrantiSlashesOnly = false; + if(readChar != '/' && readChar != '\\') slashesOrAntiSlashesOnly = false; parseBuffer = addChar(parseBuffer, readChar); _httpParserState = HTTP_RESOURCE_SECTION; @@ -200,7 +209,7 @@ boolean WEBServerManager::parseQuery(WiFiClient *wifiClient) } break; case BODY_SECTION: - parseBuffer = addChar(parseBuffer, readChar); + //parseBuffer = addChar(parseBuffer, readChar); break; case PARAMETER_SECTION: if(readChar == '\n') @@ -219,14 +228,17 @@ boolean WEBServerManager::parseQuery(WiFiClient *wifiClient) _clientTimeout = millis(); smallTimeout = true; } + ESP.wdtFeed(); } if(parseBuffer != NULL) + { if(strlen(parseBuffer) > 0) { _httpRequestData.httpBody = parseBuffer; parseBuffer = NULL; } + } #ifdef DEBUG Serial.print("HTTP VERB : "); @@ -322,7 +334,7 @@ boolean WEBServerManager::sendPageToClientFromSdCard(WiFiClient *wifiClient) pageToSend.close(); break; - default://If not supported + default: //If not supported wifiClient->print(F("HTTP/1.1 405 Method Not Allowed\r\nContent-Type: text/html\r\n\r\n\r\n\r\n

Method Not Allowed

\r\n")); break; }