lua_apr.c revision bcc8cf07e157c4737ff564ac943c21b9a7da3691
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "mod_lua.h"
#include "lua_apr.h"
/**
* make a userdata out of a C pointer, and vice versa
* instead of using lightuserdata
*/
#ifndef lua_boxpointer
#define lua_boxpointer(L,u) (*(void **)(lua_newuserdata(L, sizeof(void *))) = (u))
#define lua_unboxpointer(L,i) (*(void **)(lua_touserdata(L, i)))
#endif
{
apr_table_t *t;
return t;
}
{
lua_boxpointer(L, t);
luaL_getmetatable(L, "Apr.Table");
lua_setmetatable(L, -2);
}
static int lua_table_set(lua_State *L)
{
return 0;
}
static int lua_table_get(lua_State *L)
{
lua_pushstring(L, val);
return 1;
}
static const luaL_Reg lua_table_methods[] = {
{"set", lua_table_set},
{"get", lua_table_get},
{0, 0}
};
{
luaL_newmetatable(L, "Apr.Table");
lua_pushstring(L, "__index");
lua_pushstring(L, "get");
lua_gettable(L, 2);
lua_settable(L, 1);
lua_pushstring(L, "__newindex");
lua_pushstring(L, "set");
lua_gettable(L, 2);
lua_settable(L, 1);
return 0;
}
/*
=======================================================================================================================
util_read(request_rec *r, const char **rbuf, apr_off_t *size): Reads any additional form data sent in POST/PUT
requests.
=======================================================================================================================
*/
{
/*~~~~~~~~*/
/*~~~~~~~~*/
return (rc);
}
if (ap_should_client_block(r)) {
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char argsbuffer[HUGE_STRING_LEN];
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
}
else {
}
}
}
return (rc);
}
/*
=======================================================================================================================
util_write(request_rec *r, const char **rbuf, apr_off_t *size): Reads any additional form data sent in POST/PUT
requests and writes to a file.
=======================================================================================================================
*/
{
/*~~~~~~~~*/
/*~~~~~~~~*/
return (rc);
}
if (ap_should_client_block(r)) {
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char argsbuffer[HUGE_STRING_LEN];
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
}
else {
}
}
}
return (rc);
}
{
request_rec *r;
return r;
}
/* lua_apr_b64encode; r:encode_base64(string) - encodes a string to Base64 format */
static int lua_apr_b64encode (lua_State *L) {
const char *plain;
char *encoded;
size_t x,y,z;
request_rec *r;
r = ap_lua_check_request_rec(L, 1);
y = apr_base64_encode_len(x)+1;
if (y) {
lua_pushlstring(L, encoded, z);
return 1;
}
return 0;
}
/* lua_apr_b64decode; r:decode_base64(string) - decodes a Base64 string*/
static int lua_apr_b64decode (lua_State *L) {
const char *encoded;
char *plain;
size_t x,y,z;
request_rec *r;
r = ap_lua_check_request_rec(L, 1);
if (y) {
lua_pushlstring(L, plain, z);
return 1;
}
return 0;
}
/* lua_ap_unescape; r:unescape(string) - Unescapes an URL-encoded string */
static int lua_ap_unescape (lua_State *L) {
const char *escaped;
char *plain;
size_t x,y;
request_rec *r;
r = ap_lua_check_request_rec(L, 1);
y = ap_unescape_urlencoded(plain);
if (!y) {
lua_pushstring(L, plain);
return 1;
}
return 0;
}
/* lua_ap_escape; r:escape(string) - URL-escapes a string */
static int lua_ap_escape (lua_State *L) {
const char *plain;
char *escaped;
size_t x;
request_rec *r;
r = ap_lua_check_request_rec(L, 1);
lua_pushstring(L, escaped);
return 1;
}
/* lua_apr_md5; r:md5(string) - Calculates an MD5 digest of a string */
static int lua_apr_md5(lua_State *L)
{
/*~~~~~~~~~~~~~~~~*/
union {
unsigned char chr[16];
} digest;
const char* buffer;
char* result;
char Rmd5[16];
size_t x,y;
request_rec *r;
/*~~~~~~~~~~~~~~~~*/
r = ap_lua_check_request_rec(L, 1);
apr_md5_init(&md5);
for (x = 0; x < 16; x += 4) {
}
lua_pushstring(L, result);
return 1;
}
/* lua_apr_sha1; r:sha1(string) - Calculates the SHA1 digest of a string */
static int lua_apr_sha1(lua_State *L)
{
/*~~~~~~~~~~~~~~~~*/
union {
unsigned char chr[16];
} digest;
const char* buffer;
char* result;
unsigned char Rsha1[20];
size_t x,y;
request_rec *r;
/*~~~~~~~~~~~~~~~~*/
r = ap_lua_check_request_rec(L, 1);
for (x = 0; x < 20; x += 4) {
}
lua_pushstring(L, result);
return 1;
}
/* lua_ap_banner; r:banner() - Returns the current server banner */
static int lua_ap_banner(lua_State *L)
{
return 1;
}
/* lua_ap_port; r:port() - Returns the port used by the request */
static int lua_ap_port(lua_State *L)
{
/*~~~~~~~~~~~~~~~~~~*/
request_rec *r;
/*~~~~~~~~~~~~~~~~~~*/
r = ap_lua_check_request_rec(L, 1);
port = ap_get_server_port(r);
lua_pushnumber(L, port);
return 1;
}
/* lua_ap_mpm_query; r:mpm_query(info) - Queries for MPM info */
static int lua_ap_mpm_query(lua_State *L)
{
/*~~~~~~~~~~~~~~~~~~*/
int x,y;
/*~~~~~~~~~~~~~~~~~~*/
x = lua_tonumber(L, 1);
ap_mpm_query(x, &y);
lua_pushnumber(L, y);
return 1;
}
/* lua_ap_expr; r:expr(string) - Evaluates an expr statement. */
static int lua_ap_expr(lua_State *L)
{
/*~~~~~~~~~~~~~~~~~~*/
request_rec *r;
int x = 0;
/*~~~~~~~~~~~~~~~~~~*/
r = ap_lua_check_request_rec(L, 1);
res.line_number = 0;
res.module_index = 0;
if (!err) {
lua_pushboolean(L, x);
if (x < 0) {
lua_pushstring(L, err);
return 2;
}
return 1;
}
else {
lua_pushboolean(L, 0);
lua_pushstring(L, err);
return 2;
}
lua_pushboolean(L, 0);
return 1;
}
/* lua_ap_regex; r:regex(string, pattern) - Evaluates a regex and returns captures if matched */
static int lua_ap_regex(lua_State *L)
{
/*~~~~~~~~~~~~~~~~~~*/
request_rec *r;
int i, rv;
char *err;
/*~~~~~~~~~~~~~~~~~~*/
r = ap_lua_check_request_rec(L, 1);
if (rv) {
lua_pushboolean(L, 0);
lua_pushstring(L, err);
return 2;
}
if (rv < 0) {
lua_pushboolean(L, 0);
lua_pushstring(L, err);
return 2;
}
lua_newtable(L);
for (i=0;i<10;i++) {
lua_pushinteger(L, i);
lua_pushstring(L,apr_pstrndup(r->pool, source+matches[i].rm_so, matches[i].rm_eo - matches[i].rm_so));
}
else {
lua_pushnil(L);
}
lua_settable(L, -3);
}
return 1;
}
/* lua_ap_scoreboard_process; r:scoreboard_process(a) - returns scoreboard info */
static int lua_ap_scoreboard_process(lua_State *L)
{
/*~~~~~~~~~~~~~~~~~~*/
int i;
/*~~~~~~~~~~~~~~~~~~*/
i = lua_tonumber(L, 2);
if (ps_record) {
lua_newtable(L);
lua_pushstring(L, "connections");
lua_settable(L, -3);
lua_pushstring(L, "keepalive");
lua_settable(L, -3);
lua_pushstring(L, "lingering_close");
lua_settable(L, -3);
lua_pushstring(L, "pid");
lua_settable(L, -3);
lua_pushstring(L, "suspended");
lua_settable(L, -3);
lua_pushstring(L, "write_completion");
lua_settable(L, -3);
lua_pushstring(L, "not_accepting");
lua_settable(L, -3);
lua_pushstring(L, "quiescing");
lua_settable(L, -3);
return 1;
}
return 0;
}
/* lua_ap_scoreboard_worker; r:scoreboard_worker(proc, thread) - Returns thread info */
static int lua_ap_scoreboard_worker(lua_State *L)
{
/*~~~~~~~~~~~~~~~~~~*/
int i,j;
/*~~~~~~~~~~~~~~~~~~*/
i = lua_tonumber(L, 2);
j = lua_tonumber(L, 3);
if (ws_record) {
lua_newtable(L);
lua_pushstring(L, "access_count");
lua_settable(L, -3);
lua_pushstring(L, "bytes_served");
lua_settable(L, -3);
lua_pushstring(L, "client");
lua_settable(L, -3);
lua_pushstring(L, "conn_bytes");
lua_settable(L, -3);
lua_pushstring(L, "conn_count");
lua_settable(L, -3);
lua_pushstring(L, "generation");
lua_settable(L, -3);
lua_pushstring(L, "last_used");
lua_settable(L, -3);
lua_pushstring(L, "pid");
lua_settable(L, -3);
lua_pushstring(L, "request");
lua_settable(L, -3);
lua_pushstring(L, "start_time");
lua_settable(L, -3);
lua_pushstring(L, "status");
lua_settable(L, -3);
lua_pushstring(L, "stop_time");
lua_settable(L, -3);
lua_pushstring(L, "tid");
lua_settable(L, -3);
lua_pushstring(L, "vhost");
lua_settable(L, -3);
#ifdef HAVE_TIMES
lua_pushstring(L, "stimes");
lua_settable(L, -3);
lua_pushstring(L, "utimes");
lua_settable(L, -3);
#endif
return 1;
}
return 0;
}
/* lua_ap_restarted; r:started() - Returns the timestamp of last server (re)start */
static int lua_ap_restarted(lua_State *L)
{
return 1;
}
/* lua_ap_clock; r:clock() - Returns timestamp with microsecond precision*/
static int lua_ap_clock(lua_State *L) {
now = apr_time_now();
lua_pushnumber(L, now);
return 1;
}
/* lua_ap_requestbody; r:requestbody([filename]) - Reads or stores the request body */
static int lua_ap_requestbody(lua_State *L)
{
/*~~~~~~~~~~~~~~~~~~*/
const char *filename;
request_rec* r;
/*~~~~~~~~~~~~~~~~~~*/
r = ap_lua_check_request_rec(L, 1);
if (r) {
/*~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~*/
if
(
r->method_number != M_POST
&& r->method_number != M_PUT
) return (0);
if (!filename) {
/*~~~~~~~~~~~~~~*/
const char *data;
/*~~~~~~~~~~~~~~*/
return (0);
}
return (2);
}
else {
/*~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~*/
APR_FPROT_OS_DEFAULT, r->pool);
lua_settop(L, 0);
if (rc == APR_SUCCESS) {
if (rc == -1) {
return (0);
}
return (1);
}
else
lua_pushboolean(L, 0);
return (1);
}
}
return (0);
}
/* lua_ap_add_input_filter; r:add_input_filter(name) - Adds an input filter to the chain */
static int lua_ap_add_input_filter(lua_State *L)
{
/*~~~~~~~~~~~~~~~~~~*/
request_rec *r;
const char* filterName;
/*~~~~~~~~~~~~~~~~~~*/
r = ap_lua_check_request_rec(L, 1);
if (filter) {
lua_pushboolean(L, 1);
}
else {
lua_pushboolean(L, 0);
}
return 1;
}
/* lua_ap_module_info; r:module_info(mod_name) - Returns information about a loaded module */
static int lua_ap_module_info(lua_State *L)
{
/*~~~~~~~~~~~~~~~~~~*/
const char* moduleName;
/*~~~~~~~~~~~~~~~~~~*/
if (mod) {
int i = 0;
const command_rec *cmd;
lua_newtable(L);
lua_pushstring(L, "commands");
lua_newtable(L);
lua_settable(L, -3);
}
lua_settable(L, -3);
return 1;
}
return 0;
}
/* lua_ap_runtime_dir_relative: r:runtime_dir_relative(file): Returns the filename as relative to the runtime dir*/
static int lua_ap_runtime_dir_relative(lua_State *L)
{
/*~~~~~~~~~~~~~~~~~~*/
request_rec *r;
const char* file;
/*~~~~~~~~~~~~~~~~~~*/
r = ap_lua_check_request_rec(L, 1);
return 1;
}
/* lua_ap_set_document_root; r:set_document_root(path) - sets the current doc root for the request */
static int lua_ap_set_document_root(lua_State *L)
{
/*~~~~~~~~~~~~~~~~~~*/
request_rec *r;
const char* root;
/*~~~~~~~~~~~~~~~~~~*/
r = ap_lua_check_request_rec(L, 1);
ap_set_document_root(r, root);
return 0;
}
/* lua_ap_stat; r:stat(filename) - Runs stat on a file and returns the file info as a table */
static int lua_ap_stat(lua_State *L)
{
/*~~~~~~~~~~~~~~~~~~*/
request_rec *r;
const char* filename;
/*~~~~~~~~~~~~~~~~~~*/
r = ap_lua_check_request_rec(L, 1);
lua_newtable(L);
lua_pushstring(L, "mtime");
lua_settable(L, -3);
lua_pushstring(L, "atime");
lua_settable(L, -3);
lua_pushstring(L, "ctime");
lua_settable(L, -3);
lua_pushstring(L, "size");
lua_settable(L, -3);
lua_pushstring(L, "filetype");
lua_settable(L, -3);
return 1;
}
/* lua_ap_loaded_modules; r:loaded_modules() - Returns a list of loaded modules */
static int lua_ap_loaded_modules(lua_State *L)
{
int i;
lua_newtable(L);
lua_pushinteger(L, i+1);
lua_settable(L, -3);
}
return 1;
}
/* lua_ap_server_info; r:server_info() - Returns server info, such as the executable filename, server root, mpm etc*/
static int lua_ap_server_info(lua_State *L)
{
lua_newtable(L);
lua_pushstring(L, "server_executable");
lua_settable(L, -3);
lua_pushstring(L, "server_root");
lua_settable(L, -3);
lua_pushstring(L, "scoreboard_fname");
lua_settable(L, -3);
lua_pushstring(L, "server_mpm");
lua_pushstring(L, ap_show_mpm());
lua_settable(L, -3);
return 1;
}
/* === Auto-scraped functions === */
/**
* ap_add_version_component (apr_pool_t *pconf, const char *component)
* Add a component to the server description and banner strings
* @param pconf The pool to allocate the component from
* @param component The string to add
*/
static int lua_ap_add_version_component (lua_State *L) {
request_rec *r;
const char* component;
r = ap_lua_check_request_rec(L, 1);
return 0;
}
/**
* ap_set_context_info (request_rec *r, const char *prefix,
const char *document_root) Set context_prefix and context_document_root for a request.
* @param r The request
* @param prefix the URI prefix, without trailing slash
* @param document_root the corresponding directory on disk, without trailing
* slash
* @note If one of prefix of document_root is NULL, the corrsponding
* property will not be changed.
*/
static int lua_ap_set_context_info (lua_State *L) {
request_rec *r;
const char* prefix;
const char* document_root;
r = ap_lua_check_request_rec(L, 1);
return 0;
}
/**
* ap_os_escape_path (apr_pool_t *p, const char *path, int partial)
* convert an OS path to a URL in an OS dependant way.
* @param p The pool to allocate from
* @param path The path to convert
* @param partial if set, assume that the path will be appended to something
* with a '/' in it (and thus does not prefix "./")
* @return The converted URL
*/
static int lua_ap_os_escape_path (lua_State *L) {
char * returnValue;
request_rec *r;
const char* path;
int partial = 0;
r = ap_lua_check_request_rec(L, 1);
return 1;
}
/**
* ap_escape_logitem (apr_pool_t *p, const char *str)
* Escape a string for logging
* @param p The pool to allocate from
* @param str The string to escape
* @return The escaped string
*/
static int lua_ap_escape_logitem (lua_State *L) {
char * returnValue;
request_rec *r;
const char* str;
r = ap_lua_check_request_rec(L, 1);
return 1;
}
/**
* ap_strcmp_match (const char *str, const char *expected)
* Determine if a string matches a patterm containing the wildcards '?' or '*'
* @param str The string to check
* @param expected The pattern to match against
* @return 1 if the two strings match, 0 otherwise
*/
static int lua_ap_strcmp_match (lua_State *L) {
int returnValue;
const char* str;
const char* expected;
int ignoreCase = 0;
return 1;
}
/**
* ap_set_keepalive (request_rec *r)
* Set the keepalive status for this request
* @param r The current request
* @return 1 if keepalive can be set, 0 otherwise
*/
static int lua_ap_set_keepalive (lua_State *L) {
int returnValue;
request_rec *r;
r = ap_lua_check_request_rec(L, 1);
returnValue = ap_set_keepalive(r);
return 1;
}
/**
* ap_make_etag (request_rec *r, int force_weak)
* Construct an entity tag from the resource information. If it's a real
* file, build in some of the file characteristics.
* @param r The current request
* @param force_weak Force the entity tag to be weak - it could be modified
* again in as short an interval.
* @return The entity tag
*/
static int lua_ap_make_etag (lua_State *L) {
char * returnValue;
request_rec *r;
int force_weak;
r = ap_lua_check_request_rec(L, 1);
return 1;
}
/**
* ap_send_interim_response (request_rec *r, int send_headers)
* Send an interim (HTTP 1xx) response immediately.
* @param r The request
* @param send_headers Whether to send&clear headers in r->headers_out
*/
static int lua_ap_send_interim_response (lua_State *L) {
request_rec *r;
int send_headers;
r = ap_lua_check_request_rec(L, 1);
return 0;
}
/**
* ap_custom_response (request_rec *r, int status, const char *string)
* Install a custom response handler for a given status
* @param r The current request
* @param status The status for which the custom response should be used
* @param string The custom response. This can be a static string, a file
* or a URL
*/
static int lua_ap_custom_response (lua_State *L) {
request_rec *r;
int status;
const char* string;
r = ap_lua_check_request_rec(L, 1);
return 0;
}
/**
* ap_exists_config_define (const char *name)
* Check for a definition from the server command line
* @param name The define to check for
* @return 1 if defined, 0 otherwise
*/
static int lua_ap_exists_config_define (lua_State *L) {
int returnValue;
const char* name;
return 1;
}
static int lua_ap_get_server_name_for_url (lua_State *L) {
const char* servername;
request_rec *r;
r = ap_lua_check_request_rec(L, 1);
lua_pushstring(L, servername);
return 1;
}
/**
* ap_state_query (int query_code) item starts a new field */
static int lua_ap_state_query (lua_State *L) {
int returnValue;
int query_code;
return 1;
}
static int lua_ap_sleep (lua_State *L) {
int msec;
return 0;
}
static const struct luaL_Reg httpd_functions [] = {
{"base64_encode", lua_apr_b64encode},
{"base64_decode", lua_apr_b64decode},
{"md5", lua_apr_md5},
{"sha1", lua_apr_sha1},
{"escape", lua_ap_escape},
{"unescape", lua_ap_unescape},
{"banner", lua_ap_banner},
{"port", lua_ap_port},
{"mpm_query", lua_ap_mpm_query},
{"expr", lua_ap_expr},
{"scoreboard_process", lua_ap_scoreboard_process},
{"scoreboard_worker", lua_ap_scoreboard_worker},
{"started", lua_ap_restarted},
{"clock", lua_ap_clock},
{"requestbody", lua_ap_requestbody},
{"add_input_filter", lua_ap_add_input_filter},
{"module_info", lua_ap_module_info},
{"loaded_modules", lua_ap_loaded_modules},
{"runtime_dir_relative", lua_ap_runtime_dir_relative},
{"server_info", lua_ap_server_info},
{"set_document_root", lua_ap_set_document_root},
{"add_version_component" , lua_ap_add_version_component},
{"set_context_info" , lua_ap_set_context_info},
{"os_escape_path" , lua_ap_os_escape_path},
{"escape_logitem" , lua_ap_escape_logitem},
{"strcmp_match" , lua_ap_strcmp_match},
{"set_keepalive" , lua_ap_set_keepalive},
{"make_etag" , lua_ap_make_etag},
{"send_interim_response" , lua_ap_send_interim_response},
{"custom_response" , lua_ap_custom_response},
{"exists_config_define" , lua_ap_exists_config_define},
{"state_query" , lua_ap_state_query},
{"stat" , lua_ap_stat},
{"regex" , lua_ap_regex},
{"sleep" , lua_ap_sleep},
{"get_server_name_for_url" , lua_ap_get_server_name_for_url},
};
{
lua_getglobal(L, "apache2");
return 0;
}