--- parser3/src/targets/apache13/Attic/mod_parser3.C 2001/10/12 12:15:32 1.2 +++ parser3/src/targets/apache13/Attic/mod_parser3.C 2001/11/08 11:52:34 1.9 @@ -2,9 +2,9 @@ Parser: apache 1.3 module. Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexander Petrosyan (http://design.ru/paf) + Author: Alexander Petrosyan (http://paf.design.ru) - $Id: mod_parser3.C,v 1.2 2001/10/12 12:15:32 parser Exp $ + $Id: mod_parser3.C,v 1.9 2001/11/08 11:52:34 paf Exp $ */ #include "httpd.h" @@ -27,14 +27,6 @@ #include #endif -#ifdef _DEBUG -# define DEBUG_PREFIX "debug_" -# define PARSER3_MODULE debug_parser3_module -#else -# define DEBUG_PREFIX -# define PARSER3_MODULE parser3_module -#endif - // consts extern const char *main_RCSIds[]; @@ -68,6 +60,7 @@ const char **RCSIds[]={ struct Parser_module_config { const char* parser_root_config_filespec; ///< filespec of admin's config file const char* parser_site_config_filespec; ///< filespec of site's config file + bool parser_status_allowed; }; #ifdef XML @@ -92,14 +85,14 @@ void callXalanTerminate(void *) { * Declare ourselves so the configuration routines can find and know us. * We'll fill it in at the end of the module. */ -extern "C" module MODULE_VAR_EXPORT PARSER3_MODULE; +extern "C" module MODULE_VAR_EXPORT parser3_module; /* * Locate our directory configuration record for the current request. */ static Parser_module_config *our_dconfig(request_rec *r) { return (Parser_module_config *) - ap_get_module_config(r->per_dir_config, &PARSER3_MODULE); + ap_get_module_config(r->per_dir_config, &parser3_module); } static const char *cmd_parser_config(cmd_parms *cmd, void *mconfig, char *file_spec) { @@ -110,6 +103,14 @@ static const char *cmd_parser_config(cmd return NULL; } +static const char *cmd_parser_status_allowed(cmd_parms *cmd, void *mconfig, char *file_spec) { + //_asm int 3; + Parser_module_config *cfg = (Parser_module_config *) mconfig; + + cfg->parser_status_allowed=true; + + return NULL; +} /*--------------------------------------------------------------------------*/ @@ -141,7 +142,7 @@ static const char *cmd_parser_config(cmd //@{ /// SAPI func decl void SAPI::log(Pool& pool, const char *fmt, ...) { - request_rec *r=static_cast(pool.context()); + request_rec *r=static_cast(pool.get_context()); va_list args; va_start(args,fmt); @@ -152,13 +153,25 @@ void SAPI::log(Pool& pool, const char *f va_end(args); } +void SAPI::die(const char *fmt, ...) { + va_list args; + va_start(args,fmt); + char buf[MAX_STRING]; + size_t size=vsnprintf(buf, MAX_STRING, fmt, args); + remove_crlf(buf, buf+size); + ap_log_error(APLOG_MARK, APLOG_EMERG, 0, "%s", buf); + va_end(args); + + exit(1); +} + const char *SAPI::get_env(Pool& pool, const char *name) { - request_rec *r=static_cast(pool.context()); + request_rec *r=static_cast(pool.get_context()); return (const char *)ap_table_get(r->subprocess_env, name); } size_t SAPI::read_post(Pool& pool, char *buf, size_t max_bytes) { - request_rec *r=static_cast(pool.context()); + request_rec *r=static_cast(pool.get_context()); /* ap_log_error(APLOG_MARK, APLOG_DEBUG, r->server, "mod_parser3: SAPI::read_post(max=%u)", max_bytes); @@ -185,7 +198,7 @@ size_t SAPI::read_post(Pool& pool, char } void SAPI::add_header_attribute(Pool& pool, const char *key, const char *value) { - request_rec *r=static_cast(pool.context()); + request_rec *r=static_cast(pool.get_context()); if(strcasecmp(key, "location")==0) r->status=302; @@ -204,7 +217,7 @@ void SAPI::add_header_attribute(Pool& po } void SAPI::send_header(Pool& pool) { - request_rec *r=static_cast(pool.context()); + request_rec *r=static_cast(pool.get_context()); ap_hard_timeout("Send header", r); ap_send_http_header(r); @@ -212,7 +225,7 @@ void SAPI::send_header(Pool& pool) { } void SAPI::send_body(Pool& pool, const void *buf, size_t size) { - request_rec *r=static_cast(pool.context()); + request_rec *r=static_cast(pool.get_context()); ap_hard_timeout("Send body", r); ap_rwrite(buf, size, r); @@ -226,8 +239,68 @@ void SAPI::send_body(Pool& pool, const v @todo intelligent cache-control */ +static void real_parser_handler(Pool& pool, request_rec *r) { + ap_add_common_vars(r); + ap_add_cgi_vars(r); + + // Request info + Request::Info request_info; + request_info.document_root=SAPI::get_env(pool, "DOCUMENT_ROOT"); + request_info.path_translated=r->filename; + request_info.method=r->method; + request_info.query_string=r->args; + request_info.uri=SAPI::get_env(pool, "REQUEST_URI"); + request_info.content_type=SAPI::get_env(pool, "CONTENT_TYPE"); + const char *content_length=SAPI::get_env(pool, "CONTENT_LENGTH"); + request_info.content_length=content_length?atoi(content_length):0; + request_info.cookie=SAPI::get_env(pool, "HTTP_COOKIE"); + request_info.user_agent=SAPI::get_env(pool, "HTTP_USER_AGENT"); + + // config + Parser_module_config *dcfg=our_dconfig(r); + + //_asm int 3; + // prepare to process request + Request request(pool, + request_info, + String::UL_USER_HTML, + dcfg->parser_status_allowed + ); + + // process the request + request.core( + dcfg->parser_root_config_filespec, true, // /path/to/admin/config + dcfg->parser_site_config_filespec, true, // /path/to/site/config + r->header_only!=0); +} + +void call_real_parser_handler__do_SEH(Pool& pool, request_rec *r) { +#if _MSC_VER & !defined(_DEBUG) + LPEXCEPTION_POINTERS system_exception=0; + __try { +#endif + real_parser_handler(pool, r); + +#if _MSC_VER & !defined(_DEBUG) + } __except ( + (system_exception=GetExceptionInformation()), + EXCEPTION_EXECUTE_HANDLER) { + + if(system_exception) + if(_EXCEPTION_RECORD *er=system_exception->ExceptionRecord) + throw Exception(0, 0, + 0, + "Exception 0x%08X at 0x%08X", er->ExceptionCode, er->ExceptionAddress); + else + throw Exception(0, 0, 0, "Exception "); + else + throw Exception(0, 0, 0, "Exception "); + } +#endif +} + static int parser_handler(request_rec *r) { -// _asm int 3; + //_asm int 3; if(r->finfo.st_mode == 0) return NOT_FOUND; @@ -246,49 +319,15 @@ static int parser_handler(request_rec *r pool.register_cleanup(callXalanTerminate, 0); #endif - Parser_module_config *dcfg=our_dconfig(r); - - /* A flag which modules can set, to indicate that the data being * returned is volatile, and clients should be told not to cache it. */ r->no_cache=1; - PTRY { // global try - ap_add_common_vars(r); - ap_add_cgi_vars(r); - - // Request info - Request::Info request_info; - request_info.document_root=SAPI::get_env(pool, "DOCUMENT_ROOT"); - request_info.path_translated=r->filename; - request_info.method=r->method; - request_info.query_string=r->args; - request_info.uri=SAPI::get_env(pool, "REQUEST_URI"); - request_info.content_type=SAPI::get_env(pool, "CONTENT_TYPE"); - const char *content_length=SAPI::get_env(pool, "CONTENT_LENGTH"); - request_info.content_length=content_length?atoi(content_length):0; - request_info.cookie=SAPI::get_env(pool, "HTTP_COOKIE"); - request_info.user_agent=SAPI::get_env(pool, "HTTP_USER_AGENT"); - - //_asm int 3; - // prepare to process request - Request request(pool, - request_info, - String::UL_USER_HTML - ); - - // process the request - request.core( - dcfg->parser_root_config_filespec, true, // /path/to/admin/config - dcfg->parser_site_config_filespec, true, // /path/to/site/config - r->header_only!=0); - // no actions with request' data past this point - // request.exception not not handled here, but all - // request' data are associated with it's pool=exception - + try { // global try + call_real_parser_handler__do_SEH(pool, r); // successful finish - } PCATCH(e) { // global problem + } catch(const Exception& e) { // global problem // don't allocate anything on pool here: // possible pool' exception not catch-ed now // and there could be out-of-memory exception @@ -314,7 +353,6 @@ static int parser_handler(request_rec *r // unsuccessful finish } - PEND_CATCH /* * We did what we wanted to do, so tell the rest of the server we @@ -370,7 +408,8 @@ static void setup_module_cells() { * allocate our module-private pool. */ static Pool pool(ap_make_sub_pool(NULL)); // global pool - PTRY { + /// no trying to __try here [yet] + try { // init socks init_socks(pool); @@ -389,12 +428,9 @@ static void setup_module_cells() { init_methoded_array(pool); // init global variables pa_globals_init(pool); - } PCATCH(e) { // global problem - ap_log_error(APLOG_MARK, APLOG_EMERG, 0, - "setup_module_cells failed: ", e.comment()); - exit(1); + } catch(const Exception& e) { // global problem + SAPI::die("setup_module_cells failed: %s", e.comment()); } - PEND_CATCH } static void parser_server_init(server_rec *s, pool *p) { @@ -432,6 +468,8 @@ static void *parser_create_dir_config(po */ cfg->parser_root_config_filespec = 0; cfg->parser_site_config_filespec = 0; + cfg->parser_status_allowed=false; + return (void *) cfg; } @@ -459,6 +497,9 @@ static void *parser_merge_dir_config(poo // always from parent merged_config->parser_root_config_filespec = ap_pstrdup(p, pconf->parser_root_config_filespec); + merged_config->parser_status_allowed= + pconf->parser_status_allowed || + nconf->parser_status_allowed; /* * Some things get copied directly from the more-specific record, rather * than getting merged. @@ -486,6 +527,7 @@ static void *parser_create_server_config cfg->parser_root_config_filespec = 0; cfg->parser_site_config_filespec = 0; + cfg->parser_status_allowed=false; return (void *) cfg; } @@ -520,6 +562,9 @@ static void *parser_merge_server_config( s2conf->parser_root_config_filespec:s1conf->parser_root_config_filespec); merged_config->parser_site_config_filespec = ap_pstrdup(p, s2conf->parser_site_config_filespec? s2conf->parser_site_config_filespec:s1conf->parser_site_config_filespec); + merged_config->parser_status_allowed= + s1conf->parser_status_allowed || + s2conf->parser_status_allowed; return (void *) merged_config; } @@ -596,7 +641,7 @@ static int parser_access_checker(request static const command_rec parser_cmds[] = { { - DEBUG_PREFIX"ParserRootConfig", /* directive name */ + "ParserRootConfig", /* directive name */ (const char *(*)(void))((void *)cmd_parser_config), // config action routine (void*)true, /* argument to include in call */ (int)(ACCESS_CONF|RSRC_CONF), /* where available */ @@ -604,13 +649,21 @@ static const command_rec parser_cmds[] = "Parser root config filespec (Admin)" // directive description }, { - DEBUG_PREFIX"ParserSiteConfig", /* directive name */ + "ParserSiteConfig", /* directive name */ (const char *(*)(void))((void *)cmd_parser_config), // config action routine (void*)false, /* argument to include in call */ (int)(OR_OPTIONS), /* where available */ TAKE1, /* arguments */ "Parser site config filespec" // directive description }, + { + "ParserStatusAllowed", /* directive name */ + (const char *(*)(void))((void *)cmd_parser_status_allowed), // config action routine + (void*)0, /* argument to include in call */ + (int)(ACCESS_CONF), /* where available */ + NO_ARGS, /* arguments */ + "Parser status class can be used" // directive description + }, {NULL} }; @@ -633,7 +686,7 @@ static const command_rec parser_cmds[] = */ static const handler_rec parser_handlers[] = { - {DEBUG_PREFIX"parser3-handler", parser_handler}, + {"parser3-handler", parser_handler}, {NULL} }; @@ -651,7 +704,7 @@ static const handler_rec parser_handlers * during request processing. Note that not all routines are necessarily * called (such as if a resource doesn't have access restrictions). */ -module MODULE_VAR_EXPORT PARSER3_MODULE = +module MODULE_VAR_EXPORT parser3_module = { STANDARD_MODULE_STUFF, parser_server_init, /* module initializer */