Diff for /parser3/src/targets/apache13/Attic/mod_parser3.C between versions 1.19 and 1.28.2.6

version 1.19, 2002/03/27 15:30:37 version 1.28.2.6, 2003/02/26 11:51:15
Line 1 Line 1
 /** @file  /** @file
         Parser: apache 1.3 module.          Parser: apache 1.3 module.
   
         Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com)          Copyright (c) 2001-2003 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)
   
         $Id$  
 */  */
   
 #include "pa_config_includes.h"  static const char* IDENT_MOD_PARSER3_C="$Date$";
   
 #if _MSC_VER  #include "pa_config_includes.h"
 #       include <new.h>  
 #endif  
   
 #include "pa_globals.h"  #include "pa_globals.h"
   
Line 30 Line 26
 #include "pa_version.h"  #include "pa_version.h"
 #include "pa_socks.h"  #include "pa_socks.h"
   
   
 // consts  
   
 extern const char *main_RCSIds[];  
 #ifdef USE_SMTP  
 extern const char *smtp_RCSIds[];  
 #endif  
 extern const char *gd_RCSIds[];  
 extern const char *classes_RCSIds[];  
 extern const char *types_RCSIds[];  
 extern const char *ApacheModuleParser3_RCSIds[];  
 const char **RCSIds[]={  
         main_RCSIds,  
 #ifdef USE_SMTP  
         smtp_RCSIds,  
 #endif  
         gd_RCSIds,  
         classes_RCSIds,  
         types_RCSIds,  
         ApacheModuleParser3_RCSIds,  
         0  
 };  
   
   
 /// apache parser module configuration [httpd.conf + .htaccess-es]  /// apache parser module configuration [httpd.conf + .htaccess-es]
 struct Parser_module_config {  struct Parser_module_config {
     const char* parser_root_config_filespec; ///< filespec of admin's config file      const char* parser_config_filespec; ///< filespec of site's config file
     const char* parser_site_config_filespec; ///< filespec of site's config file  
         bool parser_status_allowed;          bool parser_status_allowed;
 };  };
   
Line 75  static Parser_module_config *our_dconfig Line 46  static Parser_module_config *our_dconfig
                 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_config(cmd_parms *cmd, void *mconfig, char *file_spec) {  static const char* cmd_parser_config(cmd_parms *cmd, void *mconfig, char *file_spec) {
     Parser_module_config *cfg = (Parser_module_config *) mconfig;      Parser_module_config *cfg = (Parser_module_config *) mconfig;
   
         // remember assigned filespec into cfg          // remember assigned filespec into cfg
         (cmd->info?cfg->parser_root_config_filespec:cfg->parser_site_config_filespec)=file_spec;          cfg->parser_config_filespec=file_spec;
   
     return NULL;      return NULL;
 }  }
 static const char *cmd_parser_status_allowed(cmd_parms *cmd, void *mconfig, char *file_spec) {  static const char* cmd_parser_status_allowed(cmd_parms *cmd, void *mconfig, char *file_spec) {
         //_asm int 3;          //_asm int 3;
     Parser_module_config *cfg = (Parser_module_config *) mconfig;      Parser_module_config *cfg = (Parser_module_config *) mconfig;
   
Line 121  static const char *cmd_parser_status_all Line 92  static const char *cmd_parser_status_all
   
 //@{  //@{
 /// SAPI func decl  /// SAPI func decl
 void SAPI::log(Pool& pool, const char *fmt, ...) {  void SAPI::log(Pool& pool, const char* fmt, ...) {
         request_rec *r=static_cast<request_rec *>(pool.get_context());          request_rec *r=static_cast<request_rec *>(pool.get_context());
   
     va_list args;      va_list args;
Line 133  void SAPI::log(Pool& pool, const char *f Line 104  void SAPI::log(Pool& pool, const char *f
     va_end(args);      va_end(args);
 }  }
   
 void SAPI::die(const char *fmt, ...) {  static void die_or_abort(const char* fmt, va_list args, bool write_core) {
     va_list args;  
     va_start(args,fmt);  
         char buf[MAX_STRING];          char buf[MAX_STRING];
         size_t size=vsnprintf(buf, MAX_STRING, fmt, args);          size_t size=vsnprintf(buf, MAX_STRING, fmt, args);
         remove_crlf(buf, buf+size);          remove_crlf(buf, buf+size);
         ap_log_error(APLOG_MARK, APLOG_EMERG, 0, "%s", buf);          ap_log_error(APLOG_MARK, APLOG_EMERG, 0, "%s", buf);
     va_end(args);  
   
         exit(1);          // exit & try to produce core dump
           if(write_core)
                   abort();
           else
                   exit(1);
   }
   
   void SAPI::die(const char* fmt, ...) {
       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_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<request_rec *>(pool.get_context());
           return (const char* )ap_table_get(r->subprocess_env, name);
 }  }
   
 const char *SAPI::get_env(Pool& pool, const char *name) {  #ifndef DOXYGEN
   struct SAPI_environment_append_info {
           Pool *pool;
           const char* *cur;
   };
   #endif
   static const char* mk_env_pair(Pool& pool, const char* key, const char* value) {
           char *result=new(pool) char[strlen(key)+1/*=*/+strlen(value)+1/*0*/];
           strcpy(result, key); strcat(result, "="); strcat(result, value);
           return result;
   }
   static int SAPI_environment_append(void *d, const char* k, const char* val) {
           if( k && val ) {
                   SAPI_environment_append_info& info=
                           *static_cast<SAPI_environment_append_info *>(d);
                   *info.cur++=mk_env_pair(*info.pool, k, val);
           }
           return 1/*true*/;
   }
   const char* const *SAPI::environment(SAPI_Info& info, Pool& pool) {
         request_rec *r=static_cast<request_rec *>(pool.get_context());          request_rec *r=static_cast<request_rec *>(pool.get_context());
         return (const char *)ap_table_get(r->subprocess_env, name);          const table *t=r->subprocess_env;
           const char* *result=new(pool) const char*[ap_table_elts(t)->nelts+1/*0*/];
           SAPI_environment_append_info info={&pool, result};
           ap_table_do(SAPI_environment_append, &info, t, 0); *info.cur=0; // mark EOE
           return result;
 }  }
   
 size_t SAPI::read_post(Pool& pool, char *buf, size_t max_bytes) {  size_t SAPI::read_post(Pool& pool, char *buf, size_t max_bytes) {
Line 178  size_t SAPI::read_post(Pool& pool, char Line 192  size_t SAPI::read_post(Pool& pool, char
 }  }
   
 /// @test location provide with protocol. think about internal redirects  /// @test location provide with protocol. think about internal redirects
 void SAPI::add_header_attribute(Pool& pool, const char *key, const char *value) {  void SAPI::add_header_attribute(Pool& pool, 
                                                                   const char* dont_store_key, const char* dont_store_value) {
         request_rec *r=static_cast<request_rec *>(pool.get_context());          request_rec *r=static_cast<request_rec *>(pool.get_context());
   
         if(strcasecmp(key, "location")==0)           if(strcasecmp(key, "location")==0) 
Line 194  void SAPI::add_header_attribute(Pool& po Line 209  void SAPI::add_header_attribute(Pool& po
         } else if(strcasecmp(key, "status")==0)           } else if(strcasecmp(key, "status")==0) 
                 r->status=atoi(value);                  r->status=atoi(value);
         else          else
   todo: copy dont_store_ to nonvilotile
                 ap_table_addn(r->headers_out, key, value);                  ap_table_addn(r->headers_out, key, value);
 }  }
   
Line 232  static void real_parser_handler(Pool& po Line 248  static void real_parser_handler(Pool& po
         request_info.query_string=r->args;          request_info.query_string=r->args;
         request_info.uri=SAPI::get_env(pool, "REQUEST_URI");          request_info.uri=SAPI::get_env(pool, "REQUEST_URI");
         request_info.content_type=SAPI::get_env(pool, "CONTENT_TYPE");          request_info.content_type=SAPI::get_env(pool, "CONTENT_TYPE");
         const char *content_length=SAPI::get_env(pool, "CONTENT_LENGTH");          CharPtr content_length=SAPI::get_env(pool, "CONTENT_LENGTH");
         request_info.content_length=content_length?atoi(content_length):0;          request_info.content_length=content_length?atoi(content_length):0;
         request_info.cookie=SAPI::get_env(pool, "HTTP_COOKIE");          request_info.cookie=SAPI::get_env(pool, "HTTP_COOKIE");
         request_info.user_agent=SAPI::get_env(pool, "HTTP_USER_AGENT");          request_info.mail_received=false;
   
     // config      // config
         Parser_module_config *dcfg=our_dconfig(r);          Parser_module_config *dcfg=our_dconfig(r);
Line 250  static void real_parser_handler(Pool& po Line 266  static void real_parser_handler(Pool& po
                   
         // process the request          // process the request
         request.core(          request.core(
                 dcfg->parser_root_config_filespec, true, // /path/to/admin/config                  dcfg->parser_config_filespec, true, // /path/to/config
                 dcfg->parser_site_config_filespec, true, // /path/to/site/config  
                 r->header_only!=0);                  r->header_only!=0);
 }  }
   
Line 301  static int parser_handler(request_rec *r Line 316  static int parser_handler(request_rec *r
                 // don't allocate anything on pool here:                  // don't allocate anything on pool here:
                 //   possible pool' exception not catch-ed now                  //   possible pool' exception not catch-ed now
                 //   and there could be out-of-memory exception                  //   and there could be out-of-memory exception
                 const char *body=e.comment();                  const char* body=e.comment();
                 // log it                  // log it
                 SAPI::log(pool, "exception in request exception handler: %s", body);                  SAPI::log(pool, "exception in request exception handler: %s", body);
   
Line 331  static int parser_handler(request_rec *r Line 346  static int parser_handler(request_rec *r
     return OK;      return OK;
 }  }
   
 #if _MSC_VER  
 int failed_new(size_t size) {  
         SAPI::die("out of memory in 'new', failed to allocated %u bytes", size);  
         return 0; // not reached  
 }  
 #endif  
   
 #ifdef HAVE_SET_NEW_HANDLER  
 void failed_new() {  
     SAPI::die("out of memory in 'new'");  
 }  
 #endif  
   
 /*--------------------------------------------------------------------------*/  /*--------------------------------------------------------------------------*/
 /*                                                                          */  /*                                                                          */
 /* Now let's declare routines for each of the callback phase in order.      */  /* Now let's declare routines for each of the callback phase in order.      */
Line 387  static void setup_module_cells() { Line 389  static void setup_module_cells() {
                 return;                  return;
         globals_inited=true;          globals_inited=true;
   
 #ifdef WIN32  
         _set_new_handler(failed_new);  
 #endif  
   
 #ifdef HAVE_SET_NEW_HANDLER  
         std::set_new_handler(failed_new);  
 #endif  
   
         /*          /*
      * allocate our module-private pool.       * allocate our module-private pool.
      */       */
Line 402  static void setup_module_cells() { Line 396  static void setup_module_cells() {
         /// no trying to __try here [yet]          /// no trying to __try here [yet]
         try {          try {
                 // init socks                  // init socks
                 init_socks(pool);                  pa_init_socks(pool);
   
                 // init global classes                  // init global classes
                 init_methoded_array(pool);                  init_methoded_array(pool);
                 // init global variables                  // init global variables
                 pa_globals_init(pool);                  pa_globals_init(pool);
         } catch(const Exception& e) { // global problem           } catch(const Exception& e) { // global problem 
                 SAPI::die("setup_module_cells failed: %s", e.comment());                  SAPI::abort("setup_module_cells failed: %s", e.comment());
         }          }
 }  }
   
Line 478  static void *parser_merge_dir_config(poo Line 472  static void *parser_merge_dir_config(poo
     Parser_module_config *pconf = (Parser_module_config *) parent_conf;      Parser_module_config *pconf = (Parser_module_config *) parent_conf;
     Parser_module_config *nconf = (Parser_module_config *) newloc_conf;      Parser_module_config *nconf = (Parser_module_config *) newloc_conf;
   
     merged_config->parser_root_config_filespec = ap_pstrdup(p, nconf->parser_root_config_filespec?      merged_config->parser_config_filespec = ap_pstrdup(p, nconf->parser_config_filespec?
                 nconf->parser_root_config_filespec:pconf->parser_root_config_filespec);                  nconf->parser_config_filespec:pconf->parser_config_filespec);
     merged_config->parser_site_config_filespec = ap_pstrdup(p, nconf->parser_site_config_filespec?  
                 nconf->parser_site_config_filespec:pconf->parser_site_config_filespec);  
         merged_config->parser_status_allowed=          merged_config->parser_status_allowed=
                 pconf->parser_status_allowed ||                  pconf->parser_status_allowed ||
                 nconf->parser_status_allowed;                  nconf->parser_status_allowed;
Line 540  static void *parser_merge_server_config( Line 532  static void *parser_merge_server_config(
      * Our inheritance rules are our own, and part of our module's semantics.       * Our inheritance rules are our own, and part of our module's semantics.
      * Basically, just note whence we came.       * Basically, just note whence we came.
      */       */
     merged_config->parser_root_config_filespec = ap_pstrdup(p, s2conf->parser_root_config_filespec?      merged_config->parser_config_filespec = ap_pstrdup(p, s2conf->parser_config_filespec?
                 s2conf->parser_root_config_filespec:s1conf->parser_root_config_filespec);                  s2conf->parser_config_filespec:s1conf->parser_config_filespec);
     merged_config->parser_site_config_filespec = ap_pstrdup(p, s2conf->parser_site_config_filespec?  
                 s2conf->parser_site_config_filespec:s1conf->parser_site_config_filespec);  
         merged_config->parser_status_allowed=          merged_config->parser_status_allowed=
                 s1conf->parser_status_allowed ||                   s1conf->parser_status_allowed || 
                 s2conf->parser_status_allowed;                  s2conf->parser_status_allowed;
Line 623  static int parser_access_checker(request Line 613  static int parser_access_checker(request
 static const command_rec parser_cmds[] =  static const command_rec parser_cmds[] =
 {  {
     {      {
         "ParserRootConfig",              /* directive name */          "ParserConfig",              /* directive name */
         (const char *(*)(void))((void *)cmd_parser_config), // config action routine          (const char* (*)(void))((void *)cmd_parser_config), // config action routine
         (void*)true,                   /* argument to include in call */          (void*)0,                   /* argument to include in call */
         (int)(ACCESS_CONF|RSRC_CONF),             /* where available */  
         TAKE1,                /* arguments */  
         "Parser root config filespec (Admin)" // directive description  
     },  
     {  
         "ParserSiteConfig",              /* directive name */  
         (const char *(*)(void))((void *)cmd_parser_config), // config action routine  
         (void*)false,                   /* argument to include in call */  
         (int)(OR_OPTIONS),             /* where available */          (int)(OR_OPTIONS),             /* where available */
         TAKE1,                /* arguments */          TAKE1,                /* arguments */
         "Parser site config filespec" // directive description          "Parser config filespec" // directive description
     },      },
         {          {
                 "ParserStatusAllowed",              /* directive name */                  "ParserStatusAllowed",              /* directive name */
         (const char *(*)(void))((void *)cmd_parser_status_allowed), // config action routine          (const char* (*)(void))((void *)cmd_parser_status_allowed), // config action routine
         (void*)0,                   /* argument to include in call */          (void*)0,                   /* argument to include in call */
         (int)(ACCESS_CONF),             /* where available */          (int)(ACCESS_CONF),             /* where available */
         NO_ARGS,                /* arguments */          NO_ARGS,                /* arguments */
Line 706  module MODULE_VAR_EXPORT parser3_module Line 688  module MODULE_VAR_EXPORT parser3_module
 };  };
   
 #if defined(_MSC_VER)  #if defined(_MSC_VER)
 #       define APACHE_WIN32_SRC "/parser3project/win32apache13/src"  #       define APACHE_WIN32_SRC "/parser3project/win32/apache13/src"
 #       ifdef _DEBUG  #       ifdef _DEBUG
 #               pragma comment(lib, APACHE_WIN32_SRC "/CoreD/ApacheCore.lib")  #               pragma comment(lib, APACHE_WIN32_SRC "/CoreD/ApacheCore.lib")
 #       else  #       else

Removed from v.1.19  
changed lines
  Added in v.1.28.2.6


E-mail: