fix wasm session and mysql placeholder state

This commit is contained in:
udo 2026-07-06 07:54:01 +00:00
parent 991a0f62b4
commit a6cb1c0390
4 changed files with 35 additions and 2 deletions

View File

@ -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", "");

View File

@ -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);
}

View File

@ -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

View File

@ -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)