@@ -80,6 +80,7 @@ ESP8266WebServer::~ESP8266WebServer() {
8080}
8181
8282void ESP8266WebServer::begin () {
83+ _currentStatus = HC_NONE;
8384 _server.begin ();
8485 if (!_headerKeysCount)
8586 collectHeaders (0 , 0 );
@@ -155,28 +156,67 @@ void ESP8266WebServer::serveStatic(const char* uri, FS& fs, const char* path, co
155156}
156157
157158void ESP8266WebServer::handleClient () {
158- WiFiClient client = _server.available ();
159- if (!client) {
160- return ;
161- }
159+ if (_currentStatus == HC_NONE) {
160+ WiFiClient client = _server.available ();
161+ if (!client) {
162+ return ;
163+ }
162164
163165#ifdef DEBUG_ESP_HTTP_SERVER
164- DEBUG_OUTPUT.println (" New client" );
166+ DEBUG_OUTPUT.println (" New client" );
165167#endif
166168
167- // Wait for data from client to become available
168- uint16_t maxWait = HTTP_MAX_DATA_WAIT;
169- while (client.connected () && !client.available () && maxWait--){
170- delay (1 );
169+ _currentClient = client;
170+ _currentStatus = HC_WAIT_READ;
171+ _statusChange = millis ();
171172 }
172173
173- if (!_parseRequest (client)) {
174+ if (!_currentClient.connected ()) {
175+ _currentClient = WiFiClient ();
176+ _currentStatus = HC_NONE;
174177 return ;
175178 }
176179
177- _currentClient = client;
178- _contentLength = CONTENT_LENGTH_NOT_SET;
179- _handleRequest ();
180+ // Wait for data from client to become available
181+ if (_currentStatus == HC_WAIT_READ) {
182+ if (!_currentClient.available ()) {
183+ if (millis () - _statusChange > HTTP_MAX_DATA_WAIT) {
184+ _currentClient = WiFiClient ();
185+ _currentStatus = HC_NONE;
186+ }
187+ yield ();
188+ return ;
189+ }
190+
191+ if (!_parseRequest (_currentClient)) {
192+ _currentClient = WiFiClient ();
193+ _currentStatus = HC_NONE;
194+ return ;
195+ }
196+
197+ _contentLength = CONTENT_LENGTH_NOT_SET;
198+ _handleRequest ();
199+
200+ if (!_currentClient.connected ()) {
201+ _currentClient = WiFiClient ();
202+ _currentStatus = HC_NONE;
203+ return ;
204+ } else {
205+ _currentStatus = HC_WAIT_CLOSE;
206+ _statusChange = millis ();
207+ return ;
208+ }
209+ }
210+
211+ if (_currentStatus == HC_WAIT_CLOSE) {
212+ if (millis () - _statusChange > HTTP_MAX_CLOSE_WAIT) {
213+ _currentClient = WiFiClient ();
214+ _currentStatus = HC_NONE;
215+ } else {
216+ yield ();
217+ return ;
218+ }
219+ }
180220}
181221
182222void ESP8266WebServer::close () {
@@ -443,12 +483,7 @@ void ESP8266WebServer::_handleRequest() {
443483 }
444484 }
445485
446- uint16_t maxWait = HTTP_MAX_CLOSE_WAIT;
447- while (_currentClient.connected () && maxWait--) {
448- delay (1 );
449- }
450- _currentClient = WiFiClient ();
451- _currentUri = String ();
486+ _currentUri = String ();
452487}
453488
454489const char * ESP8266WebServer::_responseCodeToString (int code) {
0 commit comments