CLI(Request& context) { context.header["Content-Type"] = "text/plain; charset=utf-8"; DValue input = cli_input(context); String action = first(input["action"].to_string(), "ping"); if(action == "ping") { print("uce-unit-cli: ok\n"); print("script=", context.params["SCRIPT_FILENAME"], "\n"); return; } if(action == "echo") { print(input["message"].to_string(), "\n"); return; } if(action == "arg") { print(cli_arg(context, "message", "fallback"), "\n"); print(cli_arg(context, "missing", "fallback"), "\n"); return; } if(action == "task_repeat_unbounded") { String marker = "/tmp/uce-task-repeat-unbounded.txt"; file_unlink(marker); pid_t pid = task_repeat("uce-task-repeat-unbounded", 0.05, [marker]() { file_put_contents(marker, "ran"); }, 0); usleep(200000); bool ran = file_get_contents(marker) == "ran"; if(pid > 0) task_kill(pid, 15); file_unlink(marker); print(pid > 0 && ran ? "task repeat unbounded ok\n" : "task repeat unbounded failed\n"); return; } if(action == "mysql_unsigned_params") { MySQL db; StringMap params; params["limit"] = "1"; String parsed = db.parse_query_parameters("SELECT 7 LIMIT :limit!", params); StringMap comparison; comparison["left"] = "7"; comparison["right"] = "8"; String inequality = db.parse_query_parameters("SELECT :left!=:right", comparison); StringMap empty_name; empty_name[""] = "1"; db.parameter_error = false; db.statement_info = ""; db.parse_query_parameters("SELECT 1 LIMIT :!", empty_name); bool empty_rejected = db.parameter_error; StringMap invalid; invalid["limit"] = "1;SELECT 9"; db.parameter_error = false; db.statement_info = ""; db.parse_query_parameters("SELECT 1 LIMIT :limit!", invalid); bool ok = parsed.find("LIMIT 1") != String::npos && inequality.find("'7'!='8'") != String::npos && empty_rejected && db.parameter_error && db.statement_info.find("must contain only decimal digits") != String::npos; print(ok ? "mysql unsigned params ok\n" : "mysql unsigned params failed: parsed=" + parsed + ", parameter_error=" + (db.parameter_error ? "1" : "0") + ", statement=" + db.statement_info + "\n"); return; } context.set_status(400, "CLI Error"); print("unknown cli action: ", action, "\n"); } RENDER(Request& context) { context.set_status(404, "Not Found"); context.header["Content-Type"] = "text/plain; charset=utf-8"; print("This unit is intended for local CLI socket invocation.\n"); }