mirror of
https://github.com/defold/extension-websocket.git
synced 2025-09-27 16:02:18 +02:00
Code cleanup
This commit is contained in:
@@ -24,21 +24,7 @@ struct WebsocketContext
|
||||
} g_Websocket;
|
||||
|
||||
|
||||
Result SetStatus(WebsocketConnection* conn, Result status, const char* format, ...)
|
||||
{
|
||||
if (conn->m_Status == RESULT_OK)
|
||||
{
|
||||
va_list lst;
|
||||
va_start(lst, format);
|
||||
|
||||
conn->m_BufferSize = vsnprintf(conn->m_Buffer, conn->m_BufferCapacity, format, lst);
|
||||
va_end(lst);
|
||||
conn->m_Status = status;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
static void HandleCallback(WebsocketConnection* conn, int event, const uint8_t* msg, size_t msg_len);
|
||||
static void HandleCallback(WebsocketConnection* conn, int event);
|
||||
|
||||
|
||||
#define STRING_CASE(_X) case _X: return #_X;
|
||||
@@ -71,7 +57,37 @@ const char* StateToString(State err)
|
||||
#undef STRING_CASE
|
||||
|
||||
#define WS_DEBUG(...)
|
||||
//#define WS_DEBUG dmLogWarning
|
||||
//#define WS_DEBUG(...) dmLogWarning(__VA_ARGS__);
|
||||
|
||||
#define CLOSE_CONN(...) \
|
||||
SetStatus(conn, RESULT_ERROR, __VA_ARGS__); \
|
||||
CloseConnection(conn);
|
||||
|
||||
|
||||
static void SetState(WebsocketConnection* conn, State state)
|
||||
{
|
||||
State prev_state = conn->m_State;
|
||||
if (prev_state != state)
|
||||
{
|
||||
conn->m_State = state;
|
||||
WS_DEBUG("%s -> %s", StateToString(prev_state), StateToString(conn->m_State));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Result SetStatus(WebsocketConnection* conn, Result status, const char* format, ...)
|
||||
{
|
||||
if (conn->m_Status == RESULT_OK)
|
||||
{
|
||||
va_list lst;
|
||||
va_start(lst, format);
|
||||
|
||||
conn->m_BufferSize = vsnprintf(conn->m_Buffer, conn->m_BufferCapacity, format, lst);
|
||||
va_end(lst);
|
||||
conn->m_Status = status;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
// ***************************************************************************************************
|
||||
// LUA functions
|
||||
@@ -100,7 +116,7 @@ static WebsocketConnection* CreateConnection(const char* url)
|
||||
static void DestroyConnection(WebsocketConnection* conn)
|
||||
{
|
||||
#if defined(HAVE_WSLAY)
|
||||
if (conn->m_State == STATE_CONNECTED)
|
||||
if (conn->m_Ctx)
|
||||
WSL_Exit(conn->m_Ctx);
|
||||
#endif
|
||||
|
||||
@@ -126,9 +142,7 @@ static void CloseConnection(WebsocketConnection* conn)
|
||||
#endif
|
||||
}
|
||||
|
||||
conn->m_State = STATE_DISCONNECTED;
|
||||
|
||||
WS_DEBUG("%s -> %s", StateToString(prev_state), StateToString(conn->m_State));
|
||||
SetState(conn, STATE_DISCONNECTED);
|
||||
}
|
||||
|
||||
static int FindConnection(WebsocketConnection* conn)
|
||||
@@ -226,17 +240,14 @@ static int LuaSend(lua_State* L)
|
||||
dmSocket::Result sr = Send(conn, string, string_length, 0);
|
||||
if (dmSocket::RESULT_OK != sr)
|
||||
{
|
||||
conn->m_Status = RESULT_ERROR;
|
||||
dmSnPrintf(conn->m_Buffer, conn->m_BufferCapacity, "Failed to send on websocket");
|
||||
HandleCallback(conn, EVENT_ERROR, 0, 0);
|
||||
CloseConnection(conn);
|
||||
CLOSE_CONN("Failed to send on websocket");
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void HandleCallback(WebsocketConnection* conn, int event, const uint8_t* msg, size_t msg_len)
|
||||
static void HandleCallback(WebsocketConnection* conn, int event)
|
||||
{
|
||||
if (!dmScript::IsCallbackValid(conn->m_Callback))
|
||||
return;
|
||||
@@ -257,17 +268,12 @@ static void HandleCallback(WebsocketConnection* conn, int event, const uint8_t*
|
||||
lua_pushinteger(L, event);
|
||||
lua_setfield(L, -2, "event");
|
||||
|
||||
lua_pushinteger(L, conn->m_Status);
|
||||
lua_setfield(L, -2, "status");
|
||||
|
||||
if (conn->m_Status != RESULT_OK)
|
||||
{
|
||||
lua_pushstring(L, conn->m_Buffer);
|
||||
if (EVENT_ERROR == event) {
|
||||
lua_pushlstring(L, conn->m_Buffer, conn->m_BufferSize);
|
||||
lua_setfield(L, -2, "error");
|
||||
}
|
||||
|
||||
if (msg != 0) {
|
||||
lua_pushlstring(L, (const char*)msg, msg_len);
|
||||
else if (EVENT_MESSAGE == event) {
|
||||
lua_pushlstring(L, conn->m_Buffer, conn->m_BufferSize);
|
||||
lua_setfield(L, -2, "message");
|
||||
}
|
||||
|
||||
@@ -381,17 +387,18 @@ static dmExtension::Result WebsocketOnUpdate(dmExtension::Params* params)
|
||||
{
|
||||
uint32_t size = g_Websocket.m_Connections.Size();
|
||||
|
||||
#define CLOSE_CONN(MSG, ...) \
|
||||
dmLogError(MSG, __VA_ARGS__); \
|
||||
CloseConnection(conn);
|
||||
|
||||
for (uint32_t i = 0; i < size; ++i)
|
||||
{
|
||||
WebsocketConnection* conn = g_Websocket.m_Connections[i];
|
||||
|
||||
if (STATE_DISCONNECTED == conn->m_State)
|
||||
{
|
||||
HandleCallback(conn, EVENT_DISCONNECTED, 0, 0);
|
||||
if (RESULT_OK != conn->m_Status)
|
||||
{
|
||||
HandleCallback(conn, EVENT_ERROR);
|
||||
}
|
||||
|
||||
HandleCallback(conn, EVENT_DISCONNECTED);
|
||||
|
||||
g_Websocket.m_Connections.EraseSwap(i);
|
||||
--i;
|
||||
@@ -415,7 +422,7 @@ static dmExtension::Result WebsocketOnUpdate(dmExtension::Params* params)
|
||||
}
|
||||
#else
|
||||
int recv_bytes = 0;
|
||||
dmSocket::Result sr = Receive(conn, conn->m_Buffer, conn->m_BufferCapacity, &recv_bytes);
|
||||
dmSocket::Result sr = Receive(conn, conn->m_Buffer, conn->m_BufferCapacity-1, &recv_bytes);
|
||||
if( sr == dmSocket::RESULT_WOULDBLOCK )
|
||||
{
|
||||
continue;
|
||||
@@ -424,19 +431,19 @@ static dmExtension::Result WebsocketOnUpdate(dmExtension::Params* params)
|
||||
if (dmSocket::RESULT_OK == sr)
|
||||
{
|
||||
conn->m_BufferSize += recv_bytes;
|
||||
conn->m_Buffer[conn->m_BufferCapacity-1] = 0;
|
||||
conn->m_HasMessage = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
CLOSE_CONN("Websocket failed to receive data %s", dmSocket::ResultToString(sr));
|
||||
conn->m_State = STATE_DISCONNECTED;
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (conn->m_HasMessage)
|
||||
{
|
||||
HandleCallback(conn, EVENT_MESSAGE, (uint8_t*)conn->m_Buffer, conn->m_BufferSize);
|
||||
HandleCallback(conn, EVENT_MESSAGE);
|
||||
conn->m_HasMessage = 0;
|
||||
conn->m_BufferSize = 0;
|
||||
}
|
||||
@@ -466,7 +473,6 @@ static dmExtension::Result WebsocketOnUpdate(dmExtension::Params* params)
|
||||
int r = WSL_Init(&conn->m_Ctx, g_Websocket.m_BufferSize, (void*)conn);
|
||||
if (0 != r)
|
||||
{
|
||||
SetStatus(conn, RESULT_FAIL_WSLAY_INIT, "Failed initializing wslay: %s", WSL_ResultToString(r));
|
||||
CLOSE_CONN("Failed initializing wslay: %s", WSL_ResultToString(r));
|
||||
continue;
|
||||
}
|
||||
@@ -481,11 +487,9 @@ static dmExtension::Result WebsocketOnUpdate(dmExtension::Params* params)
|
||||
|
||||
conn->m_Buffer[0] = 0;
|
||||
conn->m_BufferSize = 0;
|
||||
conn->m_State = STATE_CONNECTED;
|
||||
|
||||
WS_DEBUG("STATE_HANDSHAKE -> STATE_CONNECTED");
|
||||
|
||||
HandleCallback(conn, EVENT_CONNECTED, 0, 0);
|
||||
SetState(conn, STATE_CONNECTED);
|
||||
HandleCallback(conn, EVENT_CONNECTED);
|
||||
}
|
||||
else if (STATE_HANDSHAKE_WRITE == conn->m_State)
|
||||
{
|
||||
@@ -500,8 +504,7 @@ static dmExtension::Result WebsocketOnUpdate(dmExtension::Params* params)
|
||||
continue;
|
||||
}
|
||||
|
||||
conn->m_State = STATE_HANDSHAKE_READ;
|
||||
WS_DEBUG("STATE_HANDSHAKE_WRITE -> STATE_HANDSHAKE_READ");
|
||||
SetState(conn, STATE_HANDSHAKE_READ);
|
||||
}
|
||||
else if (STATE_CONNECTING == conn->m_State)
|
||||
{
|
||||
@@ -519,9 +522,7 @@ static dmExtension::Result WebsocketOnUpdate(dmExtension::Params* params)
|
||||
|
||||
conn->m_Socket = dmConnectionPool::GetSocket(g_Websocket.m_Pool, conn->m_Connection);
|
||||
conn->m_SSLSocket = dmConnectionPool::GetSSLSocket(g_Websocket.m_Pool, conn->m_Connection);
|
||||
conn->m_State = STATE_HANDSHAKE_WRITE;
|
||||
|
||||
WS_DEBUG("STATE_CONNECTING -> STATE_HANDSHAKE");
|
||||
SetState(conn, STATE_HANDSHAKE_WRITE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -532,3 +533,4 @@ static dmExtension::Result WebsocketOnUpdate(dmExtension::Params* params)
|
||||
|
||||
DM_DECLARE_EXTENSION(Websocket, LIB_NAME, dmWebsocket::WebsocketAppInitialize, dmWebsocket::WebsocketAppFinalize, dmWebsocket::WebsocketInitialize, dmWebsocket::WebsocketOnUpdate, 0, dmWebsocket::WebsocketFinalize)
|
||||
|
||||
#undef CLOSE_CONN
|
||||
|
@@ -79,7 +79,7 @@ namespace dmWebsocket
|
||||
#ifdef __GNUC__
|
||||
Result SetStatus(WebsocketConnection* conn, Result status, const char* fmt, ...) __attribute__ ((format (printf, 3, 4)));
|
||||
#else
|
||||
Result SetStatus(WebsocketCOnnection* conn, Result status, const char* fmt, ...);
|
||||
Result SetStatus(WebsocketConnection* conn, Result status, const char* fmt, ...);
|
||||
#endif
|
||||
|
||||
// Communication
|
||||
|
@@ -80,22 +80,6 @@ ssize_t WSL_RecvCallback(wslay_event_context_ptr ctx, uint8_t *buf, size_t len,
|
||||
{
|
||||
WebsocketConnection* conn = (WebsocketConnection*)user_data;
|
||||
|
||||
// struct Session *session = (struct Session*)user_data;
|
||||
// ssize_t r;
|
||||
// while((r = recv(session->fd, buf, len, 0)) == -1 && errno == EINTR);
|
||||
// if(r == -1) {
|
||||
// if(errno == EAGAIN || errno == EWOULDBLOCK) {
|
||||
// wslay_event_set_error(ctx, WSLAY_ERR_WOULDBLOCK);
|
||||
// } else {
|
||||
// wslay_event_set_error(ctx, WSLAY_ERR_CALLBACK_FAILURE);
|
||||
// }
|
||||
// } else if(r == 0) {
|
||||
// /* Unexpected EOF is also treated as an error */
|
||||
// wslay_event_set_error(ctx, WSLAY_ERR_CALLBACK_FAILURE);
|
||||
// r = -1;
|
||||
// }
|
||||
// return r;
|
||||
|
||||
int r = -1; // received bytes if >=0, error if < 0
|
||||
|
||||
dmSocket::Result socket_result = Receive(conn, buf, len, &r);
|
||||
@@ -119,36 +103,9 @@ ssize_t WSL_SendCallback(wslay_event_context_ptr ctx, const uint8_t *data, size_
|
||||
{
|
||||
WebsocketConnection* conn = (WebsocketConnection*)user_data;
|
||||
|
||||
// struct Session *session = (struct Session*)user_data;
|
||||
// ssize_t r;
|
||||
|
||||
// int sflags = 0;
|
||||
// // #ifdef MSG_MORE
|
||||
// // if(flags & WSLAY_MSG_MORE) {
|
||||
// // sflags |= MSG_MORE;
|
||||
// // }
|
||||
// // #endif // MSG_MORE
|
||||
// while((r = send(session->fd, data, len, sflags)) == -1 && errno == EINTR);
|
||||
// if(r == -1) {
|
||||
// if(errno == EAGAIN || errno == EWOULDBLOCK) {
|
||||
// wslay_event_set_error(ctx, WSLAY_ERR_WOULDBLOCK);
|
||||
// } else {
|
||||
// wslay_event_set_error(ctx, WSLAY_ERR_CALLBACK_FAILURE);
|
||||
// }
|
||||
// }
|
||||
// return r;
|
||||
|
||||
int sent_bytes = 0;
|
||||
dmSocket::Result socket_result = Send(conn, (const char*)data, len, &sent_bytes);
|
||||
|
||||
// dmSocket::Result socket_result;
|
||||
// int r = -1; // sent bytes if >=0, error if < 0
|
||||
|
||||
// do {
|
||||
// socket_result = dmSocket::Send(conn->m_Socket, data, len, &r);
|
||||
// }
|
||||
// while (r == -1 && socket_result == dmSocket::RESULT_INTR);
|
||||
|
||||
if (socket_result != dmSocket::RESULT_OK)
|
||||
{
|
||||
if (socket_result == dmSocket::RESULT_WOULDBLOCK || socket_result == dmSocket::RESULT_TRY_AGAIN)
|
||||
@@ -174,24 +131,6 @@ void WSL_OnMsgRecvCallback(wslay_event_context_ptr ctx, const struct wslay_event
|
||||
} else if (arg->opcode == WSLAY_CONNECTION_CLOSE)
|
||||
{
|
||||
// TODO: Store the reason
|
||||
|
||||
// close_code = arg->status_code;
|
||||
// size_t len = arg->msg_length;
|
||||
// close_reason = "";
|
||||
// if (len > 2 /* first 2 bytes = close code */) {
|
||||
// close_reason.parse_utf8((char *)arg->msg + 2, len - 2);
|
||||
// }
|
||||
// if (!wslay_event_get_close_sent(_data->ctx)) {
|
||||
// if (_data->is_server) {
|
||||
// WSLServer *helper = (WSLServer *)_data->obj;
|
||||
// helper->_on_close_request(_data->id, close_code, close_reason);
|
||||
// } else {
|
||||
// WSLClient *helper = (WSLClient *)_data->obj;
|
||||
// helper->_on_close_request(close_code, close_reason);
|
||||
// }
|
||||
// }
|
||||
|
||||
//SetStatus(conn, RESULT_NOT_CONNECTED, "Websocket received close event for %s", conn->m_Url.m_Hostname);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user