Diff for /parser3/src/targets/isapi/parser3isapi.C between versions 1.89.2.1 and 1.101

version 1.89.2.1, 2004/04/05 09:26:55 version 1.101, 2009/08/30 05:30:08
Line 1 Line 1
 /** @file  /** @file
         Parser: IIS extension.          Parser: IIS extension.
   
         Copyright (c) 2000,2001-2004 ArtLebedev Group (http://www.artlebedev.com)          Copyright (c) 2000,2001-2005 ArtLebedev Group (http://www.artlebedev.com)
         Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)          Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
 */  */
   
Line 19  static const char * const IDENT_PARSER3I Line 19  static const char * const IDENT_PARSER3I
 #include "pa_version.h"  #include "pa_version.h"
 #include "pa_socks.h"  #include "pa_socks.h"
   
   #define  WINVER  0x0400
 #include <windows.h>  #include <windows.h>
 #include <process.h>  #include <process.h>
   
 #include <httpext.h>  #include <httpext.h>
   
   // defines
   
   #if _MSC_VER && !defined(_DEBUG)
   #       define PA_SUPPRESS_SYSTEM_EXCEPTION
   #endif
   
   
 #define MAX_STATUS_LENGTH sizeof("xxxx LONGEST STATUS DESCRIPTION")  #define MAX_STATUS_LENGTH sizeof("xxxx LONGEST STATUS DESCRIPTION")
   
 // consts  // consts
Line 69  public: Line 77  public:
 void SAPI::log(SAPI_Info& SAPI_info, const char* fmt, ...) {  void SAPI::log(SAPI_Info& SAPI_info, const char* fmt, ...) {
         va_list args;          va_list args;
         va_start(args,fmt);          va_start(args,fmt);
         char buf[MAX_STRING];          char buf[MAX_LOG_STRING];
         const char* prefix="PARSER_ERROR:";          const char* prefix="PARSER_ERROR:";
         strcpy(buf, prefix);          strcpy(buf, prefix);
         char *start=buf+strlen(prefix);          char *start=buf+strlen(prefix);
         DWORD size=vsnprintf(start, MAX_STRING-strlen(prefix), fmt, args);          DWORD size=vsnprintf(start, MAX_LOG_STRING-strlen(prefix), fmt, args);
         remove_crlf(start, start+size);          size=remove_crlf(start, start+size);
   
         SAPI_info.lpECB->ServerSupportFunction(SAPI_info.lpECB->ConnID,           SAPI_info.lpECB->ServerSupportFunction(SAPI_info.lpECB->ConnID, 
                 HSE_APPEND_LOG_PARAMETER, buf, &size, 0);                  HSE_APPEND_LOG_PARAMETER, buf, &size, 0);
Line 148  const char* const *SAPI::environment(SAP Line 156  const char* const *SAPI::environment(SAP
         char* all_http_vars=SAPI::get_env(info, "ALL_HTTP");          char* all_http_vars=SAPI::get_env(info, "ALL_HTTP");
         const int http_var_count=grep_char(all_http_vars, '\n')+1/*\n for theoretical(never saw) this \0*/;          const int http_var_count=grep_char(all_http_vars, '\n')+1/*\n for theoretical(never saw) this \0*/;
   
         const char* *result=new const char*[IIS51var_count+http_var_count+1/*0*/];          const char* *result=new(PointerFreeGC) const char*[IIS51var_count+http_var_count+1/*0*/];
         const char* *cur=result;          const char* *cur=result;
   
         // IIS5.1 vars          // IIS5.1 vars
Line 204  void SAPI::add_header_attribute(SAPI_Inf Line 212  void SAPI::add_header_attribute(SAPI_Inf
         if(strcasecmp(dont_store_key, "location")==0)           if(strcasecmp(dont_store_key, "location")==0) 
                 SAPI_info.http_response_code=302;                  SAPI_info.http_response_code=302;
   
         if(strcasecmp(dont_store_key, "status")==0)           if(strcasecmp(dont_store_key, HTTP_STATUS)==0) 
                 SAPI_info.http_response_code=atoi(dont_store_value);                  SAPI_info.http_response_code=atoi(dont_store_value);
         else          else
                 (*SAPI_info.header) << pa_strdup(dont_store_key) << ": " << pa_strdup(dont_store_value) << "\r\n";                  (*SAPI_info.header) << pa_strdup(dont_store_key) << ": " << pa_strdup(dont_store_value) << "\r\n";
Line 243  void SAPI::send_header(SAPI_Info& SAPI_i Line 251  void SAPI::send_header(SAPI_Info& SAPI_i
                 HSE_REQ_SEND_RESPONSE_HEADER_EX, &header_info, NULL, NULL);                  HSE_REQ_SEND_RESPONSE_HEADER_EX, &header_info, NULL, NULL);
 }  }
   
 void SAPI::send_body(SAPI_Info& SAPI_info, const void *buf, size_t size) {  size_t SAPI::send_body(SAPI_Info& SAPI_info, const void *buf, size_t size) {
         DWORD num_bytes=size;          DWORD num_bytes=size;
         SAPI_info.lpECB->WriteClient(SAPI_info.lpECB->ConnID,           if(!SAPI_info.lpECB->WriteClient(SAPI_info.lpECB->ConnID, 
                 const_cast<void *>(buf), &num_bytes, HSE_IO_SYNC);                  const_cast<void *>(buf), &num_bytes, HSE_IO_SYNC))
                   return 0;
           return (size_t)num_bytes;
 }  }
   
   
Line 264  static bool parser_init() { Line 274  static bool parser_init() {
   
                 // successful finish                  // successful finish
                 return true;                  return true;
         } catch(const Exception& e) { // global problem           } catch(.../*const Exception& e*/) { // global problem 
                 //const char* body=e.comment();                  //const char* body=e.comment();
                                   
                 // unsuccessful finish                  // unsuccessful finish
Line 308  BOOL WINAPI TerminateExtension( Line 318  BOOL WINAPI TerminateExtension(
         @test          @test
                 PARSER_VERSION from outside                  PARSER_VERSION from outside
 */  */
   
 void real_parser_handler(SAPI_Info& SAPI_info, bool header_only) {  void real_parser_handler(SAPI_Info& SAPI_info, bool header_only) {
         // collect garbage from prev request          // collect garbage from prev request
 #ifndef PA_DEBUG_DISABLE_GC  #ifndef PA_DEBUG_DISABLE_GC
Line 339  void real_parser_handler(SAPI_Info& SAPI Line 348  void real_parser_handler(SAPI_Info& SAPI
                 strncpy(buf, filespec_to_process, len); buf[len]=0;                  strncpy(buf, filespec_to_process, len); buf[len]=0;
                 request_info.document_root=buf;                  request_info.document_root=buf;
         } else          } else
                 throw Exception("parser.runtime",                  throw Exception(PARSER_RUNTIME,
                         0,                          0,
                         "ISAPI: no PATH_INFO defined (in reinventing DOCUMENT_ROOT)");                          "ISAPI: no PATH_INFO defined (in reinventing DOCUMENT_ROOT)");
   
Line 389  void real_parser_handler(SAPI_Info& SAPI Line 398  void real_parser_handler(SAPI_Info& SAPI
                 header_only);                  header_only);
 }  }
   
 void call_real_parser_handler__do_SEH(SAPI_Info& SAPI_info, bool header_only) {  #ifdef PA_SUPPRESS_SYSTEM_EXCEPTION
 #if _MSC_VER & !defined(_DEBUG)  static const Exception 
   call_real_parser_handler__do_PEH_return_it(
           SAPI_Info& SAPI_info, bool header_only) 
   {
           try {
                   real_parser_handler(SAPI_info, header_only);
           } catch(const Exception& e) {
                   return e;
           }
   
           return Exception();
   }
   static void call_real_parser_handler__supress_system_exception(
           SAPI_Info& SAPI_info, bool header_only) 
   {
           Exception parser_exception;
         LPEXCEPTION_POINTERS system_exception=0;          LPEXCEPTION_POINTERS system_exception=0;
   
         __try {          __try {
 #endif                  parser_exception=call_real_parser_handler__do_PEH_return_it(
                 real_parser_handler(SAPI_info, header_only);                          SAPI_info, header_only);
                   
 #if _MSC_VER & !defined(_DEBUG)  
         } __except (          } __except (
                 (system_exception=GetExceptionInformation()),                   (system_exception=GetExceptionInformation()), 
                 EXCEPTION_EXECUTE_HANDLER) {                  EXCEPTION_EXECUTE_HANDLER) 
                           {
   
                 if(system_exception)                  if(system_exception)
                         if(_EXCEPTION_RECORD *er=system_exception->ExceptionRecord)                          if(_EXCEPTION_RECORD *er=system_exception->ExceptionRecord)
                                 throw Exception(0,                                  throw Exception("system",
                                 0,                                          0,
                                 "Exception 0x%08X at 0x%08X", er->ExceptionCode,  er->ExceptionAddress);                                          "0x%08X at 0x%08X", er->ExceptionCode,  er->ExceptionAddress);
                         else  
                                 throw Exception(0, 0, "Exception <no exception record>");  
                         else                          else
                                 throw Exception(0, 0, "Exception <no exception information>");                                  throw Exception("system", 
                                           0, 
                                           "<no exception record>");
                   else
                           throw Exception("system", 
                                   0, 
                                   "<no exception information>");
         }          }
 #endif  
           if(parser_exception)
                   throw Exception(parser_exception);
 }  }
   #endif
   
 DWORD WINAPI HttpExtensionProc(LPEXTENSION_CONTROL_BLOCK lpECB) {  DWORD WINAPI HttpExtensionProc(LPEXTENSION_CONTROL_BLOCK lpECB) {
         //_asm int 3;          //_asm int 3;
Line 424  DWORD WINAPI HttpExtensionProc(LPEXTENSI Line 455  DWORD WINAPI HttpExtensionProc(LPEXTENSI
   
         bool header_only=strcasecmp(lpECB->lpszMethod, "HEAD")==0;          bool header_only=strcasecmp(lpECB->lpszMethod, "HEAD")==0;
         try { // global try          try { // global try
                 call_real_parser_handler__do_SEH(SAPI_info, header_only);  #ifdef PA_SUPPRESS_SYSTEM_EXCEPTION
                   call_real_parser_handler__supress_system_exception(
   #else
                   real_parser_handler(
   #endif
                           SAPI_info, header_only);
                 // successful finish                  // successful finish
         } catch(const Exception& e) { // global problem          } catch(const Exception& e) { // global problem
                 // don't allocate anything on pool here:                  // don't allocate anything on pool here:
Line 440  DWORD WINAPI HttpExtensionProc(LPEXTENSI Line 476  DWORD WINAPI HttpExtensionProc(LPEXTENSI
                 // prepare header // not using SAPI func wich allocates on pool                  // prepare header // not using SAPI func wich allocates on pool
                 char header_buf[MAX_STRING];                  char header_buf[MAX_STRING];
                 int header_len=snprintf(header_buf, MAX_STRING,                  int header_len=snprintf(header_buf, MAX_STRING,
                         "content-type: text/plain\r\n"                          HTTP_CONTENT_TYPE ": text/plain\r\n"
                         "content-length: %u\r\n"                          HTTP_CONTENT_LENGTH ": %u\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",                          "\r\n",
                         content_length);                          content_length);
Line 473  DWORD WINAPI HttpExtensionProc(LPEXTENSI Line 509  DWORD WINAPI HttpExtensionProc(LPEXTENSI
                 // prepare header // not using SAPI func wich allocates on pool                  // prepare header // not using SAPI func wich allocates on pool
                 char header_buf[MAX_STRING];                  char header_buf[MAX_STRING];
                 int header_len=snprintf(header_buf, MAX_STRING,                  int header_len=snprintf(header_buf, MAX_STRING,
                         "content-type: text/plain\r\n"                          HTTP_CONTENT_TYPE ": text/plain\r\n"
                         "content-length: %u\r\n"                          HTTP_CONTENT_LENGTH ": %u\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",                          "\r\n",
                         content_length);                          content_length);

Removed from v.1.89.2.1  
changed lines
  Added in v.1.101


E-mail: