1
0
Fork 0
forked from fun/fun

Added some basic CGI support using kcgi plus a lot of fixes and content updates. (0.41.9)

This commit is contained in:
Johannes Findeisen 2026-05-09 10:47:33 +02:00
commit 604c415c0c
25 changed files with 407 additions and 13 deletions

10
src/vm/kcgi/end.c Normal file
View file

@ -0,0 +1,10 @@
/* KCGI_END */
case OP_KCGI_END: {
#ifdef FUN_WITH_KCGI
if (g_kcgi_req) { kcgi_free_request(g_kcgi_req); g_kcgi_req = NULL; }
push_value(vm, make_int(1));
#else
push_value(vm, make_int(0));
#endif
break;
}

20
src/vm/kcgi/parse.c Normal file
View file

@ -0,0 +1,20 @@
/* KCGI_PARSE */
case OP_KCGI_PARSE: {
#ifdef FUN_WITH_KCGI
if (g_kcgi_req) { /* safety: free previous if any */
kcgi_free_request(g_kcgi_req);
g_kcgi_req = NULL;
}
struct kreq *r = NULL;
if (!kcgi_parse_request(&r)) {
push_value(vm, make_nil());
break;
}
g_kcgi_req = r;
Value v = kreq_to_fun(r);
push_value(vm, v);
#else
push_value(vm, make_nil());
#endif
break;
}

31
src/vm/kcgi/reply_start.c Normal file
View file

@ -0,0 +1,31 @@
/* KCGI_REPLY_START */
case OP_KCGI_REPLY_START: {
#ifdef FUN_WITH_KCGI
Value vct = pop_value(vm);
Value vcode = pop_value(vm);
int code = 200;
if (vcode.type == VAL_INT) {
code = (int)vcode.i;
} else if (vcode.type == VAL_FLOAT) {
code = (int)vcode.d;
} else if (vcode.type == VAL_STRING) {
if (vcode.s) code = atoi(vcode.s);
}
char *ct = value_to_string_alloc(&vct);
free_value(vcode);
free_value(vct);
if (!ct || ct[0] == '\0') {
/* default content type */
free(ct);
ct = strdup("text/html; charset=utf-8");
}
int ok = kcgi_reply_start(code, ct);
free(ct);
push_value(vm, make_int(ok ? 1 : 0));
#else
Value a = pop_value(vm); free_value(a);
Value b = pop_value(vm); free_value(b);
push_value(vm, make_int(0));
#endif
break;
}

15
src/vm/kcgi/write.c Normal file
View file

@ -0,0 +1,15 @@
/* KCGI_WRITE */
case OP_KCGI_WRITE: {
#ifdef FUN_WITH_KCGI
Value vs = pop_value(vm);
char *s = value_to_string_alloc(&vs);
free_value(vs);
int ok = kcgi_write_str(s ? s : "");
if (s) free(s);
push_value(vm, make_int(ok ? 1 : 0));
#else
Value drop = pop_value(vm); free_value(drop);
push_value(vm, make_int(0));
#endif
break;
}