@@ -80,6 +80,7 @@ ESP8266WebServer::~ESP8266WebServer() {
80
80
}
81
81
82
82
void ESP8266WebServer::begin () {
83
+ _currentStatus = HC_NONE;
83
84
_server.begin ();
84
85
if (!_headerKeysCount)
85
86
collectHeaders (0 , 0 );
@@ -155,28 +156,67 @@ void ESP8266WebServer::serveStatic(const char* uri, FS& fs, const char* path, co
155
156
}
156
157
157
158
void 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
+ }
162
164
163
165
#ifdef DEBUG_ESP_HTTP_SERVER
164
- DEBUG_OUTPUT.println (" New client" );
166
+ DEBUG_OUTPUT.println (" New client" );
165
167
#endif
166
168
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 ();
171
172
}
172
173
173
- if (!_parseRequest (client)) {
174
+ if (!_currentClient.connected ()) {
175
+ _currentClient = WiFiClient ();
176
+ _currentStatus = HC_NONE;
174
177
return ;
175
178
}
176
179
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
+ }
180
220
}
181
221
182
222
void ESP8266WebServer::close () {
@@ -442,12 +482,7 @@ void ESP8266WebServer::_handleRequest() {
442
482
}
443
483
}
444
484
445
- uint16_t maxWait = HTTP_MAX_CLOSE_WAIT;
446
- while (_currentClient.connected () && maxWait--) {
447
- delay (1 );
448
- }
449
- _currentClient = WiFiClient ();
450
- _currentUri = String ();
485
+ _currentUri = String ();
451
486
}
452
487
453
488
const char * ESP8266WebServer::_responseCodeToString (int code) {
0 commit comments