--- parser3/src/targets/apache13/modules/extra/Attic/mod_parser3.C 2001/03/26 09:09:45 1.19 +++ parser3/src/targets/apache13/modules/extra/Attic/mod_parser3.C 2001/09/07 16:51:43 1.41.4.1 @@ -4,9 +4,8 @@ Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) Author: Alexander Petrosyan (http://design.ru/paf) - - $Id: mod_parser3.C,v 1.19 2001/03/26 09:09:45 paf Exp $ */ +static const char *RCSId="$Id: mod_parser3.C,v 1.41.4.1 2001/09/07 16:51:43 parser Exp $"; #include "httpd.h" #include "http_config.h" @@ -15,30 +14,43 @@ #include "http_main.h" #include "http_protocol.h" #include "util_script.h" +#include "multithread.h" #include "pa_sapi.h" +#include "classes.h" #include "pa_common.h" #include "pa_globals.h" #include "pa_request.h" #include "pa_version.h" +#include "pa_socks.h" + +#ifdef _DEBUG +# define DEBUG_PREFIX "debug_" +# define PARSER3_MODULE debug_parser3_module +#else +# define DEBUG_PREFIX +# define PARSER3_MODULE parser3_module +#endif + +/// apache parser module configuration [httpd.conf + .htaccess-es] struct Parser_module_config { - const char* parser_root_auto_path; /// filespec of admin's auto.p file - const char* parser_site_auto_path; /// filespec of site's auto.p file + const char* parser_root_auto_path; ///< filespec of admin's auto.p file + const char* parser_site_auto_path; ///< filespec of site's auto.p file }; /* * 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_auto_path(cmd_parms *cmd, void *mconfig, char *file_spec) { @@ -79,12 +91,23 @@ static const char *cmd_parser_auto_path( //@{ /// SAPI func decl +void SAPI::log(Pool& pool, const char *fmt, ...) { + request_rec *r=static_cast(pool.context()); + + va_list args; + va_start(args,fmt); + char buf[MAX_STRING]; + vsnprintf(buf, MAX_STRING, fmt, args); + ap_log_rerror(0, 0, APLOG_ERR | APLOG_NOERRNO, r, "%s", buf); + va_end(args); +} + const char *SAPI::get_env(Pool& pool, const char *name) { request_rec *r=static_cast(pool.context()); return (const char *)ap_table_get(r->subprocess_env, name); } -uint SAPI::read_post(Pool& pool, char *buf, uint max_bytes) { +size_t SAPI::read_post(Pool& pool, char *buf, size_t max_bytes) { request_rec *r=static_cast(pool.context()); /* ap_log_error(APLOG_MARK, APLOG_DEBUG, r->server, @@ -114,6 +137,9 @@ uint SAPI::read_post(Pool& pool, char *b void SAPI::add_header_attribute(Pool& pool, const char *key, const char *value) { request_rec *r=static_cast(pool.context()); + if(strcasecmp(key, "location")==0) + r->status=302; + if(strcasecmp(key, "content-type")==0) { /* r->content_type, *not* r->headers_out("Content-type"). If you don't * set it, it will be filled in with the server's default type (typically @@ -121,8 +147,10 @@ void SAPI::add_header_attribute(Pool& po * case. */ r->content_type = value; - } else - ap_table_merge(r->headers_out, key, value); + } else if(strcasecmp(key, "status")==0) + r->status=atoi(value); + else + ap_table_addn(r->headers_out, key, value); } void SAPI::send_header(Pool& pool) { @@ -133,7 +161,7 @@ void SAPI::send_header(Pool& pool) { ap_kill_timeout(r); } -void SAPI::send_body(Pool& pool, const char *buf, size_t size) { +void SAPI::send_body(Pool& pool, const void *buf, size_t size) { request_rec *r=static_cast(pool.context()); ap_hard_timeout("Send body", r); @@ -141,25 +169,18 @@ void SAPI::send_body(Pool& pool, const c ap_kill_timeout(r); } -void SAPI::log(Pool& pool, const char *fmt, ...) { - request_rec *r=static_cast(pool.context()); - - va_list args; - va_start(args,fmt); - char buf[MAX_STRING]; - vsnprintf(buf, MAX_STRING, fmt, args); - ap_log_rerror(0, 0, APLOG_ERR | APLOG_NOERRNO, r, "%s", buf); - va_end(args); -} //@} /** main workhorse - @todo parser4: intelligent cache-control + @todo intelligent cache-control */ -static int parser_handler(request_rec *r) -{ +static int parser_handler(request_rec *r) { +// _asm int 3; + if(r->finfo.st_mode == 0) + return NOT_FOUND; + Pool pool(r->pool); pool.set_context(r); @@ -177,25 +198,22 @@ static int parser_handler(request_rec *r // Request info Request::Info request_info; - request_info.document_root=(const char *) - ap_table_get(r->subprocess_env, "DOCUMENT_ROOT"); + 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=(const char *) - ap_table_get(r->subprocess_env, "REQUEST_URI"); - request_info.content_type=(const char *) - ap_table_get(r->subprocess_env, "CONTENT_TYPE"); - const char *content_length=(const char *) - ap_table_get(r->subprocess_env, "CONTENT_LENGTH"); - request_info.content_length=(content_length?atoi(content_length):0); - request_info.cookie=(const char *) - ap_table_get(r->subprocess_env, "HTTP_COOKIE"); + 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_HTML_TYPO + String::UL_USER_HTML ); // process the request @@ -222,7 +240,7 @@ static int parser_handler(request_rec *r // prepare header SAPI::add_header_attribute(pool, "content-type", "text/plain"); char content_length_cstr[MAX_NUMBER]; - snprintf(content_length_cstr, MAX_NUMBER, "%lu", content_length); + snprintf(content_length_cstr, MAX_NUMBER, "%u", content_length); SAPI::add_header_attribute(pool, "content-length", content_length_cstr); // send header @@ -281,7 +299,7 @@ static int parser_handler(request_rec *r */ static void setup_module_cells() { - static bool globals_inited=false; + static bool globals_inited=false; if(globals_inited) return; globals_inited=true; @@ -291,6 +309,11 @@ static void setup_module_cells() { */ static Pool pool(ap_make_sub_pool(NULL)); // global pool PTRY { + // init socks + init_socks(pool); + + // init global classes + init_methoded_array(pool); // init global variables pa_globals_init(pool); } PCATCH(e) { // global problem @@ -500,7 +523,7 @@ static int parser_access_checker(request static const command_rec parser_cmds[] = { { - "parser_root_auto_path", /* directive name */ + DEBUG_PREFIX"parser_root_auto_path", /* directive name */ (const char *(*)(void))((void *)cmd_parser_auto_path), // config action routine (void*)true, /* argument to include in call */ (int)(ACCESS_CONF|RSRC_CONF), /* where available */ @@ -508,7 +531,7 @@ static const command_rec parser_cmds[] = "Parser root auto.p filespec (Admin)" // directive description }, { - "parser_site_auto_path", /* directive name */ + DEBUG_PREFIX"parser_site_auto_path", /* directive name */ (const char *(*)(void))((void *)cmd_parser_auto_path), // config action routine (void*)false, /* argument to include in call */ (int)(OR_OPTIONS), /* where available */ @@ -537,7 +560,7 @@ static const command_rec parser_cmds[] = */ static const handler_rec parser_handlers[] = { - {"parser3-handler", parser_handler}, + {DEBUG_PREFIX"parser3-handler", parser_handler}, {NULL} }; @@ -555,7 +578,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 */