Skip to content

Commit

Permalink
maxLifetime impl. WIP, waiting for uSockets bump
Browse files Browse the repository at this point in the history
  • Loading branch information
uNetworkingAB committed Dec 27, 2022
1 parent 27d93c8 commit b647f20
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 2 deletions.
11 changes: 9 additions & 2 deletions src/App.h
Original file line number Diff line number Diff line change
Expand Up @@ -261,8 +261,14 @@ struct TemplatedApp {
std::terminate();
}

if (behavior.idleTimeout % 4) {
std::cerr << "Warning: idleTimeout should be a multiple of 4!" << std::endl;
/* Maximum idleTimeout is ≈17 minutes */
if (behavior.idleTimeout % 4 || behavior.idleTimeout >= 254 * 4) {
std::cerr << "Warning: idleTimeout should be a multiple of 4 and must be less than or equal to 1016 seconds!" << std::endl;
}

/* Maximum maxLifetime is ≈4 hours */
if (behavior.maxLifetime % 60 || behavior.maxLifetime > 254 * 60) {
std::cerr << "Warning: maxLifetime should be a multiple of 60 and must be less than or equal to 15240 seconds!" << std::endl;
}

/* If we don't have a TopicTree yet, create one now */
Expand Down Expand Up @@ -366,6 +372,7 @@ struct TemplatedApp {
webSocketContext->getExt()->closeOnBackpressureLimit = behavior.closeOnBackpressureLimit;
webSocketContext->getExt()->resetIdleTimeoutOnSend = behavior.resetIdleTimeoutOnSend;
webSocketContext->getExt()->sendPingsAutomatically = behavior.sendPingsAutomatically;
webSocketContext->getExt()->maxLifetime = behavior.maxLifetime;
webSocketContext->getExt()->compression = behavior.compression;

/* Calculate idleTimeoutCompnents */
Expand Down
3 changes: 3 additions & 0 deletions src/HttpResponse.h
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,9 @@ struct HttpResponse : public AsyncSocket<SSL> {
httpContextData->upgradedWebSocket = webSocket;
}

/* Arm maxLifetime timeout */
us_socket_long_timeout(SSL, (us_socket_t *) webSocket, webSocketContextData->maxLifetime);

/* Arm idleTimeout */
us_socket_timeout(SSL, (us_socket_t *) webSocket, webSocketContextData->idleTimeoutComponents.first);

Expand Down
6 changes: 6 additions & 0 deletions src/WebSocketContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,12 @@ struct WebSocketContext {
return s;
});

us_socket_context_on_long_timeout(SSL, getSocketContext(), [](auto *s) {
((WebSocket<SSL, isServer, USERDATA> *) s)->end();

return s;
});

/* Handle socket timeouts, simply close them so to not confuse client with FIN */
us_socket_context_on_timeout(SSL, getSocketContext(), [](auto *s) {

Expand Down
1 change: 1 addition & 0 deletions src/WebSocketContextData.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ struct WebSocketContextData {
bool closeOnBackpressureLimit;
bool resetIdleTimeoutOnSend;
bool sendPingsAutomatically;
unsigned short maxLifetime;

/* These are calculated on creation */
std::pair<unsigned short, unsigned short> idleTimeoutComponents;
Expand Down

0 comments on commit b647f20

Please sign in to comment.