WebServer: Solve HTTP request delay by dropping idle connections (#1537)

Serve next wificlient (http_request) if current client does not have data
This commit was merged in pull request #1537.
This commit is contained in:
hreintke
2023-06-15 07:39:02 -07:00
committed by GitHub
parent 50646b9e70
commit 9b3032cd58
3 changed files with 80 additions and 73 deletions
-67
View File
@@ -237,73 +237,6 @@ void HTTPServer::serveStatic(const char* uri, FS& fs, const char* path, const ch
_addRequestHandler(new StaticRequestHandler(fs, path, uri, cache_header));
}
void HTTPServer::httpHandleClient() {
bool keepCurrentClient = false;
bool callYield = false;
if (_currentClient->connected()) {
switch (_currentStatus) {
case HC_NONE:
// No-op to avoid C++ compiler warning
break;
case HC_WAIT_READ:
// Wait for data from client to become available
if (_currentClient->available()) {
switch (_parseRequest(_currentClient)) {
case CLIENT_REQUEST_CAN_CONTINUE:
// Because HTTP_MAX_SEND_WAIT is expressed in milliseconds, it must be divided by 1000
_currentClient->setTimeout(HTTP_MAX_SEND_WAIT / 1000);
_contentLength = CONTENT_LENGTH_NOT_SET;
_handleRequest();
/* fallthrough */
case CLIENT_REQUEST_IS_HANDLED:
if (_currentClient->connected() || _currentClient->available()) {
_currentStatus = HC_WAIT_CLOSE;
_statusChange = millis();
keepCurrentClient = true;
} else {
log_v("webserver: peer has closed after served\n");
}
break;
case CLIENT_MUST_STOP:
log_v("Close client\n");
_currentClient->stop();
break;
case CLIENT_IS_GIVEN:
// client must not be stopped but must not be handled here anymore
// (example: tcp connection given to websocket)
log_v("Give client\n");
break;
} // switch _parseRequest()
} else { // !_currentClient->available()
if (millis() - _statusChange <= HTTP_MAX_DATA_WAIT) {
keepCurrentClient = true;
}
callYield = true;
}
break;
case HC_WAIT_CLOSE:
// Wait for client to close the connection
if (millis() - _statusChange <= HTTP_MAX_CLOSE_WAIT) {
keepCurrentClient = true;
callYield = true;
}
}
}
if (!keepCurrentClient) {
if (_currentClient) {
delete _currentClient;
_currentClient = nullptr;
}
_currentStatus = HC_NONE;
_currentUpload.reset();
}
if (callYield) {
yield();
}
}
void HTTPServer::httpClose() {
_currentStatus = HC_NONE;