--- parser3/src/targets/apache13/Attic/mod_parser3.C 2003/03/24 13:43:42 1.28.2.6.2.4 +++ parser3/src/targets/apache13/Attic/mod_parser3.C 2003/07/23 08:18:17 1.28.2.6.2.6 @@ -5,11 +5,13 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_MOD_PARSER3_C="$Date: 2003/03/24 13:43:42 $"; +static const char* IDENT_MOD_PARSER3_C="$Date: 2003/07/23 08:18:17 $"; -#include "pa_config_includes.h" +#if _MSC_VER +#pragma warning(disable:4518) +#endif -#include "pa_globals.h" +#include "pa_config_includes.h" #include "httpd.h" #include "http_config.h" @@ -19,6 +21,8 @@ static const char* IDENT_MOD_PARSER3_C=" #include "http_protocol.h" #include "util_script.h" +#include "pa_globals.h" + #include "pa_common.h" #include "pa_sapi.h" #include "classes.h" @@ -26,6 +30,7 @@ static const char* IDENT_MOD_PARSER3_C=" #include "pa_version.h" #include "pa_socks.h" + /// apache parser module configuration [httpd.conf + .htaccess-es] struct Parser_module_config { const char* parser_config_filespec; ///< filespec of site's config file @@ -92,16 +97,20 @@ static const char* cmd_parser_status_all //@{ /// SAPI func decl -void SAPI::logconst char* fmt, ...) { - request_rec *r=static_cast(pool.get_context()); - va_list args; - va_start(args,fmt); +class SAPI_Info { +public: + request_rec* r; +}; + +void SAPI::log(SAPI_Info& SAPI_info, 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_rerror(0, 0, APLOG_ERR | APLOG_NOERRNO, r, "%s", buf); - va_end(args); + ap_log_rerror(0, 0, APLOG_ERR | APLOG_NOERRNO, SAPI_info.r, "%s", buf); + va_end(args); } static void die_or_abort(const char* fmt, va_list args, bool write_core) { @@ -118,31 +127,30 @@ static void die_or_abort(const char* fmt } void SAPI::die(const char* fmt, ...) { - va_list args; + va_list args; va_start(args, fmt); die_or_abort(fmt, args, false/*write core?*/); va_end(args); } void SAPI::abort(const char* fmt, ...) { - va_list args; + va_list args; va_start(args, fmt); die_or_abort(fmt, args, true/*write core?*/); va_end(args); } -char* SAPI::get_env(SAPI_Info& info, const char* name) { - request_rec *r=static_cast(pool.get_context()); - return (const char* )ap_table_get(r->subprocess_env, name); +char* SAPI::get_env(SAPI_Info& SAPI_info, const char* name) { + const char* dont_return_me=(const char* )ap_table_get(SAPI_info.r->subprocess_env, name); + return dont_return_me?pa_strdup(dont_return_me):0; } #ifndef DOXYGEN struct SAPI_environment_append_info { - ; - const char* *cur; + const char** cur; }; #endif -static const char* mk_env_pairconst char* key, const char* value) { +static const char* mk_env_pair(const char* key, const char* value) { char *result=new(PointerFreeGC) char[strlen(key)+1/*=*/+strlen(value)+1/*0*/]; strcpy(result, key); strcat(result, "="); strcat(result, value); return result; @@ -151,38 +159,35 @@ static int SAPI_environment_append(void if( k && val ) { SAPI_environment_append_info& info= *static_cast(d); - *info.cur++=mk_env_pair(*info.k, val); + *info.cur++=mk_env_pair(k, val); } return 1/*true*/; } -const char* const *SAPI::environment(SAPI_Info& info, ) { - request_rec *r=static_cast(pool.get_context()); - const table *t=r->subprocess_env; - const char* *result=new const char*[ap_table_elts(t)->nelts+1/*0*/]; - SAPI_environment_append_info info={&result}; +const char* const* SAPI::environment(SAPI_Info& SAPI_info) { + const table *t=SAPI_info.r->subprocess_env; + const char** result=new const char*[ap_table_elts(t)->nelts+1/*0*/]; + SAPI_environment_append_info info={result}; ap_table_do(SAPI_environment_append, &info, t, 0); *info.cur=0; // mark EOE return result; } -size_t SAPI::read_postchar *buf, size_t max_bytes) { - request_rec *r=static_cast(pool.get_context()); - -/* ap_log_error(APLOG_MARK, APLOG_DEBUG, r->server, +size_t SAPI::read_post(SAPI_Info& SAPI_info, char *buf, size_t max_bytes) { +/* ap_log_error(APLOG_MARK, APLOG_DEBUG, SAPI_info.r->server, "mod_parser3: SAPI::read_post(max=%u)", max_bytes); */ int retval; - if((retval = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR))) + if((retval = ap_setup_client_block(SAPI_info.r, REQUEST_CHUNKED_ERROR))) return 0; - if(!ap_should_client_block(r)) + if(!ap_should_client_block(SAPI_info.r)) return 0; uint total_read_bytes=0; void (*handler)(int)=signal(SIGPIPE, SIG_IGN); while (total_read_bytes(pool.get_context()); - - if(strcasecmp(key, "location")==0) - r->status=302; +void SAPI::add_header_attribute(SAPI_Info& SAPI_info, + const char* dont_store_key, const char* dont_store_value) { + if(strcasecmp(dont_store_key, "location")==0) + SAPI_info.r->status=302; - if(strcasecmp(key, "content-type")==0) { + if(strcasecmp(dont_store_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 * "text/plain"). You *must* also ensure that r->content_type is lower * case. */ - r->content_type = value; - } else if(strcasecmp(key, "status")==0) - r->status=atoi(value); + SAPI_info.r->content_type = ap_pstrdup(SAPI_info.r->pool, dont_store_value); + } else if(strcasecmp(dont_store_key, "status")==0) + SAPI_info.r->status=atoi(dont_store_value); else -todo: copy dont_store_ to nonvilotile - ap_table_addn(r->headers_out, key, value); + ap_table_addn(SAPI_info.r->headers_out, + ap_pstrdup(SAPI_info.r->pool, dont_store_key), + ap_pstrdup(SAPI_info.r->pool, dont_store_value)); } -void SAPI::send_header() { - request_rec *r=static_cast(pool.get_context()); - - ap_hard_timeout("Send header", r); - ap_send_http_header(r); - ap_kill_timeout(r); +void SAPI::send_header(SAPI_Info& SAPI_info) { + ap_hard_timeout("Send header", SAPI_info.r); + ap_send_http_header(SAPI_info.r); + ap_kill_timeout(SAPI_info.r); } -void SAPI::send_bodyconst void *buf, size_t size) { - request_rec *r=static_cast(pool.get_context()); - - ap_hard_timeout("Send body", r); - ap_rwrite(buf, size, r); - ap_kill_timeout(r); +void SAPI::send_body(SAPI_Info& SAPI_info, const void *buf, size_t size) { + ap_hard_timeout("Send body", SAPI_info.r); + ap_rwrite(buf, size, SAPI_info.r); + ap_kill_timeout(SAPI_info.r); } //@} @@ -236,46 +236,48 @@ void SAPI::send_bodyconst void *buf, siz @todo intelligent cache-control */ -static void real_parser_handlerrequest_rec *r) { - ap_add_common_vars(r); - ap_add_cgi_vars(r); +static void real_parser_handler(SAPI_Info& SAPI_info) { + ap_add_common_vars(SAPI_info.r); + ap_add_cgi_vars(SAPI_info.r); // Request info - Request::Info request_info; - request_info.document_root=SAPI::get_env("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("REQUEST_URI"); - request_info.content_type=SAPI::get_env("CONTENT_TYPE"); - const char* content_length=SAPI::get_env("CONTENT_LENGTH"); + Request_info request_info; memset(&request_info, 0, sizeof(request_info)); + + request_info.document_root=SAPI::get_env(SAPI_info, "DOCUMENT_ROOT"); + request_info.path_translated=SAPI_info.r->filename; + request_info.method=SAPI_info.r->method; + request_info.query_string=SAPI_info.r->args; + request_info.uri=SAPI::get_env(SAPI_info, "REQUEST_URI"); + request_info.content_type=SAPI::get_env(SAPI_info, "CONTENT_TYPE"); + const char* content_length=SAPI::get_env(SAPI_info, "CONTENT_LENGTH"); request_info.content_length=content_length?atoi(content_length):0; - request_info.cookie=SAPI::get_env("HTTP_COOKIE"); + request_info.cookie=SAPI::get_env(SAPI_info, "HTTP_COOKIE"); request_info.mail_received=false; // config - Parser_module_config *dcfg=our_dconfig(r); + Parser_module_config *dcfg=our_dconfig(SAPI_info.r); //_asm int 3; // prepare to process request - Request request(pool, + Request request( + SAPI_info, request_info, - String::L_HTML|String::L_OPTIMIZE_BIT, + String::Language(String::L_HTML|String::L_OPTIMIZE_BIT), dcfg->parser_status_allowed ); // process the request request.core( dcfg->parser_config_filespec, true, // /path/to/config - r->header_only!=0); + SAPI_info.r->header_only!=0); } -void call_real_parser_handler__do_SEHrequest_rec *r) { +void call_real_parser_handler__do_SEH(SAPI_Info& SAPI_info) { #if _MSC_VER & !defined(_DEBUG) LPEXCEPTION_POINTERS system_exception=0; __try { #endif - real_parser_handler(r); + real_parser_handler(SAPI_info); #if _MSC_VER & !defined(_DEBUG) } __except ( @@ -297,20 +299,20 @@ void call_real_parser_handler__do_SEHreq /// @test r->finfo.st_mode check seems to work only on win32 static int parser_handler(request_rec *r) { + // SAPI info + SAPI_Info SAPI_info; SAPI_info.r=r; + //_asm int 3; - if(r->finfo.st_mode == 0) + if(r->finfo.st_mode == 0) return NOT_FOUND; - Pool pool(r->pool); - pool.set_context(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; try { // global try - call_real_parser_handler__do_SEH(r); + call_real_parser_handler__do_SEH(SAPI_info); // successful finish } catch(const Exception& e) { // global problem // don't allocate anything on pool here: @@ -318,23 +320,23 @@ static int parser_handler(request_rec *r // and there could be out-of-memory exception const char* body=e.comment(); // log it - SAPI::log("exception in request exception handler: %s", body); + SAPI::log(SAPI_info, "exception in request exception handler: %s", body); // int content_length=strlen(body); // prepare header - SAPI::add_header_attribute("content-type", "text/plain"); + SAPI::add_header_attribute(SAPI_info, "content-type", "text/plain"); char content_length_cstr[MAX_NUMBER]; snprintf(content_length_cstr, MAX_NUMBER, "%u", content_length); - SAPI::add_header_attribute("content-length", content_length_cstr); + SAPI::add_header_attribute(SAPI_info, "content-length", content_length_cstr); // send header - SAPI::send_header(); + SAPI::send_header(SAPI_info); // send body if(!r->header_only) - SAPI::send_body(body, content_length); + SAPI::send_body(SAPI_info, body, content_length); // unsuccessful finish } @@ -389,17 +391,11 @@ static void setup_module_cells() { return; globals_inited=true; - /* - * allocate our module-private pool. - */ - static Pool pool(ap_make_sub_pool(NULL)); // global pool /// no trying to __try here [yet] try { // init socks pa_init_socks(); - // init global classes - init_methoded_array(); // init global variables pa_globals_init(); } catch(const Exception& e) { // global problem