--- parser3/src/targets/isapi/parser3isapi.C 2002/03/05 07:48:07 1.65 +++ parser3/src/targets/isapi/parser3isapi.C 2002/05/07 07:23:11 1.69.2.2 @@ -4,7 +4,7 @@ Copyright (c) 2000,2001, 2002 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) - $Id: parser3isapi.C,v 1.65 2002/03/05 07:48:07 paf Exp $ + $Id: parser3isapi.C,v 1.69.2.2 2002/05/07 07:23:11 paf Exp $ */ #ifndef _MSC_VER @@ -189,6 +189,7 @@ void SAPI::send_header(Pool& pool) { break; } header_info.cchStatus=strlen(header_info.pszStatus); + *ctx.header << "\r\n"; // ISAPI v<5 did quite well without it header_info.pszHeader=ctx.header->cstr(); header_info.cchHeader=ctx.header->size(); header_info.fKeepConn=true; @@ -214,6 +215,9 @@ int failed_new(size_t size) { return 0; // not reached } +#ifdef _DEBUG +static Pool_storage *global_pool_storagep; +#endif static bool parser_init() { static bool globals_inited=false; if(globals_inited) @@ -223,6 +227,9 @@ static bool parser_init() { _set_new_handler(failed_new); static Pool_storage pool_storage; +#ifdef _DEBUG + global_pool_storagep=&pool_storage; +#endif static Pool pool(&pool_storage); // global pool try { // init socks @@ -282,7 +289,7 @@ void real_parser_handler(Pool& pool, LPE strncpy(buf, filespec_to_process, len); buf[len]=0; request_info.document_root=buf; } else - throw Exception(0, 0, + throw Exception("parser.runtime", 0, "ISAPI: no PATH_INFO defined (in reinventing DOCUMENT_ROOT)"); @@ -310,7 +317,12 @@ void real_parser_handler(Pool& pool, LPE Request request(pool, request_info, String::UL_HTML|String::UL_OPTIMIZE_BIT, - false /* status_allowed */); +#ifdef _DEBUG + true +#else + false +#endif + /* status_allowed */); // some root-controlled location // c:\windows @@ -339,8 +351,8 @@ void real_parser_handler(Pool& pool, LPE // process the request request.core( - root_config_filespec, false /*don't fail_on_read_problem*/, // /path/to/admin/parser3.conf - site_config_filespec, false /*don't fail_on_read_problem*/, // /path/to/site/parser3.conf + root_config_filespec, false /*fail_on_read_problem*/, // /path/to/root/parser3.conf + site_config_filespec, false /*fail_on_read_problem*/, // /path/to/site/parser3.conf header_only); } @@ -360,19 +372,18 @@ void call_real_parser_handler__do_SEH(Po if(system_exception) if(_EXCEPTION_RECORD *er=system_exception->ExceptionRecord) - throw Exception(0, 0, + throw Exception(0, 0, "Exception 0x%08X at 0x%08X", er->ExceptionCode, er->ExceptionAddress); else - throw Exception(0, 0, 0, "Exception "); + throw Exception(0, 0, "Exception "); else - throw Exception(0, 0, 0, "Exception "); + throw Exception(0, 0, "Exception "); } #endif } - -DWORD WINAPI HttpExtensionProc(LPEXTENSION_CONTROL_BLOCK lpECB) { +inline DWORD RealHttpExtensionProc(LPEXTENSION_CONTROL_BLOCK lpECB) { Pool_storage pool_storage; Pool pool(&pool_storage); // no allocations until assigned context [for reporting] SAPI_func_context ctx={ @@ -381,7 +392,7 @@ DWORD WINAPI HttpExtensionProc(LPEXTENSI 200 // default http_response_code }; pool.set_context(&ctx);// no allocations before this line! - + bool header_only=strcasecmp(lpECB->lpszMethod, "HEAD")==0; try { // global try call_real_parser_handler__do_SEH(pool, lpECB, header_only); @@ -402,7 +413,7 @@ DWORD WINAPI HttpExtensionProc(LPEXTENSI int header_len=snprintf(header_buf, MAX_STRING, "content-type: text/plain\r\n" "content-length: %lu\r\n" - "expires: Fri, 23 Mar 2001 09:32:23 GMT\r\n" +// "expires: Fri, 23 Mar 2001 09:32:23 GMT\r\n" "\r\n", content_length); @@ -458,6 +469,34 @@ DWORD WINAPI HttpExtensionProc(LPEXTENSI return HSE_STATUS_SUCCESS_AND_KEEP_CONN; } +#ifdef _DEBUG +//for memory leaks detection only +#undef _WINDOWS_ +#include +#endif +DWORD WINAPI HttpExtensionProc(LPEXTENSION_CONTROL_BLOCK lpECB) { +// Declare the variables needed +#ifdef _DEBUG +// _crtBreakAlloc=97779;//97777; //997; + + CMemoryState oldMemState, newMemState, diffMemState; + oldMemState.Checkpoint(); +#endif + + DWORD result=RealHttpExtensionProc(lpECB); + +#ifdef _DEBUG + newMemState.Checkpoint(); + if( diffMemState.Difference( oldMemState, newMemState ) ) + { + TRACE( "Memory leaked!\n" ); + diffMemState.DumpStatistics( ); + diffMemState.DumpAllObjectsSince(); + } +#endif + return result; +} + BOOL WINAPI DllMain( HINSTANCE hinstDLL, // handle to the DLL module DWORD fdwReason, // reason for calling function