request.c revision c381599e85eb318a270f3e3b07851bff77e5c151
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * Licensed to the Apache Software Foundation (ASF) under one or more
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * contributor license agreements. See the NOTICE file distributed with
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * this work for additional information regarding copyright ownership.
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * The ASF licenses this file to You under the Apache License, Version 2.0
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * (the "License"); you may not use this file except in compliance with
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * the License. You may obtain a copy of the License at
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * Unless required by applicable law or agreed to in writing, software
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * distributed under the License is distributed on an "AS IS" BASIS,
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * See the License for the specific language governing permissions and
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * limitations under the License.
e1e8390280254f7f0580d701e583f670643d4f3fnilgunvoid rstack_dump(lua_State* L, request_rec* r, const char* msg) {
e1e8390280254f7f0580d701e583f670643d4f3fnilgun ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, "Lua Stack Dump: [%s]", msg);
e1e8390280254f7f0580d701e583f670643d4f3fnilgun int t = lua_type(L, i);
e1e8390280254f7f0580d701e583f670643d4f3fnilgun switch(t) {
e1e8390280254f7f0580d701e583f670643d4f3fnilgun ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, "%d: userdata", i);
e1e8390280254f7f0580d701e583f670643d4f3fnilgun ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, "%d: lightuserdata", i);
e1e8390280254f7f0580d701e583f670643d4f3fnilgun "%d: NIL", i);
e1e8390280254f7f0580d701e583f670643d4f3fnilgun "%d: None", i);
e1e8390280254f7f0580d701e583f670643d4f3fnilgun "%d: %s", i, lua_toboolean(L, i) ? "true" : "false");
e1e8390280254f7f0580d701e583f670643d4f3fnilgun "%d: <table>", i);
e1e8390280254f7f0580d701e583f670643d4f3fnilgun "%d: <function>", i);
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * Verify that the thing at index is a request_rec wrapping
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * userdata thingamajig and return it if it is. if it is not
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * lua will enter its error handling routine.
e1e8390280254f7f0580d701e583f670643d4f3fnilgunstatic request_rec* apw_check_request_rec(lua_State* L, int index) {
e1e8390280254f7f0580d701e583f670643d4f3fnilgun request_rec* r = (request_rec*)lua_unboxpointer(L, index);
e1e8390280254f7f0580d701e583f670643d4f3fnilgun/* ------------------ request methods -------------------- */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun/* helper callback for req_parseargs */
e1e8390280254f7f0580d701e583f670643d4f3fnilgunstatic int req_aprtable2luatable_cb(void *l, const char *key, const char *value) {
e1e8390280254f7f0580d701e583f670643d4f3fnilgun lua_State* L = (lua_State*)l; /* [table<s,t>, table<s,s>] */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun /* rstack_dump(L, RRR, "start of cb"); */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun /* L is [table<s,t>, table<s,s>] */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun /* build complex */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun lua_getfield(L, -1, key); /* [VALUE, table<s,t>, table<s,s>] */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun /* rstack_dump(L, RRR, "after getfield"); */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun switch(t) {
e1e8390280254f7f0580d701e583f670643d4f3fnilgun lua_newtable(L); /* [array, table<s,t>, table<s,s>] */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun lua_pushnumber(L, 1); /* [1, array, table<s,t>, table<s,s>] */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun lua_pushstring(L, value); /* [string, 1, array, table<s,t>, table<s,s>] */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun lua_settable(L, -3); /* [array, table<s,t>, table<s,s>] */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun lua_setfield(L, -2, key); /* [table<s,t>, table<s,s>] */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun /* [array, table<s,t>, table<s,s>] */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun lua_pushnumber(L, size + 1); /* [#, array, table<s,t>, table<s,s>] */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun lua_pushstring(L, value); /* [string, #, array, table<s,t>, table<s,s>] */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun lua_settable(L, -3); /* [array, table<s,t>, table<s,s>] */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun lua_setfield(L, -2, key); /* [table<s,t>, table<s,s>] */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun /* L is [table<s,t>, table<s,s>] */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun /* build simple */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun lua_getfield(L, -2, key); /* [VALUE, table<s,s>, table<s,t>] */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun if (lua_isnoneornil(L, -1)) { /* only set if not already set */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun lua_pushstring(L, value); /* [string, table<s,s>, table<s,t>] */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun lua_setfield(L, -3, key); /* [table<s,s>, table<s,t>] */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun/* r:parseargs() returning a lua table */
2704de98885368683621b01c8f8f4e4b01557611takashi apr_table_do(req_aprtable2luatable_cb, L, form_table, NULL);
2704de98885368683621b01c8f8f4e4b01557611takashi return 2; /* [table<string, string>, table<string, array<string>>] */
2704de98885368683621b01c8f8f4e4b01557611takashi/* wrap ap_rputs as r:puts(String) */
e1e8390280254f7f0580d701e583f670643d4f3fnilgun/* wrap ap_rwrite as r:write(String) */
lua_newtable(L);
lua_newtable(L);
return r->uri;
return r->method;
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->status;
return r->assbackwards;
if (rft) {
case APW_REQ_FUNTYPE_TABLE: {
case APW_REQ_FUNTYPE_LUACFUN: {
case APW_REQ_FUNTYPE_STRING: {
case APW_REQ_FUNTYPE_INT: {
case APW_REQ_FUNTYPE_BOOLEAN: {
/* handle r.status = 201 */
lua_error(L);
return rft;
lua_boxpointer(L, c);
lua_boxpointer(L, s);
lua_boxpointer(L, r);