Skip to content

Instantly share code, notes, and snippets.

@brianm
Created November 5, 2008 19:16
Show Gist options
  • Save brianm/22400 to your computer and use it in GitHub Desktop.
Save brianm/22400 to your computer and use it in GitHub Desktop.
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");
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;
}
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