--- parser3/src/targets/cgi/parser3.C 2002/04/04 07:57:50 1.166 +++ parser3/src/targets/cgi/parser3.C 2002/04/29 05:59:34 1.176 @@ -4,7 +4,7 @@ Copyright(c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) - $Id: parser3.C,v 1.166 2002/04/04 07:57:50 paf Exp $ + $Id: parser3.C,v 1.176 2002/04/29 05:59:34 paf Exp $ */ #include "pa_config_includes.h" @@ -41,6 +41,7 @@ extern ulong // consts +#ifndef _PROFILE extern const char *main_RCSIds[]; #ifdef USE_SMTP extern const char *smtp_RCSIds[]; @@ -60,9 +61,11 @@ const char **RCSIds[]={ parser3_RCSIds, 0 }; +#endif -const char *PARSER_ROOT_CONFIG_ENV_NAME="HTTP_PARSER_ROOT_CONFIG"; -const char *PARSER_SITE_CONFIG_ENV_NAME="HTTP_PARSER_SITE_CONFIG"; +#define REDIRECT_PREFIX "REDIRECT_" +#define PARSER_ROOT_CONFIG_ENV_NAME "HTTP_PARSER_ROOT_CONFIG" +#define PARSER_SITE_CONFIG_ENV_NAME "HTTP_PARSER_SITE_CONFIG" /// IIS refuses to read bigger chunks const size_t READ_POST_CHUNK_SIZE=0x400*0x400; // 1M @@ -92,8 +95,10 @@ static void log(const char *fmt, va_list // prefix time_t t=time(0); - const char *stamp=ctime(&t); - fprintf(f, "[%.*s] ", strlen(stamp)-1, stamp); + if(const char *stamp=ctime(&t)) { // never saw that + if(size_t len=strlen(stamp)) // saw once stamp being ="" + fprintf(f, "[%.*s] ", len-1, stamp); + } // message char buf[MAX_STRING]; @@ -145,7 +150,7 @@ void SAPI::die(const char *fmt, ...) { SAPI::add_header_attribute(pool, "status", "500"); SAPI::add_header_attribute(pool, "content-type", "text/plain"); char content_length_cstr[MAX_NUMBER]; - snprintf(content_length_cstr, MAX_NUMBER, "%u", content_length); + snprintf(content_length_cstr, sizeof(content_length_cstr), "%u", content_length); SAPI::add_header_attribute(pool, "content-length", content_length_cstr); // send header @@ -196,12 +201,19 @@ void SAPI::send_body(Pool& , const void // void full_file_spec(const char *file_name, char *buf, size_t buf_size) { - if(file_name && !strchr(file_name, '/')) { - char cwd[MAX_STRING]; getcwd(cwd, MAX_STRING); - snprintf(buf, buf_size, "%s/%s", cwd, file_name); - } else { - strncpy(buf, file_name, buf_size); - } + if(file_name) + if(file_name[0]=='/' +#ifdef WIN32 + || (file_name[0] && file_name[1]==':') +#endif + ) + strncpy(buf, file_name, buf_size); + else { + char cwd[MAX_STRING]; getcwd(cwd, MAX_STRING); + snprintf(buf, buf_size, "%s/%s", cwd, file_name); + } + else + buf[0]=0; #ifdef WIN32 back_slashes_to_slashes(buf); #endif @@ -303,33 +315,41 @@ void real_parser_handler( true /* status_allowed */); // some root-controlled location - const char *root_config_filespec; - if(const char *root_config_by_env=getenv(PARSER_ROOT_CONFIG_ENV_NAME)) - root_config_filespec=root_config_by_env; + const char *root_config_filespec_cstr; + char root_config_filespec_buf[MAX_STRING]; + const char *root_config_by_env=getenv(PARSER_ROOT_CONFIG_ENV_NAME); + if(!root_config_by_env) + root_config_by_env=getenv(REDIRECT_PREFIX PARSER_ROOT_CONFIG_ENV_NAME); + if(root_config_by_env) + root_config_filespec_cstr=root_config_by_env; else { #ifdef ROOT_CONFIG_DIR - root_config_filespec=ROOT_CONFIG_DIR "/" CONFIG_FILE_NAME; + root_config_filespec_cstr=ROOT_CONFIG_DIR "/" CONFIG_FILE_NAME; #else # ifdef WIN32 // c:\windows char windows_dir[MAX_STRING]; GetWindowsDirectory(windows_dir, MAX_STRING); - char buf[MAX_STRING]; - snprintf(buf, MAX_STRING, + + snprintf(root_config_filespec_buf, MAX_STRING, "%s/%s", windows_dir, CONFIG_FILE_NAME); - root_config_filespec=buf; + root_config_filespec_cstr=root_config_filespec_buf; # else #error must be compiled either configure/make or MSVC++ # endif #endif } - const char *site_config_filespec; - if(const char *site_config_by_env=getenv(PARSER_SITE_CONFIG_ENV_NAME)) - site_config_filespec=site_config_by_env; + const char *site_config_filespec_cstr; + char site_config_filespec_buf[MAX_STRING]; + const char *site_config_by_env=getenv(PARSER_SITE_CONFIG_ENV_NAME); + if(!site_config_by_env) + site_config_by_env=getenv(REDIRECT_PREFIX PARSER_SITE_CONFIG_ENV_NAME); + if(site_config_by_env) + site_config_filespec_cstr=site_config_by_env; else { // beside by binary // @todo full path, not ./! @@ -341,17 +361,16 @@ void real_parser_handler( // no path, just filename beside_binary_path[0]='.'; beside_binary_path[1]=0; } - char buf[MAX_STRING]; - snprintf(buf, MAX_STRING, + snprintf(site_config_filespec_buf, MAX_STRING, "%s/%s", beside_binary_path, CONFIG_FILE_NAME); - site_config_filespec=buf; + site_config_filespec_cstr=site_config_filespec_buf; } // process the request request.core( - root_config_filespec, false /*don't fail_on_read_problem*/, - site_config_filespec, false /*don't fail_on_read_problem*/, + root_config_filespec_cstr, false /*fail_on_read_problem*/, + site_config_filespec_cstr, false /*fail_on_read_problem*/, header_only); //