From a6cb1c0390f7072afb42a74546cbf650f84bc914 Mon Sep 17 00:00:00 2001 From: udo Date: Mon, 6 Jul 2026 07:54:01 +0000 Subject: [PATCH] fix wasm session and mysql placeholder state --- site/tests/services.uce | 8 ++++++++ src/lib/mysql-connector.cpp | 2 +- src/wasm/backend.cpp | 11 +++++++++++ src/wasm/core.cpp | 16 +++++++++++++++- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/site/tests/services.uce b/site/tests/services.uce index 9f84f1c..5e0ff3b 100644 --- a/site/tests/services.uce +++ b/site/tests/services.uce @@ -107,6 +107,14 @@ RENDER(Request& context) mysql_placeholder_error.find("positional ? placeholders are not supported") != String::npos ? "pass" : "fail", mysql_placeholder_error ); + StringMap underscore_params; + underscore_params["display_name"] = "Ada"; + String parsed_underscore = placeholder_guard.parse_query_parameters("select :display_name as name", underscore_params); + mark( + "mysql named placeholders accept underscores", + parsed_underscore.find("'Ada'") != String::npos && parsed_underscore.find("_name") == String::npos ? "pass" : "fail", + parsed_underscore + ); MySQL mysql; mysql.connect("127.0.0.1", "root", ""); diff --git a/src/lib/mysql-connector.cpp b/src/lib/mysql-connector.cpp index 2664bfa..6998044 100644 --- a/src/lib/mysql-connector.cpp +++ b/src/lib/mysql-connector.cpp @@ -294,7 +294,7 @@ String MySQL::parse_query_parameters(String query, StringMap map) } else if(mode == 1) // identifier mode { - if(isalnum(c)) + if(isalnum(c) || c == '_') { identifier.append(1, c); } diff --git a/src/wasm/backend.cpp b/src/wasm/backend.cpp index 57df54c..4edd5e7 100644 --- a/src/wasm/backend.cpp +++ b/src/wasm/backend.cpp @@ -133,11 +133,16 @@ String wasm_backend_serve(Request& request, const String& entry_unit, const Stri for(auto& entry : source) ctx[key][entry.first] = entry.second; }; + if(request.server) + copy_map(request.server->config, "server_config"); copy_map(request.params, "params"); copy_map(request.get, "get"); copy_map(request.post, "post"); copy_map(request.cookies, "cookies"); copy_map(request.session, "session"); + ctx["session_id"] = request.session_id; + ctx["session_name"] = request.session_name; + ctx["session_loaded_hash"] = request.session_loaded_hash; ctx["entry_unit"] = entry_unit; // Raw request body: cli_input() parses a JSON CLI payload from context.in, // and serve_http handlers read it as req->in; carried into the workspace. @@ -233,6 +238,12 @@ String wasm_backend_serve(Request& request, const String& entry_unit, const Stri request.session[name] = value.to_string(); }); } + if(response.meta.key("session_id")) + request.session_id = response.meta["session_id"].to_string(); + if(response.meta.key("session_name")) + request.session_name = response.meta["session_name"].to_string(); + if(response.meta.key("session_loaded_hash")) + request.session_loaded_hash = response.meta["session_loaded_hash"].to_string(); // body into the request's primary output stream (ob_stack[0]); the // transport's assemble_output_buffer concatenates the stack diff --git a/src/wasm/core.cpp b/src/wasm/core.cpp index 9e74455..c682605 100644 --- a/src/wasm/core.cpp +++ b/src/wasm/core.cpp @@ -222,7 +222,7 @@ String MySQL::parse_query_parameters(String query, StringMap map) } else if(mode == 1) { - if(isalnum(c)) + if(isalnum(c) || c == '_') identifier.append(1, c); else { @@ -761,6 +761,9 @@ void uce_wasm_core_reset_request() wasm_response_meta = ""; wasm_request.cookies.clear(); wasm_request.session.clear(); + wasm_request.session_id = ""; + wasm_request.session_name = ""; + wasm_request.session_loaded_hash = ""; wasm_request.out = ""; wasm_request.resources.current_unit_file = ""; wasm_component_slots.clear(); @@ -787,11 +790,19 @@ int uce_wasm_apply_context(const char* buf, size_t len) dest[key] = item.to_string(); }); }; + if(decoded.key("server_config")) + apply_map(decoded.key("server_config"), wasm_server.config); apply_map(decoded.key("params"), wasm_request.params); apply_map(decoded.key("get"), wasm_request.get); apply_map(decoded.key("post"), wasm_request.post); apply_map(decoded.key("cookies"), wasm_request.cookies); apply_map(decoded.key("session"), wasm_request.session); + if(DValue* session_id = decoded.key("session_id")) + wasm_request.session_id = session_id->to_string(); + if(DValue* session_name = decoded.key("session_name")) + wasm_request.session_name = session_name->to_string(); + if(DValue* session_loaded_hash = decoded.key("session_loaded_hash")) + wasm_request.session_loaded_hash = session_loaded_hash->to_string(); DValue* entry = decoded.key("entry_unit"); if(entry) wasm_request.resources.current_unit_file = entry->to_string(); @@ -847,6 +858,9 @@ void uce_wasm_finish_response_meta() } for(auto& entry : wasm_request.session) meta["session"][entry.first] = entry.second; + meta["session_id"] = wasm_request.session_id; + meta["session_name"] = wasm_request.session_name; + meta["session_loaded_hash"] = wasm_request.session_loaded_hash; bool ws_has_commands = !wasm_request.resources.websocket_dispatch_commands._map.empty(); bool ws_state_changed = false; if(wasm_request.resources.websocket_dispatch_capture)