Refactor FastCGI server and compiler, enhance HTTP header parsing, and add WebSocket support

- Refactored FastCGIServer class to improve socket handling and added shutdown functionality.
- Updated compiler functions to streamline HTML and text literal processing.
- Enhanced split_kv function to support uppercase keys and added split_http_headers for better HTTP header parsing.
- Introduced new session management functions to validate and handle session IDs.
- Added WebSocket frame parsing and handling in the URI module.
- Created systemd service scripts for easier deployment and management of the UCE FastCGI runtime.
- Added new test cases for header handling, time parsing, and WebSocket functionality.
This commit is contained in:
udo
2026-04-18 14:04:58 +00:00
parent 984453f336
commit cd8f07aaa7
26 changed files with 913 additions and 367 deletions
+25
View File
@@ -0,0 +1,25 @@
RENDER()
{
DTree t;
<>
<link rel="stylesheet" href='style.css'></link>
<h1>
<a href="index.uce">UCE Test</a>:
Header
</h1>
Response Headers
<pre style="white-space: pre-wrap"><?
print(var_dump(context->header));
?></pre>
Params
<pre><?= var_dump(context->params) ?></pre>
</>
}
+3
View File
@@ -33,6 +33,9 @@ RENDER()
<li><a href="task_repeat.uce">Task repeat</a></li>
<li><a href="utf8.uce">UTF-8</a></li>
<li><a href="call_file.uce">call_file()</a></li>
<li><a href="parse_time.uce">parse_time()</a></li>
<li><a href="header.uce">header</a></li>
<li><a href="websockets.ws.uce">WebSockets</a></li>
</ul>
<pre><?
print("Worker PID: ", my_pid, "\n");
+30
View File
@@ -0,0 +1,30 @@
RENDER()
{
String raw = first(context->post["raw"], "today");
<>
<link rel="stylesheet" href='style.css'></link>
<h1>
<a href="index.uce">UCE Test</a>:
parse_time
</h1>
<form action="?" method="post">
<div>
<label>Time string</label>
<input type="text" name="raw" value="<?= raw ?>"/>
</div>
<div>
<input type="submit" value="Parse"/>
</div>
</form>
<pre><?
print(date("%Y-%m-%d %H:%M", parse_time(raw)));
?></pre>
<pre><?= var_dump(context->params) ?></pre>
</>
}
+42
View File
@@ -0,0 +1,42 @@
RENDER()
{
String raw = first(context->post["raw"], "today");
String server_url = context->params["HTTP_HOST"]+context->params["DOCUMENT_URI"];
<>
<link rel="stylesheet" href='style.css'></link>
<h1>
<a href="index.uce">UCE Test</a>:
WebSocket Test
</h1>
<form action="?" method="post">
<div>
<label></label>
<input type="text" name="raw" value="<?= raw ?>"/>
</div>
<div>
<input type="submit" value="Parse"/>
</div>
</form>
<pre id="log"></pre>
<script>
const ws = new WebSocket('wss://<?= server_url ?>');
const log_element = document.getElementById('log');
log_element.append('Connecting to wss://<?= server_url ?>...' + "\n");
ws.addEventListener('open', (event) => {
log_element.append('Connection open' + "\n");
ws.send('Hello, server!');
});
ws.addEventListener('message', (event) => {
log_element.append('Message: ' + JSON.stringify(event.data) + "\n");
});
ws.addEventListener('close', (event) => {
log_element.append('Connection closed' + "\n");
});
ws.addEventListener('error', (event) => {
log_element.append('Error: ' + JSON.stringify(event) + "\n");
});
</script>
<pre><?= var_dump(context->params) ?></pre>
</>
}