Skip to content

Commit

Permalink
Server Side Events (#9222)
Browse files Browse the repository at this point in the history
* feat: Server Side Events (SSE)

* Update libraries/WiFi/src/WiFiClient.cpp

Co-authored-by: Lucas Saavedra Vaz <[email protected]>

---------

Co-authored-by: Miquel Martin <[email protected]>
Co-authored-by: Miquel <[email protected]>
  • Loading branch information
3 people authored Feb 7, 2024
1 parent aceea3e commit c21a8cd
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 2 deletions.
9 changes: 9 additions & 0 deletions libraries/WebServer/src/WebServer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down
15 changes: 13 additions & 2 deletions libraries/WiFi/src/WiFiClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ class WiFiClientSocketHandle {
}
};

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)
{
}

Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -661,3 +661,14 @@ int WiFiClient::fd() const
return clientSocketHandle->fd();
}
}

void WiFiClient::setSSE(bool sse)
{
_sse = sse;
}

bool WiFiClient::isSSE()
{
return _sse;
}

3 changes: 3 additions & 0 deletions libraries/WiFi/src/WiFiClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ class WiFiClient : public ESPLwIPClient
std::shared_ptr<WiFiClientSocketHandle> clientSocketHandle;
std::shared_ptr<WiFiClientRxBuffer> _rxBuffer;
bool _connected;
bool _sse;
int _timeout;
int _lastWriteTimeout;
int _lastReadTimeout;
Expand All @@ -66,6 +67,8 @@ class WiFiClient : public ESPLwIPClient
void flush();
void stop();
uint8_t connected();
void setSSE(bool sse);
bool isSSE();

operator bool()
{
Expand Down

0 comments on commit c21a8cd

Please sign in to comment.