From 8c675236c74189194e3170471e72dc9c2fe107b3 Mon Sep 17 00:00:00 2001 From: gpepe Date: Thu, 7 Apr 2016 22:22:16 +0200 Subject: [PATCH 1/5] Update Parsing.cpp Complete read POST/GET request. --- libraries/ESP8266WebServer/src/Parsing.cpp | 23 ++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/libraries/ESP8266WebServer/src/Parsing.cpp b/libraries/ESP8266WebServer/src/Parsing.cpp index 7eac20def..a92ed13d3 100644 --- a/libraries/ESP8266WebServer/src/Parsing.cpp +++ b/libraries/ESP8266WebServer/src/Parsing.cpp @@ -138,14 +138,21 @@ 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); - plainBuf[plainLen] = '\0'; + char *plainBuf = NULL; + size_t plainLen = 0; + while ( (plainLen == 0) || (plainLen < contentLength)) + { + //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 newLen = client.available(); + if (!newLen) break; + plainBuf = (plainBuf == NULL) ? (char *) malloc(newLen + 1) : (char *) realloc(plainBuf, plainLen + newLen + 1); + client.readBytes(&plainBuf[plainLen], newLen); + plainLen += newLen; + plainBuf[plainLen] = '\0'; + } #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("Plain: "); DEBUG_OUTPUT.println(plainBuf); From 3a95fb5a94f5176b36ad2d4b545c0399495eeac7 Mon Sep 17 00:00:00 2001 From: gpepe Date: Thu, 7 Apr 2016 23:32:04 +0200 Subject: [PATCH 2/5] Update Parsing.cpp --- libraries/ESP8266WebServer/src/Parsing.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266WebServer/src/Parsing.cpp b/libraries/ESP8266WebServer/src/Parsing.cpp index a92ed13d3..61e412910 100644 --- a/libraries/ESP8266WebServer/src/Parsing.cpp +++ b/libraries/ESP8266WebServer/src/Parsing.cpp @@ -138,7 +138,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { if (!isForm){ if (searchStr != "") searchStr += '&'; - char *plainBuf = NULL; + char *plainBuf = nullptr; size_t plainLen = 0; while ( (plainLen == 0) || (plainLen < contentLength)) { @@ -148,7 +148,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { while(!client.available() && tries--)delay(1); size_t newLen = client.available(); if (!newLen) break; - plainBuf = (plainBuf == NULL) ? (char *) malloc(newLen + 1) : (char *) realloc(plainBuf, plainLen + newLen + 1); + plainBuf = (plainBuf == nullptr) ? (char *) malloc(newLen + 1) : (char *) realloc(plainBuf, plainLen + newLen + 1); client.readBytes(&plainBuf[plainLen], newLen); plainLen += newLen; plainBuf[plainLen] = '\0'; From 502c45c157086566d749ba47feb72ba27fb8d43e Mon Sep 17 00:00:00 2001 From: gpepe Date: Fri, 8 Apr 2016 04:40:51 +0200 Subject: [PATCH 3/5] Update Parsing.cpp --- libraries/ESP8266WebServer/src/Parsing.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266WebServer/src/Parsing.cpp b/libraries/ESP8266WebServer/src/Parsing.cpp index 61e412910..4b1f375fa 100644 --- a/libraries/ESP8266WebServer/src/Parsing.cpp +++ b/libraries/ESP8266WebServer/src/Parsing.cpp @@ -140,7 +140,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { if (searchStr != "") searchStr += '&'; char *plainBuf = nullptr; size_t plainLen = 0; - while ( (plainLen == 0) || (plainLen < contentLength)) + do { //some clients send headers first and data after (like we do) //give them a chance @@ -152,7 +152,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { client.readBytes(&plainBuf[plainLen], newLen); plainLen += newLen; plainBuf[plainLen] = '\0'; - } + } while (plainLen < contentLength); #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("Plain: "); DEBUG_OUTPUT.println(plainBuf); From 41bd7af07ebfae3cfd41c59d6feb5834c63fd80b Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 11 Apr 2016 16:36:37 +0200 Subject: [PATCH 4/5] slow client/network read fix --- libraries/ESP8266WebServer/src/Parsing.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libraries/ESP8266WebServer/src/Parsing.cpp b/libraries/ESP8266WebServer/src/Parsing.cpp index 4b1f375fa..af2922365 100644 --- a/libraries/ESP8266WebServer/src/Parsing.cpp +++ b/libraries/ESP8266WebServer/src/Parsing.cpp @@ -144,15 +144,16 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { { //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 newLen = client.available(); + int tries = 1000;//1000ms max wait + size_t newLen; + while( !(newLen = client.available()) && tries--) delay(1); if (!newLen) break; plainBuf = (plainBuf == nullptr) ? (char *) malloc(newLen + 1) : (char *) realloc(plainBuf, plainLen + newLen + 1); client.readBytes(&plainBuf[plainLen], newLen); plainLen += newLen; plainBuf[plainLen] = '\0'; } while (plainLen < contentLength); + if (plainBuf == nullptr) return false; #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("Plain: "); DEBUG_OUTPUT.println(plainBuf); From b72cf2cdcf178d844cc0019d60e414f85e20a2b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B3r=C3=A1sz=20P=C3=A9ter?= Date: Wed, 13 Apr 2016 08:20:07 +0200 Subject: [PATCH 5/5] if data loss, exit --- libraries/ESP8266WebServer/src/Parsing.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libraries/ESP8266WebServer/src/Parsing.cpp b/libraries/ESP8266WebServer/src/Parsing.cpp index af2922365..519918308 100644 --- a/libraries/ESP8266WebServer/src/Parsing.cpp +++ b/libraries/ESP8266WebServer/src/Parsing.cpp @@ -153,7 +153,13 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { plainLen += newLen; plainBuf[plainLen] = '\0'; } while (plainLen < contentLength); + /* if data loss, exit */ if (plainBuf == nullptr) return false; + if (plainLen < contentLength) + { + free(plainBuf); + return false; + } #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("Plain: "); DEBUG_OUTPUT.println(plainBuf);