Server Side Events (#9222)

* feat: Server Side Events (SSE)

* Update libraries/WiFi/src/WiFiClient.cpp

Co-authored-by: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com>

---------

Co-authored-by: Miquel Martin <miqmago@gmail.com>
Co-authored-by: Miquel <miqmago@users.noreply.github.com>
This commit is contained in:
Lucas Saavedra Vaz 2024-02-07 12:05:58 -03:00 committed by GitHub
parent aceea3e519
commit c21a8cdaa5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 25 additions and 2 deletions

View File

@ -402,6 +402,11 @@ void WebServer::handleClient() {
_contentLength = CONTENT_LENGTH_NOT_SET;
_handleRequest();
if (_currentClient.isSSE()) {
_currentStatus = HC_WAIT_CLOSE;
_statusChange = millis();
keepCurrentClient = true;
}
// Fix for issue with Chrome based browsers: https://github.com/espressif/arduino-esp32/issues/3652
// if (_currentClient.connected()) {
// _currentStatus = HC_WAIT_CLOSE;
@ -417,6 +422,10 @@ void WebServer::handleClient() {
}
break;
case HC_WAIT_CLOSE:
if (_currentClient.isSSE()) {
// Never close connection
_statusChange = millis();
}
// Wait for client to close the connection
if (millis() - _statusChange <= HTTP_MAX_CLOSE_WAIT) {
keepCurrentClient = true;

View File

@ -187,7 +187,7 @@ public:
}
};
WiFiClient::WiFiClient():_rxBuffer(nullptr),_connected(false),_timeout(WIFI_CLIENT_DEF_CONN_TIMEOUT_MS),next(NULL)
WiFiClient::WiFiClient():_rxBuffer(nullptr),_connected(false),_sse(false),_timeout(WIFI_CLIENT_DEF_CONN_TIMEOUT_MS),next(NULL)
{
}
@ -347,7 +347,7 @@ int WiFiClient::setOption(int option, int *value)
int WiFiClient::getOption(int option, int *value)
{
socklen_t size = sizeof(int);
socklen_t size = sizeof(int);
int res = getsockopt(fd(), IPPROTO_TCP, option, (char *)value, &size);
if(res < 0) {
log_e("fail on fd %d, errno: %d, \"%s\"", fd(), errno, strerror(errno));
@ -661,3 +661,14 @@ int WiFiClient::fd() const
return clientSocketHandle->fd();
}
}
void WiFiClient::setSSE(bool sse)
{
_sse = sse;
}
bool WiFiClient::isSSE()
{
return _sse;
}

View File

@ -42,6 +42,7 @@ protected:
std::shared_ptr<WiFiClientSocketHandle> clientSocketHandle;
std::shared_ptr<WiFiClientRxBuffer> _rxBuffer;
bool _connected;
bool _sse;
int _timeout;
int _lastWriteTimeout;
int _lastReadTimeout;
@ -66,6 +67,8 @@ public:
void flush();
void stop();
uint8_t connected();
void setSSE(bool sse);
bool isSSE();
operator bool()
{