mirror of
https://github.com/defold/extension-websocket.git
synced 2025-09-30 01:02:18 +02:00
Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
8a9dc759a4 | ||
|
70afde4cfa | ||
|
ed6d131470 | ||
|
2c9c0b74f1 | ||
|
8450a88640 | ||
|
3636ea73db | ||
|
1cc1d802b3 | ||
|
94bcc82f25 | ||
|
d62a53cbcc |
@@ -19,7 +19,11 @@
|
||||
members:
|
||||
- name: timeout
|
||||
type: number
|
||||
desc: Timeout for the connection sequence (milliseconds). Not used on HTML5. Default: 3000
|
||||
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
|
||||
@@ -55,11 +59,7 @@
|
||||
|
||||
- name: message
|
||||
type: string
|
||||
desc: The received data. Only valid if event is `websocket.EVENT_MESSAGE`
|
||||
|
||||
- name: error
|
||||
type: string
|
||||
desc: The error string. Only valid if event is `websocket.EVENT_ERROR`
|
||||
desc: The received data if event is `websocket.EVENT_MESSAGE`. Error message otherwise
|
||||
|
||||
|
||||
returns:
|
||||
@@ -79,7 +79,7 @@
|
||||
update_gui(self)
|
||||
log("Connected: " .. tostring(conn))
|
||||
elseif data.event == websocket.EVENT_ERROR then
|
||||
log("Error: '" .. data.error .. "'")
|
||||
log("Error: '" .. data.message .. "'")
|
||||
elseif data.event == websocket.EVENT_MESSAGE then
|
||||
log("Receiving: '" .. tostring(data.message) .. "'")
|
||||
end
|
||||
|
@@ -40,8 +40,12 @@ static Result SendClientHandshakeHeaders(WebsocketConnection* conn)
|
||||
dmSnPrintf(port, sizeof(port), ":%d", conn->m_Url.m_Port);
|
||||
|
||||
dmSocket::Result sr;
|
||||
WS_SENDALL("GET /");
|
||||
WS_SENDALL(conn->m_Url.m_Path);
|
||||
WS_SENDALL("GET ");
|
||||
if (conn->m_Url.m_Path[0] == '\0') {
|
||||
WS_SENDALL("/"); // Default to / for empty path
|
||||
} else {
|
||||
WS_SENDALL(conn->m_Url.m_Path);
|
||||
}
|
||||
WS_SENDALL(" HTTP/1.1\r\n");
|
||||
WS_SENDALL("Host: ");
|
||||
WS_SENDALL(conn->m_Url.m_Hostname);
|
||||
@@ -66,6 +70,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:
|
||||
@@ -109,17 +119,12 @@ Result ReceiveHeaders(WebsocketConnection* conn)
|
||||
#else
|
||||
Result ReceiveHeaders(WebsocketConnection* conn)
|
||||
{
|
||||
dmSocket::Selector selector;
|
||||
dmSocket::SelectorZero(&selector);
|
||||
dmSocket::SelectorSet(&selector, dmSocket::SELECTOR_KIND_READ, conn->m_Socket);
|
||||
|
||||
dmSocket::Result sr = dmSocket::Select(&selector, SOCKET_WAIT_TIMEOUT);
|
||||
|
||||
dmSocket::Result sr = WaitForSocket(conn, dmSocket::SELECTOR_KIND_READ, SOCKET_WAIT_TIMEOUT);
|
||||
if (dmSocket::RESULT_OK != sr)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -202,9 +207,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)
|
||||
|
@@ -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') {
|
||||
|
@@ -91,6 +91,7 @@ namespace dmWebsocket
|
||||
dmArray<Message> 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;
|
||||
|
Reference in New Issue
Block a user