From a6d8253b15608ddac0cfa60467ce4f08aa0edc1b Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 16 Jul 2015 21:39:09 +0300 Subject: [PATCH 1/2] fix plain post slowdown --- libraries/ESP8266WebServer/src/Parsing.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/libraries/ESP8266WebServer/src/Parsing.cpp b/libraries/ESP8266WebServer/src/Parsing.cpp index 88877372a..e47be4386 100644 --- a/libraries/ESP8266WebServer/src/Parsing.cpp +++ b/libraries/ESP8266WebServer/src/Parsing.cpp @@ -108,20 +108,22 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { if (!isForm){ if (searchStr != "") searchStr += '&'; - String bodyLine = client.readStringUntil('\r'); + size_t plainLen = client.available(); + char *plainBuf = (char*)malloc(plainLen+1); + client.readBytes(plainBuf, plainLen); + plainBuf[plainLen] = '\0'; #ifdef DEBUG DEBUG_OUTPUT.print("Plain: "); - DEBUG_OUTPUT.println(bodyLine); + DEBUG_OUTPUT.println(plainBuf); #endif - if(bodyLine.startsWith("{") || bodyLine.startsWith("[") || bodyLine.indexOf('=') == -1){ + if(plainBuf[0] == '{' || plainBuf[0] == '[' || strstr(plainBuf, "=") == NULL){ //plain post json or other data searchStr += "plain="; - searchStr += bodyLine; - searchStr += client.readString(); + searchStr += plainBuf; } else { - searchStr += bodyLine; - client.readStringUntil('\n'); + searchStr += plainBuf; } + free(plainBuf); } _parseArguments(searchStr); if (isForm){ From 1c3225f38797e1336d1bbdb8b24e3e1f6a0ab689 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 16 Jul 2015 23:56:36 +0300 Subject: [PATCH 2/2] post body might not be sent with the headers since optimistic_yield() was implemented, at this point we might not have the body yet, so we should give it a chance to be sent and put in the buffer --- libraries/ESP8266WebServer/src/Parsing.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/ESP8266WebServer/src/Parsing.cpp b/libraries/ESP8266WebServer/src/Parsing.cpp index e47be4386..682839d13 100644 --- a/libraries/ESP8266WebServer/src/Parsing.cpp +++ b/libraries/ESP8266WebServer/src/Parsing.cpp @@ -108,6 +108,10 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { if (!isForm){ if (searchStr != "") searchStr += '&'; + //some clients send headers first and data after (like we do) + //give them a chance + int tries = 100;//100ms max wait + while(!client.available() && tries--)delay(1); size_t plainLen = client.available(); char *plainBuf = (char*)malloc(plainLen+1); client.readBytes(plainBuf, plainLen);