From 1cc1d802b3909eb4bf349757e7e22be4892aa810 Mon Sep 17 00:00:00 2001 From: JCash Date: Sat, 31 Oct 2020 10:14:44 +0100 Subject: [PATCH 1/2] Issue 16: Added protocol as a connection parameter --- websocket/src/handshake.cpp | 11 +++++++---- websocket/src/websocket.cpp | 10 ++++++++++ websocket/src/websocket.h | 1 + 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/websocket/src/handshake.cpp b/websocket/src/handshake.cpp index ed81461..2f2f7e4 100644 --- a/websocket/src/handshake.cpp +++ b/websocket/src/handshake.cpp @@ -66,6 +66,12 @@ static Result SendClientHandshakeHeaders(WebsocketConnection* conn) } } + if (conn->m_Protocol) { + WS_SENDALL("Sec-WebSocket-Protocol: "); + WS_SENDALL(conn->m_Protocol); + WS_SENDALL("\r\n"); + } + WS_SENDALL("\r\n"); bail: @@ -114,7 +120,7 @@ Result ReceiveHeaders(WebsocketConnection* conn) { if (dmSocket::RESULT_WOULDBLOCK) { - DebugLog(1, "Waiting for socket to be available for reading"); + DebugLog(2, "Waiting for socket to be available for reading"); return RESULT_WOULDBLOCK; } @@ -197,9 +203,6 @@ Result VerifyHeaders(WebsocketConnection* conn) bool connection = false; bool upgrade = false; bool valid_key = false; - const char* protocol = ""; - - // TODO: Perhaps also support the Sec-WebSocket-Protocol // parse the headers in place while (r < endtag) diff --git a/websocket/src/websocket.cpp b/websocket/src/websocket.cpp index 38ab469..6df1c9d 100644 --- a/websocket/src/websocket.cpp +++ b/websocket/src/websocket.cpp @@ -212,6 +212,7 @@ static void DestroyConnection(WebsocketConnection* conn) #endif free((void*)conn->m_CustomHeaders); + free((void*)conn->m_Protocol); if (conn->m_Callback) dmScript::DestroyCallback(conn->m_Callback); @@ -271,6 +272,7 @@ static int LuaConnect(lua_State* L) const char* url = luaL_checkstring(L, 1); lua_Number timeout = dmScript::CheckTableNumber(L, 2, "timeout", 3000); const char* custom_headers = dmScript::CheckTableString(L, 2, "headers", 0); + const char* protocol = dmScript::CheckTableString(L, 2, "protocol", 0); if (custom_headers != 0) { @@ -283,6 +285,7 @@ static int LuaConnect(lua_State* L) WebsocketConnection* conn = CreateConnection(url); conn->m_ConnectTimeout = dmTime::GetTime() + timeout * 1000; conn->m_CustomHeaders = custom_headers ? strdup(custom_headers) : 0; + conn->m_Protocol = protocol ? strdup(protocol) : 0; conn->m_Callback = dmScript::CreateCallback(L, 3); @@ -709,6 +712,13 @@ static dmExtension::Result OnUpdate(dmExtension::Params* params) #if defined(__EMSCRIPTEN__) conn->m_SSLSocket = dmSSLSocket::INVALID_SOCKET_HANDLE; + if (conn->m_Protocol) { + EM_ASM({ + // https://emscripten.org/docs/porting/networking.html#emulated-posix-tcp-sockets-over-websockets + Module["websocket"]["subprotocol"] = UTF8ToString($0); + }, conn->m_Protocol); + } + char uri_buffer[dmURI::MAX_URI_LEN]; const char* uri; if (conn->m_Url.m_Path[0] != '\0') { diff --git a/websocket/src/websocket.h b/websocket/src/websocket.h index 156c6a4..9464f4b 100644 --- a/websocket/src/websocket.h +++ b/websocket/src/websocket.h @@ -91,6 +91,7 @@ namespace dmWebsocket dmArray m_Messages; // lengths of the messages in the data buffer uint64_t m_ConnectTimeout; uint8_t m_Key[16]; + const char* m_Protocol; const char* m_CustomHeaders; State m_State; char* m_Buffer; From 3636ea73dbc0959b0b93633375e8a2d5c37daae4 Mon Sep 17 00:00:00 2001 From: JCash Date: Sat, 31 Oct 2020 10:18:50 +0100 Subject: [PATCH 2/2] added documentation --- websocket/api/api.script_api | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/websocket/api/api.script_api b/websocket/api/api.script_api index b45397d..7c24a03 100644 --- a/websocket/api/api.script_api +++ b/websocket/api/api.script_api @@ -21,6 +21,10 @@ type: number desc: Timeout for the connection sequence (milliseconds). Not used on HTML5. (Default is 3000) + - name: protocol + type: string + desc: the protocol to use (e.g. 'chat'). (Default is 'binary') + - name: headers type: string desc: list of http headers. Each pair is separated with "\r\n". Not used on HTML5.