--- parser3/src/targets/cgi/parser3.C 2001/11/05 15:18:15 1.129 +++ parser3/src/targets/cgi/parser3.C 2001/11/15 20:26:34 1.133 @@ -4,13 +4,14 @@ Copyright(c) 2001 ArtLebedev Group(http://www.artlebedev.com) Author: Alexander Petrosyan (http://paf.design.ru) - $Id: parser3.C,v 1.129 2001/11/05 15:18:15 paf Exp $ + $Id: parser3.C,v 1.133 2001/11/15 20:26:34 paf Exp $ */ #include "pa_config_includes.h" #ifdef WIN32 # include +# include #endif #include "pa_sapi.h" @@ -268,8 +269,8 @@ void real_parser_handler( // prepare to process request Request request(pool, request_info, - cgi ? String::UL_USER_HTML : String::UL_AS_IS - ); + cgi ? String::UL_USER_HTML : String::UL_AS_IS, + true /* status_allowed */); // some root-controlled location #ifdef SYSCONFDIR @@ -323,7 +324,7 @@ void real_parser_handler( void call_real_parser_handler__do_SEH( const char *filespec_to_process, const char *request_method, bool header_only) { -#if _MSC_VER & !defined(_DEBUG) +#if _MSC_VER && !defined(_DEBUG) LPEXCEPTION_POINTERS system_exception=0; __try { #endif @@ -331,7 +332,7 @@ void call_real_parser_handler__do_SEH( filespec_to_process, request_method, header_only); -#if _MSC_VER & !defined(_DEBUG) +#if _MSC_VER && !defined(_DEBUG) } __except ( (system_exception=GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER) { @@ -349,6 +350,47 @@ void call_real_parser_handler__do_SEH( #endif } +void report_error(const char *prefix, const char *body, bool header_only) { + if(!body) + body=""; + + // log it + SAPI::log(pool, "%s%s", prefix?prefix:"", body); + + // + int content_length=strlen(body); + + // prepare header + SAPI::add_header_attribute(pool, "content-type", "text/plain"); + char content_length_cstr[MAX_NUMBER]; + snprintf(content_length_cstr, MAX_NUMBER, "%u", content_length); + SAPI::add_header_attribute(pool, "content-length", content_length_cstr); + + // send header + SAPI::send_header(pool); + + // body + if(!header_only) + SAPI::send_body(pool, body, content_length); +} + +#ifdef WIN32 +int failed_new(size_t size) { + const char *msg="out of memory"; + report_error(0, msg, false/*header_only*/); + SAPI::die(msg); + return 0; // not reached +} +#endif + +#ifdef HAVE_SET_NEW_HANDLER +void failed_new() { + const char *msg="out of memory"; + report_error(0, msg, false/*header_only*/); + SAPI::die(msg); +} +#endif + int main(int argc, char *argv[]) { int result; argv0=argv[0]; @@ -389,6 +431,15 @@ int main(int argc, char *argv[]) { const char *request_method=getenv("REQUEST_METHOD"); bool header_only=request_method && strcasecmp(request_method, "HEAD")==0; + +#ifdef WIN32 + _set_new_handler(failed_new); +#endif + +#ifdef HAVE_SET_NEW_HANDLER + std::set_new_handler(failed_new); +#endif + try { // global try call_real_parser_handler__do_SEH( filespec_to_process, @@ -401,28 +452,17 @@ int main(int argc, char *argv[]) { // possible pool' exception not catch-ed now // and there could be out-of-memory exception - const char *body=e.comment(); - // log it - SAPI::log(pool, "exception in request exception handler: %s", body); - - // - int content_length=strlen(body); - - // prepare header - SAPI::add_header_attribute(pool, "content-type", "text/plain"); - char content_length_cstr[MAX_NUMBER]; - snprintf(content_length_cstr, MAX_NUMBER, "%u", content_length); - SAPI::add_header_attribute(pool, "content-length", content_length_cstr); - - // send header - SAPI::send_header(pool); - - // body - if(!header_only) - SAPI::send_body(pool, body, content_length); + report_error("exception in request exception handler: ", e.comment(), header_only); // unsuccessful finish result=1; +#if _MSC_VER && !defined(_DEBUG) + } catch(...) { + report_error(0, "", header_only); + + // unsuccessful finish + result=1; +#endif }