lua_request.c revision 4f50e7f85eb68ce458a90d1c8b373afee4586e85
0b3b020a178cf3b957fed627de13c895773995ecLennart Poettering * Licensed to the Apache Software Foundation (ASF) under one or more
12b42c76672a66c2d4ea7212c14f8f1b5a62b78dTom Gundersen * contributor license agreements. See the NOTICE file distributed with
0b3b020a178cf3b957fed627de13c895773995ecLennart Poettering * this work for additional information regarding copyright ownership.
0b3b020a178cf3b957fed627de13c895773995ecLennart Poettering * The ASF licenses this file to You under the Apache License, Version 2.0
0b3b020a178cf3b957fed627de13c895773995ecLennart Poettering * (the "License"); you may not use this file except in compliance with
0b3b020a178cf3b957fed627de13c895773995ecLennart Poettering * the License. You may obtain a copy of the License at
0b3b020a178cf3b957fed627de13c895773995ecLennart Poettering * http://www.apache.org/licenses/LICENSE-2.0
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering * Unless required by applicable law or agreed to in writing, software
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering * distributed under the License is distributed on an "AS IS" BASIS,
0b3b020a178cf3b957fed627de13c895773995ecLennart Poettering * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
0b3b020a178cf3b957fed627de13c895773995ecLennart Poettering * See the License for the specific language governing permissions and
0b3b020a178cf3b957fed627de13c895773995ecLennart Poettering * limitations under the License.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekextern apr_thread_mutex_t* lua_ivm_mutex;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmektypedef char *(*req_field_string_f) (request_rec * r);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmektypedef int (*req_field_int_f) (request_rec * r);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmektypedef apr_table_t *(*req_field_apr_table_f) (request_rec * r);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekvoid ap_lua_rstack_dump(lua_State *L, request_rec *r, const char *msg)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(01484) "Lua Stack Dump: [%s]", msg);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "%d: '%s'", i, lua_tostring(L, i));
dddbc69577820e6ecce17d3ac836ad865fcbcde2Lennart Poettering ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, "%d: userdata",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "%d: lightuserdata", i);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, "%d: NIL", i);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, "%d: None", i);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "%d: %g", i, lua_tonumber(L, i));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "%d: <table>", i);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "%d: <function>", i);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "%d: unknown: -[%s]-", i, lua_typename(L, i));
dddbc69577820e6ecce17d3ac836ad865fcbcde2Lennart Poettering * Verify that the thing at index is a request_rec wrapping
dddbc69577820e6ecce17d3ac836ad865fcbcde2Lennart Poettering * userdata thingamajig and return it if it is. if it is not
dddbc69577820e6ecce17d3ac836ad865fcbcde2Lennart Poettering * lua will enter its error handling routine.
f5aaf575626022313b07d505699fa1af25d248acLennart Poetteringstatic request_rec *ap_lua_check_request_rec(lua_State *L, int index)
f5aaf575626022313b07d505699fa1af25d248acLennart Poettering luaL_checkudata(L, index, "Apache2.Request");
f5aaf575626022313b07d505699fa1af25d248acLennart Poettering r = (request_rec *) lua_unboxpointer(L, index);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/* ------------------ request methods -------------------- */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/* helper callback for req_parseargs */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int req_aprtable2luatable_cb(void *l, const char *key,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek lua_State *L = (lua_State *) l; /* [table<s,t>, table<s,s>] */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* rstack_dump(L, RRR, "start of cb"); */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* L is [table<s,t>, table<s,s>] */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* build complex */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek lua_getfield(L, -1, key); /* [VALUE, table<s,t>, table<s,s>] */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* rstack_dump(L, RRR, "after getfield"); */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek lua_pop(L, 1); /* [table<s,t>, table<s,s>] */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek lua_newtable(L); /* [array, table<s,t>, table<s,s>] */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek lua_pushnumber(L, 1); /* [1, array, table<s,t>, table<s,s>] */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek lua_pushstring(L, value); /* [string, 1, array, table<s,t>, table<s,s>] */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek lua_settable(L, -3); /* [array, table<s,t>, table<s,s>] */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek lua_setfield(L, -2, key); /* [table<s,t>, table<s,s>] */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* [array, table<s,t>, table<s,s>] */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek lua_pushnumber(L, size + 1); /* [#, array, table<s,t>, table<s,s>] */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek lua_pushstring(L, value); /* [string, #, array, table<s,t>, table<s,s>] */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek lua_settable(L, -3); /* [array, table<s,t>, table<s,s>] */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek lua_setfield(L, -2, key); /* [table<s,t>, table<s,s>] */
dddbc69577820e6ecce17d3ac836ad865fcbcde2Lennart Poettering /* L is [table<s,t>, table<s,s>] */
dddbc69577820e6ecce17d3ac836ad865fcbcde2Lennart Poettering /* build simple */
dddbc69577820e6ecce17d3ac836ad865fcbcde2Lennart Poettering lua_getfield(L, -2, key); /* [VALUE, table<s,s>, table<s,t>] */
f5aaf575626022313b07d505699fa1af25d248acLennart Poettering if (lua_isnoneornil(L, -1)) { /* only set if not already set */
f5aaf575626022313b07d505699fa1af25d248acLennart Poettering lua_pop(L, 1); /* [table<s,s>, table<s,t>]] */
f5aaf575626022313b07d505699fa1af25d248acLennart Poettering lua_pushstring(L, value); /* [string, table<s,s>, table<s,t>] */
f5aaf575626022313b07d505699fa1af25d248acLennart Poettering lua_setfield(L, -3, key); /* [table<s,s>, table<s,t>] */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek =======================================================================================================================
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek lua_read_body(request_rec *r, const char **rbuf, apr_off_t *size): Reads any additional form data sent in POST/PUT
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek requests. Used for multipart POST data.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek =======================================================================================================================
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int lua_read_body(request_rec *r, const char **rbuf, apr_off_t *size)
882f407f3133f3603b69be162940002a9a37ba48Lennart Poettering if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR))) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (ap_should_client_block(r)) {
dddbc69577820e6ecce17d3ac836ad865fcbcde2Lennart Poettering /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
dddbc69577820e6ecce17d3ac836ad865fcbcde2Lennart Poettering /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
707b66c66381c899d7ef640e158ffdd5bcff4debLennart Poettering *rbuf = (const char *) apr_pcalloc(r->pool, (apr_size_t) (length + 1));
882f407f3133f3603b69be162940002a9a37ba48Lennart Poettering while ((len_read = ap_get_client_block(r, argsbuffer, sizeof(argsbuffer))) > 0) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if ((rpos + len_read) > length) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek memcpy((char *) *rbuf + rpos, argsbuffer, (size_t) rsize);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * =======================================================================================================================
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * lua_write_body: Reads any additional form data sent in POST/PUT requests
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * and writes to a file.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * =======================================================================================================================
882f407f3133f3603b69be162940002a9a37ba48Lennart Poetteringstatic apr_status_t lua_write_body(request_rec *r, apr_file_t *file, apr_off_t *size)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR)))
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (ap_should_client_block(r)) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek char argsbuffer[HUGE_STRING_LEN];
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek apr_off_t length = r->remaining;
f5aaf575626022313b07d505699fa1af25d248acLennart Poettering sizeof(argsbuffer))) > 0) {
f5aaf575626022313b07d505699fa1af25d248acLennart Poettering rc = apr_file_write_full(file, argsbuffer, (apr_size_t) rsize,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/* r:parseargs() returning a lua table */
f5aaf575626022313b07d505699fa1af25d248acLennart Poettering request_rec *r = ap_lua_check_request_rec(L, 1);
f5aaf575626022313b07d505699fa1af25d248acLennart Poettering apr_table_do(req_aprtable2luatable_cb, L, form_table, NULL);
f5aaf575626022313b07d505699fa1af25d248acLennart Poettering return 2; /* [table<string, string>, table<string, array<string>>] */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/* r:parsebody(): Parses regular (url-enocded) or multipart POST data and returns two tables*/
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int req_parsebody(lua_State *L)
882f407f3133f3603b69be162940002a9a37ba48Lennart Poettering request_rec *r = ap_lua_check_request_rec(L, 1);
882f407f3133f3603b69be162940002a9a37ba48Lennart Poettering max_post_size = (apr_size_t) luaL_optint(L, 2, MAX_STRING_LEN);
882f407f3133f3603b69be162940002a9a37ba48Lennart Poettering contentType = apr_table_get(r->headers_in, "Content-Type");
707b66c66381c899d7ef640e158ffdd5bcff4debLennart Poettering if (contentType != NULL && (sscanf(contentType, "multipart/form-data; boundary=%250c", multipart) == 1)) {
707b66c66381c899d7ef640e158ffdd5bcff4debLennart Poettering if (lua_read_body(r, &data, (apr_off_t*) &size) != OK) {
707b66c66381c899d7ef640e158ffdd5bcff4debLennart Poettering start = strstr((char *) data, multipart);
882f407f3133f3603b69be162940002a9a37ba48Lennart Poettering if (i == POST_MAX_VARS) break;
882f407f3133f3603b69be162940002a9a37ba48Lennart Poettering end = strstr((char *) (start + 1), multipart);
882f407f3133f3603b69be162940002a9a37ba48Lennart Poettering crlf = strstr((char *) start, "\r\n\r\n");
882f407f3133f3603b69be162940002a9a37ba48Lennart Poettering key = (char *) apr_pcalloc(r->pool, 256);
707b66c66381c899d7ef640e158ffdd5bcff4debLennart Poettering filename = (char *) apr_pcalloc(r->pool, 256);
882f407f3133f3603b69be162940002a9a37ba48Lennart Poettering buffer = (char *) apr_pcalloc(r->pool, vlen+1);
882f407f3133f3603b69be162940002a9a37ba48Lennart Poettering "Content-Disposition: form-data; name=\"%255[^\"]\"; filename=\"%255[^\"]\"",
882f407f3133f3603b69be162940002a9a37ba48Lennart Poettering req_aprtable2luatable_cb(L, key, buffer);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek res = ap_parse_form_data(r, NULL, &pairs, -1, max_post_size);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek while(pairs && !apr_is_empty_array(pairs)) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_form_pair_t *pair = (ap_form_pair_t *) apr_array_pop(pairs);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek apr_brigade_length(pair->value, 1, &len);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek buffer = apr_palloc(r->pool, size + 1);
dddbc69577820e6ecce17d3ac836ad865fcbcde2Lennart Poettering apr_brigade_flatten(pair->value, buffer, &size);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek req_aprtable2luatable_cb(L, pair->name, buffer);
dddbc69577820e6ecce17d3ac836ad865fcbcde2Lennart Poettering return 2; /* [table<string, string>, table<string, array<string>>] */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * lua_ap_requestbody; r:requestbody([filename]) - Reads or stores the request
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int lua_ap_requestbody(lua_State *L)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = ap_lua_check_request_rec(L, 1);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek filename = luaL_optstring(L, 2, 0);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (maxSize > 0 && r->remaining > maxSize) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek lua_pushliteral(L, "Request body was larger than the permitted size.");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (r->method_number != M_POST && r->method_number != M_PUT)
const char *data;
lua_settop(L, 0);
lua_pushboolean(L, 0);
lua_pushboolean(L, 0);
size_t n;
int rv;
name);
return ap_document_root(r);
return ap_context_prefix(r);
return ap_context_document_root(r);
return r->uri;
return r->method;
return r->handler;
switch (r->proxyreq) {
default: return NULL;
return r->hostname;
return r->args;
return r->path_info;
return r->canonical_filename;
return r->filename;
return r->user;
return r->unparsed_uri;
return r->ap_auth_type;
return r->content_encoding;
return r->content_type;
return r->range;
return r->protocol;
return r->the_request;
return r->log_id;
return r->useragent_ip;
return r->remaining;
return r->status;
return r->assbackwards;
return r->headers_in;
return r->headers_out;
return r->err_headers_out;
return r->subprocess_env;
return r->notes;
return (int) ap_get_server_port(r);
int returnValue;
request_rec *r;
int opts;
return apr_psprintf(r->pool, "%s %s %s %s %s %s", (opts&OPT_INDEXES) ? "Indexes" : "", (opts&OPT_INCLUDES) ? "Includes" : "", (opts&OPT_SYM_LINKS) ? "FollowSymLinks" : "", (opts&OPT_EXECCGI) ? "ExecCGI" : "", (opts&OPT_MULTI) ? "MultiViews" : "", (opts&OPT_ALL) == OPT_ALL ? "All" : "" );
int opts;
return apr_psprintf(r->pool, "%s %s %s %s %s %s", (opts&OR_NONE) ? "None" : "", (opts&OR_LIMIT) ? "Limit" : "", (opts&OR_OPTIONS) ? "Options" : "", (opts&OR_FILEINFO) ? "FileInfo" : "", (opts&OR_AUTHCFG) ? "AuthCfg" : "", (opts&OR_INDEXES) ? "Indexes" : "" );
return (int) ap_get_limit_req_body(r);
return ap_is_initial_req(r);
return ap_some_auth_required(r);
const char *filename;
request_rec *r;
lua_pushboolean(L, 0);
r->pool);
lua_pushboolean(L, 0);
const char *plain;
char *encoded;
request_rec *r;
if (encoded_len) {
encoded_len--;
const char *encoded;
char *plain;
request_rec *r;
if (decoded_len) {
decoded_len--;
const char *escaped;
char *plain;
size_t x,
request_rec *r;
const char *plain;
char *escaped;
size_t x;
request_rec *r;
const char *buffer;
char *result;
request_rec *r;
const char *buffer;
char *result;
request_rec *r;
request_rec *r;
lua_pushboolean(L, 0);
request_rec *r;
const char *path;
request_rec *r;
const char *path;
request_rec *r;
const char *path;
request_rec *r;
const char *path;
const char *input;
if (result == 0)
ap_mpm_query(x, &y);
lua_pushinteger(L, y);
request_rec *r;
const char *expr,
*err;
if (!err) {
lua_pushboolean(L, x);
lua_pushboolean(L, 0);
lua_pushboolean(L, 0);
request_rec *r;
rv,
const char *pattern,
*source;
char *err;
if (rv) {
lua_pushboolean(L, 0);
lua_pushboolean(L, 0);
lua_pushboolean(L, 0);
lua_newtable(L);
lua_pushinteger(L, i);
lua_pushnil(L);
if (ps_record) {
lua_newtable(L);
if (ws_record) {
lua_newtable(L);
#ifdef HAVE_TIMES
request_rec *r;
const char *filterName;
if (filter) {
lua_pushboolean(L, 0);
const char *moduleName;
lua_newtable(L);
lua_newtable(L);
request_rec *r;
const char *file;
request_rec *r;
const char *root;
request_rec *r;
const char *directory;
lua_newtable(L);
lua_pushinteger(L, ++i);
request_rec *r;
const char *filename;
lua_newtable(L);
lua_newtable(L);
lua_newtable(L);
request_rec *r;
const char *prefix;
const char *document_root;
char *returnValue;
request_rec *r;
const char *path;
int partial = 0;
char *returnValue;
request_rec *r;
const char *str;
int returnValue;
const char *str;
const char *expected;
int ignoreCase = 0;
if (!ignoreCase)
int returnValue;
request_rec *r;
char *returnValue;
request_rec *r;
int force_weak;
request_rec *r;
int send_headers = 0;
request_rec *r;
int status;
const char *string;
int returnValue;
const char *name;
const char *servername;
request_rec *r;
int returnValue;
int query_code;
if (rft) {
case APL_REQ_FUNTYPE_TABLE:{
name);
case APL_REQ_FUNTYPE_LUACFUN:{
name);
case APL_REQ_FUNTYPE_STRING:{
char *rs;
case APL_REQ_FUNTYPE_INT:{
int rs;
case APL_REQ_FUNTYPE_BOOLEAN:{
int rs;
const char *msg;
if (object) {
if (!object) {
/* handle r.status = 201 */
const char *key;
key));
lua_error(L);
const char *name;
const char *name;
return rft;
APL_REQ_FUNTYPE_STRING, p));
lua_boxpointer(L, c);
lua_boxpointer(L, s);
lua_boxpointer(L, r);