--- parser3/src/targets/isapi/parser3isapi.C 2002/06/11 12:20:42 1.72 +++ parser3/src/targets/isapi/parser3isapi.C 2002/08/01 11:41:21 1.78 @@ -3,10 +3,10 @@ Copyright (c) 2000,2001, 2002 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) - - $Id: parser3isapi.C,v 1.72 2002/06/11 12:20:42 paf Exp $ */ +static const char* IDENT_PARSER3ISAPI_C="$Date: 2002/08/01 11:41:21 $"; + #ifndef _MSC_VER # error compile ISAPI module with MSVC [no urge for now to make it autoconf-ed (PAF)] #endif @@ -30,25 +30,23 @@ // 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 *parser3isapi_RCSIds[]; -const char **RCSIds[]={ - main_RCSIds, -#ifdef USE_SMTP - smtp_RCSIds, -#endif - gd_RCSIds, - classes_RCSIds, - types_RCSIds, - parser3isapi_RCSIds, - 0 +const char *IIS51vars[]={ + "APPL_MD_PATH", "APPL_PHYSICAL_PATH", + "AUTH_PASSWORD", "AUTH_TYPE", "AUTH_USER", + "CERT_COOKIE", "CERT_FLAGS", "CERT_ISSUER", "CERT_KEYSIZE", "CERT_SECRETKEYSIZE", + "CERT_SERIALNUMBER", "CERT_SERVER_ISSUER", "CERT_SERVER_SUBJECT", "CERT_SUBJECT", + "CONTENT_LENGTH", "CONTENT_TYPE", + "LOGON_USER", + "HTTPS", "HTTPS_KEYSIZE", "HTTPS_SECRETKEYSIZE", "HTTPS_SERVER_ISSUER", "HTTPS_SERVER_SUBJECT", + "INSTANCE_ID", "INSTANCE_META_PATH", + "PATH_INFO", "PATH_TRANSLATED", + "QUERY_STRING", + "REMOTE_ADDR", "REMOTE_HOST", "REMOTE_USER", "REQUEST_METHOD", + "SCRIPT_NAME", + "SERVER_NAME", "SERVER_PORT", "SERVER_PORT_SECURE", "SERVER_PROTOCOL", "SERVER_SOFTWARE", + "URL", }; +const int IIS51var_count=sizeof(IIS51vars)/sizeof(*IIS51vars); // globals @@ -104,15 +102,19 @@ const char *SAPI::get_env(Pool& pool, co if(ctx.lpECB->GetServerVariable(ctx.lpECB->ConnID, const_cast(name), variable_buf, &variable_len)) { - variable_buf[variable_len]=0; - return variable_buf; + if(*variable_buf) { // saw returning len=1 && *buf=0 :( + variable_buf[variable_len]=0; + return variable_buf; + } } else if (GetLastError()==ERROR_INSUFFICIENT_BUFFER) { variable_buf=(char *)pool.malloc(variable_len+1); if(ctx.lpECB->GetServerVariable(ctx.lpECB->ConnID, const_cast(name), variable_buf, &variable_len)) { - variable_buf[variable_len]=0; - return variable_buf; + if(*variable_buf) { + variable_buf[variable_len]=0; + return variable_buf; + } } } @@ -135,24 +137,6 @@ static const char *mk_env_pair(Pool& poo return result; } const char *const *SAPI::environment(Pool& pool) { - const char *IIS51vars[]={ - "APPL_MD_PATH", "APPL_PHYSICAL_PATH", - "AUTH_PASSWORD", "AUTH_TYPE", "AUTH_USER", - "CERT_COOKIE", "CERT_FLAGS", "CERT_ISSUER", "CERT_KEYSIZE", "CERT_SECRETKEYSIZE", - "CERT_SERIALNUMBER", "CERT_SERVER_ISSUER", "CERT_SERVER_SUBJECT", "CERT_SUBJECT", - "CONTENT_LENGTH", "CONTENT_TYPE", - "LOGON_USER", - "HTTPS", "HTTPS_KEYSIZE", "HTTPS_SECRETKEYSIZE", "HTTPS_SERVER_ISSUER", "HTTPS_SERVER_SUBJECT", - "INSTANCE_ID", "INSTANCE_META_PATH", - "PATH_INFO", "PATH_TRANSLATED", - "QUERY_STRING", - "REMOTE_ADDR", "REMOTE_HOST", "REMOTE_USER", "REQUEST_METHOD", - "SCRIPT_NAME", - "SERVER_NAME", "SERVER_PORT", "SERVER_PORT_SECURE", "SERVER_PROTOCOL", "SERVER_SOFTWARE", - "URL", - }; - const int IIS51var_count=sizeof(IIS51vars)/sizeof(*IIS51vars); - // we know this buf is writable char *all_http_vars=const_cast(SAPI::get_env(pool, "ALL_HTTP")); const int http_var_count=grep_char(all_http_vars, '\n')+1/*\n for theoretical(never saw) this \0*/; @@ -372,7 +356,7 @@ void real_parser_handler(Pool& pool, LPE request_info.content_type=lpECB->lpszContentType; request_info.content_length=lpECB->cbTotalBytes; request_info.cookie=SAPI::get_env(pool, "HTTP_COOKIE"); - + request_info.mail_received=false; // prepare to process request Request request(pool, @@ -385,35 +369,23 @@ void real_parser_handler(Pool& pool, LPE #endif /* status_allowed */); - // some root-controlled location - // c:\windows - char root_config_path[MAX_STRING]; - GetWindowsDirectory(root_config_path, MAX_STRING); - // must be dynamic: rethrowing from request.core - // may return 'source' which can be inside of 'root auto.p@exeception' - char *root_config_filespec=(char *)pool.malloc(MAX_STRING); - snprintf(root_config_filespec, MAX_STRING, - "%s/%s", - root_config_path, CONFIG_FILE_NAME); - // beside by binary - static char site_config_path[MAX_STRING]; - strncpy(site_config_path, argv0, MAX_STRING-1); site_config_path[MAX_STRING-1]=0; // filespec of my binary + static char beside_binary_path[MAX_STRING]; + strncpy(beside_binary_path, argv0, MAX_STRING-1); beside_binary_path[MAX_STRING-1]=0; // filespec of my binary if(!( - rsplit(site_config_path, '/') || - rsplit(site_config_path, '\\'))) { // strip filename + rsplit(beside_binary_path, '/') || + rsplit(beside_binary_path, '\\'))) { // strip filename // no path, just filename - site_config_path[0]='.'; site_config_path[1]=0; + beside_binary_path[0]='.'; beside_binary_path[1]=0; } - char site_config_filespec[MAX_STRING]; - snprintf(site_config_filespec, MAX_STRING, + char config_filespec[MAX_STRING]; + snprintf(config_filespec, MAX_STRING, "%s/%s", - site_config_path, CONFIG_FILE_NAME); + beside_binary_path, AUTO_FILE_NAME); // process the request request.core( - 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 + config_filespec, false /*fail_on_read_problem*/, // /path/to/first/auto.p header_only); }