@@ -49,6 +49,7 @@ ESP8266WebServerTemplate<ServerType>::ESP8266WebServerTemplate(IPAddress addr, i
4949, _currentVersion(0 )
5050, _currentStatus(HC_NONE)
5151, _statusChange(0 )
52+ , _keepAlive(false )
5253, _currentHandler(nullptr )
5354, _firstHandler(nullptr )
5455, _lastHandler(nullptr )
@@ -325,6 +326,10 @@ void ESP8266WebServerTemplate<ServerType>::handleClient() {
325326 bool callYield = false ;
326327
327328 if (_currentClient.connected () || _currentClient.available ()) {
329+ if (_currentClient.available () && _keepAlive) {
330+ _currentStatus = HC_WAIT_READ;
331+ }
332+
328333 switch (_currentStatus) {
329334 case HC_NONE:
330335 // No-op to avoid C++ compiler warning
@@ -362,6 +367,7 @@ void ESP8266WebServerTemplate<ServerType>::handleClient() {
362367 if (!keepCurrentClient) {
363368 _currentClient = ClientType ();
364369 _currentStatus = HC_NONE;
370+ _keepAlive = false ;
365371 _currentUpload.reset ();
366372 }
367373
@@ -374,6 +380,7 @@ template <typename ServerType>
374380void ESP8266WebServerTemplate<ServerType>::close() {
375381 _server.close ();
376382 _currentStatus = HC_NONE;
383+ _keepAlive = false ;
377384 if (!_headerKeysCount)
378385 collectHeaders (0 , 0 );
379386}
@@ -429,7 +436,14 @@ void ESP8266WebServerTemplate<ServerType>::_prepareHeader(String& response, int
429436 if (_corsEnabled) {
430437 sendHeader (String (F (" Access-Control-Allow-Origin" )), String (" *" ));
431438 }
432- sendHeader (String (F (" Connection" )), String (F (" close" )));
439+
440+ if (_keepAlive && _server.hasClient ()) { // Disable keep alive if another client is waiting.
441+ _keepAlive = false ;
442+ }
443+ sendHeader (String (F (" Connection" )), String (_keepAlive ? F (" keep-alive" ) : F (" close" )));
444+ if (_keepAlive) {
445+ sendHeader (String (F (" Keep-Alive" )), String (F (" timeout=" )) + HTTP_MAX_CLOSE_WAIT);
446+ }
433447
434448 response += _responseHeaders;
435449 response += " \r\n " ;
0 commit comments