Created
November 5, 2008 19:16
-
-
Save brianm/22400 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
apr_hash_t* dispatch = apr_hash_make(p); | |
apr_hash_set(dispatch, "puts", APR_HASH_KEY_STRING, makefun(&req_puts, APW_REQ_FUNTYPE_LUACFUN, p)); | |
apr_hash_set(dispatch, "write", APR_HASH_KEY_STRING, makefun(&req_write, APW_REQ_FUNTYPE_LUACFUN, p)); | |
apr_hash_set(dispatch, "document_root", APR_HASH_KEY_STRING, makefun(&req_document_root, APW_REQ_FUNTYPE_LUACFUN, p)); | |
apr_hash_set(dispatch, "parseargs", APR_HASH_KEY_STRING, makefun(&req_parseargs, APW_REQ_FUNTYPE_LUACFUN, p)); | |
apr_hash_set(dispatch, "parsebody", APR_HASH_KEY_STRING, makefun(&req_parsebody, APW_REQ_FUNTYPE_LUACFUN, p)); | |
apr_hash_set(dispatch, "debug", APR_HASH_KEY_STRING, makefun(&req_debug, APW_REQ_FUNTYPE_LUACFUN, p)); | |
apr_hash_set(dispatch, "info", APR_HASH_KEY_STRING, makefun(&req_info, APW_REQ_FUNTYPE_LUACFUN, p)); | |
apr_hash_set(dispatch, "notice", APR_HASH_KEY_STRING, makefun(&req_notice, APW_REQ_FUNTYPE_LUACFUN, p)); | |
apr_hash_set(dispatch, "warn", APR_HASH_KEY_STRING, makefun(req_warn, APW_REQ_FUNTYPE_LUACFUN, p)); | |
apr_hash_set(dispatch, "err", APR_HASH_KEY_STRING, makefun(&req_err, APW_REQ_FUNTYPE_LUACFUN, p)); | |
apr_hash_set(dispatch, "crit", APR_HASH_KEY_STRING, makefun(&req_crit, APW_REQ_FUNTYPE_LUACFUN, p)); | |
apr_hash_set(dispatch, "alert", APR_HASH_KEY_STRING, makefun(&req_alert, APW_REQ_FUNTYPE_LUACFUN, p)); | |
apr_hash_set(dispatch, "emerg", APR_HASH_KEY_STRING, makefun(&req_emerg, APW_REQ_FUNTYPE_LUACFUN, p)); | |
apr_hash_set(dispatch, "add_output_filter", APR_HASH_KEY_STRING, makefun(&req_add_output_filter, | |
APW_REQ_FUNTYPE_LUACFUN, p)); | |
apr_hash_set(dispatch, "assbackwards", APR_HASH_KEY_STRING, makefun(&req_assbackwards_field, APW_REQ_FUNTYPE_BOOLEAN, p)); | |
apr_hash_set(dispatch, "status", APR_HASH_KEY_STRING, makefun(&req_status_field, APW_REQ_FUNTYPE_INT, p)); | |
apr_hash_set(dispatch, "protocol", APR_HASH_KEY_STRING, makefun(&req_protocol_field, APW_REQ_FUNTYPE_STRING, p)); | |
apr_hash_set(dispatch, "range", APR_HASH_KEY_STRING, makefun(&req_range_field, APW_REQ_FUNTYPE_STRING, p)); | |
apr_hash_set(dispatch, "content_type", APR_HASH_KEY_STRING, makefun(&req_content_type_field, APW_REQ_FUNTYPE_STRING, p)); | |
apr_hash_set(dispatch, "content_encoding", APR_HASH_KEY_STRING, | |
makefun(&req_content_encoding_field, APW_REQ_FUNTYPE_STRING, p)); | |
apr_hash_set(dispatch, "ap_auth_type", APR_HASH_KEY_STRING, makefun(&req_ap_auth_type_field, APW_REQ_FUNTYPE_STRING, p)); | |
apr_hash_set(dispatch, "unparsed_uri", APR_HASH_KEY_STRING, makefun(&req_unparsed_uri_field, APW_REQ_FUNTYPE_STRING, p)); | |
apr_hash_set(dispatch, "user", APR_HASH_KEY_STRING, makefun(&req_user_field, APW_REQ_FUNTYPE_STRING, p)); | |
apr_hash_set(dispatch, "filename", APR_HASH_KEY_STRING, makefun(&req_filename_field, APW_REQ_FUNTYPE_STRING, p)); | |
apr_hash_set(dispatch, "canonical_filename", | |
APR_HASH_KEY_STRING, makefun(&req_canonical_filename_field, APW_REQ_FUNTYPE_STRING, p)); | |
apr_hash_set(dispatch, "path_info", APR_HASH_KEY_STRING, makefun(&req_path_info_field, APW_REQ_FUNTYPE_STRING, p)); | |
apr_hash_set(dispatch, "args", APR_HASH_KEY_STRING, makefun(&req_args_field, APW_REQ_FUNTYPE_STRING, p)); | |
apr_hash_set(dispatch, "hostname", APR_HASH_KEY_STRING, makefun(&req_hostname_field, APW_REQ_FUNTYPE_STRING, p)); | |
apr_hash_set(dispatch, "uri", APR_HASH_KEY_STRING, makefun(&req_uri_field, APW_REQ_FUNTYPE_STRING, p)); | |
apr_hash_set(dispatch, "the_request", APR_HASH_KEY_STRING, makefun(&req_the_request_field, APW_REQ_FUNTYPE_STRING, p)); | |
apr_hash_set(dispatch, "method", APR_HASH_KEY_STRING, makefun(&req_method_field, APW_REQ_FUNTYPE_STRING, p)); | |
lua_pushlightuserdata(L, dispatch); | |
lua_setfield(L, LUA_REGISTRYINDEX, "Apache2.Request.dispatch"); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static req_fun_t* makefun(void* fun, int type, apr_pool_t* pool) { | |
req_fun_t* rft = apr_palloc(pool, sizeof(req_fun_t)); | |
rft->fun = fun; | |
rft->type = type; | |
return rft; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static int req_dispatch(lua_State* L) { | |
request_rec* r = check_request_rec(L, 1); | |
const char *name = luaL_checkstring(L, 2); | |
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "dispatching %s", name); | |
lua_pop(L, 2); | |
lua_getfield(L, LUA_REGISTRYINDEX, "Apache2.Request.dispatch"); | |
apr_hash_t* dispatch = lua_touserdata(L, 1); | |
lua_pop(L, 1); | |
req_fun_t* rft = apr_hash_get(dispatch, name, APR_HASH_KEY_STRING); | |
if (rft) { | |
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "rft -> %d, type -> %d", (int)rft, rft->type); | |
switch(rft->type) { | |
case APW_REQ_FUNTYPE_LUACFUN: { | |
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "%s -> lua_CFunction", name); | |
lua_CFunction func = rft->fun; | |
lua_pushcfunction(L, func); | |
return 1; | |
} | |
case APW_REQ_FUNTYPE_STRING: { | |
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "%s -> string", name); | |
req_field_string_f func = rft->fun; | |
char* rs = (*func)(r); | |
lua_pushstring(L, rs); | |
return 1; | |
} | |
case APW_REQ_FUNTYPE_INT: { | |
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "%s -> int", name); | |
req_field_int_f func = rft->fun; | |
int rs = (*func)(r); | |
lua_pushnumber(L, rs); | |
return 1; | |
} | |
case APW_REQ_FUNTYPE_BOOLEAN: { | |
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "%s -> boolean", name); | |
req_field_int_f func = rft->fun; | |
int rs = (*func)(r); | |
lua_pushboolean(L, rs); | |
return 1; | |
} | |
} | |
} | |
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "nothing for %s", name); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment