Added some basic CGI support using kcgi plus a lot of fixes and content updates. (0.41.9)
This commit is contained in:
parent
9698074279
commit
604c415c0c
25 changed files with 407 additions and 13 deletions
10
src/vm/kcgi/end.c
Normal file
10
src/vm/kcgi/end.c
Normal 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
20
src/vm/kcgi/parse.c
Normal 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
31
src/vm/kcgi/reply_start.c
Normal 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
15
src/vm/kcgi/write.c
Normal 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;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue