Skip to content

Commit 474af1a

Browse files
committed
WebServer: Allow client to send many requests on the same connection
1 parent 1134194 commit 474af1a

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h

+15-1
Original file line numberDiff line numberDiff line change
@@ -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>
374380
void 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";

libraries/ESP8266WebServer/src/ESP8266WebServer.h

+8
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,13 @@ class ESP8266WebServerTemplate
168168
sendContent(emptyString);
169169
}
170170

171+
// Whether other requests should be accepted from the client on the
172+
// same socket after a response is sent.
173+
// This will automatically configure the "Connection" header.
174+
// Defaults to false.
175+
void keepAlive(bool keepAlive) { _keepAlive = keepAlive; }
176+
bool keepAlive() { return _keepAlive; }
177+
171178
static String credentialHash(const String& username, const String& realm, const String& password);
172179

173180
static String urlDecode(const String& text);
@@ -224,6 +231,7 @@ class ESP8266WebServerTemplate
224231
uint8_t _currentVersion;
225232
HTTPClientStatus _currentStatus;
226233
unsigned long _statusChange;
234+
bool _keepAlive;
227235

228236
RequestHandlerType* _currentHandler;
229237
RequestHandlerType* _firstHandler;

0 commit comments

Comments
 (0)