Enhance WebSocket support: add opcode handling, binary message support, and improve connection validation

This commit is contained in:
udo
2026-04-18 18:41:50 +00:00
parent 86dc93864e
commit 46d98a092f
25 changed files with 623 additions and 69 deletions
+19 -1
View File
@@ -58,6 +58,20 @@ String ws_scope()
return(current_ws_scope());
}
u8 ws_opcode()
{
if(!context)
return(0);
return(context->resources.websocket_opcode);
}
bool ws_is_binary()
{
if(!context)
return(false);
return(context->resources.websocket_is_binary);
}
StringList ws_connections(String scope)
{
return(server.websocket_connection_ids(normalize_ws_scope(scope)));
@@ -173,7 +187,7 @@ int handle_complete(FastCGIRequest& request) {
return 0;
}
int handle_websocket_message(FastCGIRequest& request, const String& message)
int handle_websocket_message(FastCGIRequest& request, const String& message, u8 opcode)
{
Request event_request;
ByteStream ws_output;
@@ -202,6 +216,9 @@ int handle_websocket_message(FastCGIRequest& request, const String& message)
event_request.var["ws"]["connection_id"] = request.resources.websocket_connection_id;
event_request.var["ws"]["scope"] = request.resources.websocket_scope;
event_request.var["ws"]["connection_count"] = (f64)server.websocket_connection_ids(request.resources.websocket_scope).size();
event_request.var["ws"]["opcode"] = (f64)opcode;
event_request.var["ws"]["is_binary"].set_bool(request.resources.websocket_is_binary);
event_request.var["ws"]["is_text"].set_bool(request.resources.websocket_is_text);
event_request.var["ws"]["document_uri"] = first(
request.params["DOCUMENT_URI"],
request.params["REQUEST_URI"]
@@ -210,6 +227,7 @@ int handle_websocket_message(FastCGIRequest& request, const String& message)
call_param["message"] = message;
call_param["connection_id"] = request.resources.websocket_connection_id;
call_param["scope"] = request.resources.websocket_scope;
call_param["opcode"] = (f64)opcode;
call_param["document_uri"] = event_request.var["ws"]["document_uri"].to_string();
compiler_invoke_websocket(&event_request, request.params["SCRIPT_FILENAME"], call_param);