lua_request.c revision b3c110de5a0e4248a2c98a92b651f7032adc7cf8
ca41b452ede6feaa9d8739ec3cae19389a7b0d03Bob Halley * Licensed to the Apache Software Foundation (ASF) under one or more
1633838b8255282d10af15c5c84cee5a51466712Bob Halley * contributor license agreements. See the NOTICE file distributed with
1633838b8255282d10af15c5c84cee5a51466712Bob Halley * this work for additional information regarding copyright ownership.
1633838b8255282d10af15c5c84cee5a51466712Bob Halley * The ASF licenses this file to You under the Apache License, Version 2.0
1633838b8255282d10af15c5c84cee5a51466712Bob Halley * (the "License"); you may not use this file except in compliance with
1633838b8255282d10af15c5c84cee5a51466712Bob Halley * the License. You may obtain a copy of the License at
1633838b8255282d10af15c5c84cee5a51466712Bob Halley * Unless required by applicable law or agreed to in writing, software
1633838b8255282d10af15c5c84cee5a51466712Bob Halley * distributed under the License is distributed on an "AS IS" BASIS,
1633838b8255282d10af15c5c84cee5a51466712Bob Halley * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1633838b8255282d10af15c5c84cee5a51466712Bob Halley * See the License for the specific language governing permissions and
1633838b8255282d10af15c5c84cee5a51466712Bob Halley * limitations under the License.
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halleytypedef char *(*req_field_string_f) (request_rec * r);
08dbab20efc74209b611bf543e0e9a2743aca84aBob Halleytypedef apr_table_t *(*req_field_apr_table_f) (request_rec * r);
4556681e191b7c1654639895ce719d98f2822ee2Michael Graffvoid ap_lua_rstack_dump(lua_State *L, request_rec *r, const char *msg)
005df5aba5181dc57b0e84eae72929f009b6b8fdBob Halley ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, "Lua Stack Dump: [%s]", msg);
005df5aba5181dc57b0e84eae72929f009b6b8fdBob Halley int t = lua_type(L, i);
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley switch (t) {
005df5aba5181dc57b0e84eae72929f009b6b8fdBob Halley ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, "%d: userdata",
005df5aba5181dc57b0e84eae72929f009b6b8fdBob Halley "%d: lightuserdata", i);
4556681e191b7c1654639895ce719d98f2822ee2Michael Graff ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, "%d: NIL", i);
005df5aba5181dc57b0e84eae72929f009b6b8fdBob Halley ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, "%d: None", i);
005df5aba5181dc57b0e84eae72929f009b6b8fdBob Halley i) ? "true" :
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley "%d: <table>", i);
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley "%d: <function>", i);
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley * Verify that the thing at index is a request_rec wrapping
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley * userdata thingamajig and return it if it is. if it is not
3df43dad430973e273bc55b304c6d5965390db06Michael Graff * lua will enter its error handling routine.
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halleystatic request_rec *ap_lua_check_request_rec(lua_State *L, int index)
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley/* ------------------ request methods -------------------- */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley/* helper callback for req_parseargs */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halleystatic int req_aprtable2luatable_cb(void *l, const char *key,
08dbab20efc74209b611bf543e0e9a2743aca84aBob Halley lua_State *L = (lua_State *) l; /* [table<s,t>, table<s,s>] */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley /* rstack_dump(L, RRR, "start of cb"); */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley /* L is [table<s,t>, table<s,s>] */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley /* build complex */
3740b569ae76295b941d57a724a43beb75b533baBob Halley lua_getfield(L, -1, key); /* [VALUE, table<s,t>, table<s,s>] */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley /* rstack_dump(L, RRR, "after getfield"); */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley switch (t) {
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley lua_newtable(L); /* [array, table<s,t>, table<s,s>] */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley lua_pushnumber(L, 1); /* [1, array, table<s,t>, table<s,s>] */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley lua_pushstring(L, value); /* [string, 1, array, table<s,t>, table<s,s>] */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley lua_settable(L, -3); /* [array, table<s,t>, table<s,s>] */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley lua_setfield(L, -2, key); /* [table<s,t>, table<s,s>] */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley /* [array, table<s,t>, table<s,s>] */
3df43dad430973e273bc55b304c6d5965390db06Michael Graff lua_pushnumber(L, size + 1); /* [#, array, table<s,t>, table<s,s>] */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley lua_pushstring(L, value); /* [string, #, array, table<s,t>, table<s,s>] */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley lua_settable(L, -3); /* [array, table<s,t>, table<s,s>] */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley lua_setfield(L, -2, key); /* [table<s,t>, table<s,s>] */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley /* L is [table<s,t>, table<s,s>] */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley /* build simple */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley lua_getfield(L, -2, key); /* [VALUE, table<s,s>, table<s,t>] */
3740b569ae76295b941d57a724a43beb75b533baBob Halley if (lua_isnoneornil(L, -1)) { /* only set if not already set */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley lua_pushstring(L, value); /* [string, table<s,s>, table<s,t>] */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley lua_setfield(L, -3, key); /* [table<s,s>, table<s,t>] */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley/* r:parseargs() returning a lua table */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley apr_table_do(req_aprtable2luatable_cb, L, form_table, NULL);
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley return 2; /* [table<string, string>, table<string, array<string>>] */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley/* wrap ap_rputs as r:puts(String) */
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halley/* wrap ap_rwrite as r:write(String) */
c98d185d0cd20b745b4e3d62aa6fcc22ac0e7c51Bob Halley/* r:addoutputfilter(name|function) */
c98d185d0cd20b745b4e3d62aa6fcc22ac0e7c51Bob Halley ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "adding output filter %s",
c98d185d0cd20b745b4e3d62aa6fcc22ac0e7c51Bob Halley/* wrap ap_construct_url as r:construct_url(String) */
3df43dad430973e273bc55b304c6d5965390db06Michael Graff lua_pushstring(L, ap_construct_url(r->pool, name, r));
c98d185d0cd20b745b4e3d62aa6fcc22ac0e7c51Bob Halley/* BEGIN dispatch mathods for request_rec fields */
c98d185d0cd20b745b4e3d62aa6fcc22ac0e7c51Bob Halley/* not really a field, but we treat it like one */
c98d185d0cd20b745b4e3d62aa6fcc22ac0e7c51Bob Halleystatic const char *req_document_root(request_rec *r)
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halleystatic const char *req_method_field(request_rec *r)
005df5aba5181dc57b0e84eae72929f009b6b8fdBob Halleystatic const char *req_hostname_field(request_rec *r)
3740b569ae76295b941d57a724a43beb75b533baBob Halleystatic const char *req_path_info_field(request_rec *r)
3df43dad430973e273bc55b304c6d5965390db06Michael Graffstatic const char *req_canonical_filename_field(request_rec *r)
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halleystatic const char *req_filename_field(request_rec *r)
7b5e3afd21d4f1792812ab371ee687807235dd87Bob Halleystatic const char *req_unparsed_uri_field(request_rec *r)
005df5aba5181dc57b0e84eae72929f009b6b8fdBob Halleystatic const char *req_ap_auth_type_field(request_rec *r)
c98d185d0cd20b745b4e3d62aa6fcc22ac0e7c51Bob Halleystatic const char *req_content_encoding_field(request_rec *r)
63bd57250ebc55355cac6560aa0efdc887b67140Bob Halleystatic const char *req_content_type_field(request_rec *r)
71b306bf33eed22731216404921f397e6440c671Brian Wellingtonstatic const char *req_range_field(request_rec *r)
3df43dad430973e273bc55b304c6d5965390db06Michael Graffstatic const char *req_protocol_field(request_rec *r)
71b306bf33eed22731216404921f397e6440c671Brian Wellingtonstatic const char *req_the_request_field(request_rec *r)
71b306bf33eed22731216404921f397e6440c671Brian Wellingtonstatic int req_assbackwards_field(request_rec *r)
71b306bf33eed22731216404921f397e6440c671Brian Wellingtonstatic apr_table_t* req_headers_in(request_rec *r)
63bd57250ebc55355cac6560aa0efdc887b67140Bob Halleystatic apr_table_t* req_headers_out(request_rec *r)
63bd57250ebc55355cac6560aa0efdc887b67140Bob Halleystatic apr_table_t* req_err_headers_out(request_rec *r)
3df43dad430973e273bc55b304c6d5965390db06Michael Graffstatic apr_table_t* req_subprocess_env(request_rec *r)
63bd57250ebc55355cac6560aa0efdc887b67140Bob Halley/* END dispatch mathods for request_rec fields */
22f735acbce7ffe95af20bb58bb8929b6f1d674fMichael Graff request_rec *r = ap_lua_check_request_rec(L, 1);
22f735acbce7ffe95af20bb58bb8929b6f1d674fMichael Graff lua_getfield(L, LUA_REGISTRYINDEX, "Apache2.Request.dispatch");
22f735acbce7ffe95af20bb58bb8929b6f1d674fMichael Graff rft = apr_hash_get(dispatch, name, APR_HASH_KEY_STRING);
63bd57250ebc55355cac6560aa0efdc887b67140Bob Halley req_field_apr_table_f func = (req_field_apr_table_f)rft->fun;
63bd57250ebc55355cac6560aa0efdc887b67140Bob Halley "request_rec->dispatching %s -> apr table",
63bd57250ebc55355cac6560aa0efdc887b67140Bob Halley "request_rec->dispatching %s -> lua_CFunction",
63bd57250ebc55355cac6560aa0efdc887b67140Bob Halley req_field_string_f func = (req_field_string_f)rft->fun;
22f735acbce7ffe95af20bb58bb8929b6f1d674fMichael Graff "request_rec->dispatching %s -> string", name);
3df43dad430973e273bc55b304c6d5965390db06Michael Graff req_field_int_f func = (req_field_int_f)rft->fun;
c910282c40424a4c9a1f8533d186bed73099aedeDavid Lawrence req_field_int_f func = (req_field_int_f)rft->fun;
e5b0c46fbb30acbc7a12c2fdf8687c56246a7b3aAndreas Gustafsson "request_rec->dispatching %s -> boolean", name);
74da83876c49f1c05d6f84c5257d88573a4e637bAndreas Gustafsson ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "nothing for %s", name);
e5b0c46fbb30acbc7a12c2fdf8687c56246a7b3aAndreas Gustafsson/* helper function for the logging functions below */
8a21ac0f095f6379d00805a1efa156bbd6790ab3Mark Andrews const char *msg;
8a21ac0f095f6379d00805a1efa156bbd6790ab3Mark Andrews ap_log_rerror(dbg.source, dbg.currentline, APLOG_MODULE_INDEX, level, 0,
f8d63d12dd6fe15de6a1339722c61b030d1e5badBob Halley/* r:debug(String) and friends which use apache logging */
441a57f959ae5e08b3008e067898d11d5ab71e0bMichael Graff/* handle r.status = 201 */
4556681e191b7c1654639895ce719d98f2822ee2Michael Graff const char *key;
441a57f959ae5e08b3008e067898d11d5ab71e0bMichael Graff /* request_rec* r = lua_touserdata(L, lua_upvalueindex(1)); */
441a57f959ae5e08b3008e067898d11d5ab71e0bMichael Graff /* const char* key = luaL_checkstring(L, -2); */
4556681e191b7c1654639895ce719d98f2822ee2Michael Graff request_rec *r = ap_lua_check_request_rec(L, 1);
4556681e191b7c1654639895ce719d98f2822ee2Michael Graff ap_set_content_type(r, apr_pstrdup(r->pool, value));
key));
lua_error(L);
return rft;
APL_REQ_FUNTYPE_STRING, p));
lua_boxpointer(L, c);
lua_boxpointer(L, s);
lua_boxpointer(L, r);