Fix up websocket writable behavior
This commit is contained in:
+21
-22
@@ -232,17 +232,9 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
WebSocketContext<SSL, isServer> *init() {
|
WebSocketContext<SSL, isServer> *init() {
|
||||||
/* Open is never called, we only adopt sockets */
|
/* Adopting a socket does not trigger open event.
|
||||||
/* Always assume timeout is disabled when we are adopted.
|
* We arreive as WebSocket with timeout set and
|
||||||
* HTTP requests should disable timeout anyways */
|
* any backpressure from HTTP state kept. */
|
||||||
|
|
||||||
// beroende på state, skall close emitta eller inte emitta vår event
|
|
||||||
// om den sakll emitta, då blir det 1006 och noll meddelande
|
|
||||||
// annars, har vi redan emittat från den funktion som vi anropade dvs websocket::Close
|
|
||||||
|
|
||||||
// det tar 15 minuter för en ACK att tima ut
|
|
||||||
// så, vi ska endast nollställa timeout om vi skrivit och kernel har tagit emit den
|
|
||||||
// vi kan inte nollställa timeout vid send som inte lyckades
|
|
||||||
|
|
||||||
/* Handle socket disconnections */
|
/* Handle socket disconnections */
|
||||||
static_dispatch(us_ssl_socket_context_on_close, us_socket_context_on_close)(getSocketContext(), [](auto *s) {
|
static_dispatch(us_ssl_socket_context_on_close, us_socket_context_on_close)(getSocketContext(), [](auto *s) {
|
||||||
@@ -266,8 +258,6 @@ private:
|
|||||||
return s;
|
return s;
|
||||||
});
|
});
|
||||||
|
|
||||||
// writable, data samt send skall nollställa timeouten till idleTimeout? allitd
|
|
||||||
|
|
||||||
/* Handle WebSocket data streams */
|
/* Handle WebSocket data streams */
|
||||||
static_dispatch(us_ssl_socket_context_on_data, us_socket_context_on_data)(getSocketContext(), [](auto *s, char *data, int length) {
|
static_dispatch(us_ssl_socket_context_on_data, us_socket_context_on_data)(getSocketContext(), [](auto *s, char *data, int length) {
|
||||||
|
|
||||||
@@ -316,26 +306,37 @@ private:
|
|||||||
/* Handle HTTP write out (note: SSL_read may trigger this spuriously, the app need to handle spurious calls) */
|
/* Handle HTTP write out (note: SSL_read may trigger this spuriously, the app need to handle spurious calls) */
|
||||||
static_dispatch(us_ssl_socket_context_on_writable, us_socket_context_on_writable)(getSocketContext(), [](auto *s) {
|
static_dispatch(us_ssl_socket_context_on_writable, us_socket_context_on_writable)(getSocketContext(), [](auto *s) {
|
||||||
|
|
||||||
// check if we already shut down the us socket and return?
|
/* It makes sense to check for us_is_shut_down here and return if so, to avoid shutting down twice */
|
||||||
|
if (static_dispatch(us_ssl_socket_is_shut_down, us_socket_is_shut_down)((SOCKET_TYPE *) s)) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
AsyncSocket<SSL> *webSocket = (AsyncSocket<SSL> *) s;
|
AsyncSocket<SSL> *webSocket = (AsyncSocket<SSL> *) s;
|
||||||
WebSocketData *webSocketData = (WebSocketData *)(static_dispatch(us_ssl_socket_ext, us_socket_ext)(s));
|
WebSocketData *webSocketData = (WebSocketData *)(static_dispatch(us_ssl_socket_ext, us_socket_ext)(s));
|
||||||
|
|
||||||
|
/* We store old backpressure since it is unclear whether write drained anything */
|
||||||
|
int backpressure = webSocket->getBufferedAmount();
|
||||||
|
|
||||||
/* Drain as much as possible */
|
/* Drain as much as possible */
|
||||||
webSocket->write(nullptr, 0);
|
webSocket->write(nullptr, 0);
|
||||||
|
|
||||||
/* Are we in (WebSocket) shutdown mode? As in, have we called WebSocket::close? */
|
/* Behavior: if we actively drain backpressure, always reset timeout (even if we are in shutdown) */
|
||||||
|
if (backpressure < webSocket->getBufferedAmount()) {
|
||||||
|
WebSocketContextData<SSL> *webSocketContextData = (WebSocketContextData<SSL> *) static_dispatch(us_ssl_socket_context_ext, us_socket_context_ext)(
|
||||||
|
static_dispatch(us_ssl_socket_get_context, us_socket_get_context)((SOCKET_TYPE *)s)
|
||||||
|
);
|
||||||
|
webSocket->timeout(webSocketContextData->idleTimeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Are we in (WebSocket) shutdown mode? */
|
||||||
if (webSocketData->isShuttingDown) {
|
if (webSocketData->isShuttingDown) {
|
||||||
/* Check if we just now drained completely */
|
/* Check if we just now drained completely */
|
||||||
if (webSocket->getBufferedAmount() == 0) {
|
if (webSocket->getBufferedAmount() == 0) {
|
||||||
/* Now perform the actual TCP/TLS shutdown which was postponed due to backpressure */
|
/* Now perform the actual TCP/TLS shutdown which was postponed due to backpressure */
|
||||||
webSocket->shutdown();
|
webSocket->shutdown();
|
||||||
|
|
||||||
/* Set us to not shutting down so to avoid any spurious extra calls */
|
|
||||||
webSocketData->isShuttingDown = false;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else if (backpressure > webSocket->getBufferedAmount()) {
|
||||||
/* Call drain event even though nothing might actually changed */
|
/* Only call drain if we actually drained backpressure */
|
||||||
WebSocketContextData<SSL> *webSocketContextData = (WebSocketContextData<SSL> *) static_dispatch(us_ssl_socket_context_ext, us_socket_context_ext)(
|
WebSocketContextData<SSL> *webSocketContextData = (WebSocketContextData<SSL> *) static_dispatch(us_ssl_socket_context_ext, us_socket_context_ext)(
|
||||||
static_dispatch(us_ssl_socket_get_context, us_socket_get_context)((SOCKET_TYPE *)s)
|
static_dispatch(us_ssl_socket_get_context, us_socket_get_context)((SOCKET_TYPE *)s)
|
||||||
);
|
);
|
||||||
@@ -348,8 +349,6 @@ private:
|
|||||||
return s;
|
return s;
|
||||||
});
|
});
|
||||||
|
|
||||||
// dessa nedan är samma oavsett state, de closar alltid!
|
|
||||||
|
|
||||||
/* Handle FIN, HTTP does not support half-closed sockets, so simply close */
|
/* Handle FIN, HTTP does not support half-closed sockets, so simply close */
|
||||||
static_dispatch(us_ssl_socket_context_on_end, us_socket_context_on_end)(getSocketContext(), [](auto *s) {
|
static_dispatch(us_ssl_socket_context_on_end, us_socket_context_on_end)(getSocketContext(), [](auto *s) {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user