Diff for /parser3/src/targets/cgi/parser3.C between versions 1.52 and 1.86

version 1.52, 2001/04/03 05:23:43 version 1.86, 2001/05/21 07:58:41
Line 14 Line 14
 #       include <windows.h>  #       include <windows.h>
 #endif  #endif
   
 #include <io.h>  
 #include <stdlib.h>  
 #include <stdio.h>  
 #include <fcntl.h>  
 #include <time.h>  
   
 #include "pa_sapi.h"  #include "pa_sapi.h"
   #include "classes.h"
 #include "pa_common.h"  #include "pa_common.h"
 #include "pa_globals.h"  
 #include "pa_request.h"  #include "pa_request.h"
   #include "pa_socks.h"
   #include "pa_version.h"
   
   //#define DEBUG_POOL_MALLOC
   
   
 /// IIS refuses to read bigger chunks  /// IIS refuses to read bigger chunks
 const size_t READ_POST_CHUNK_SIZE=0x400*0x400; // 1M   const size_t READ_POST_CHUNK_SIZE=0x400*0x400; // 1M 
Line 53  static LONG WINAPI TopLevelExceptionFilt Line 52  static LONG WINAPI TopLevelExceptionFilt
 #endif  #endif
   
 // SAPI  // SAPI
 const char *SAPI::get_env(Pool& pool, const char *name) {  
         return getenv(name);  
 }  
   
 uint SAPI::read_post(Pool& pool, char *buf, uint max_bytes) {  
         uint read_size=0;  
         do {  
                 int chunk_size=read(fileno(stdin),   
                         buf+read_size, min(READ_POST_CHUNK_SIZE, max_bytes-read_size));  
                 if(chunk_size<0)  
                         break;  
                 read_size+=chunk_size;  
         } while(read_size<max_bytes);  
   
         return read_size;  
 }  
   
 void SAPI::add_header_attribute(Pool& pool, const char *key, const char *value) {  
         if(cgi)  
                 printf("%s: %s\n", key, value);  
 }  
   
 /// @todo parser4: intelligent cache-control  
 void SAPI::send_header(Pool& pool) {  
         if(cgi) {  
                 puts("expires: Fri, 23 Mar 2001 09:32:23 GMT");  
   
                 // header | body  delimiter  // appends to parser3.log located beside my binary if openable, to stderr otherwize
                 puts("");  
         }  
 }  
   
 void SAPI::send_body(Pool& pool, const char *buf, size_t size) {  
         stdout_write(buf, size);  
 }  
   
 // appends to parser3.log located beside my binary  
 void SAPI::log(Pool& pool, const char *fmt, ...) {  void SAPI::log(Pool& pool, const char *fmt, ...) {
         bool opened;          bool opened;
         FILE *f=0;          FILE *f=0;
Line 120  void SAPI::log(Pool& pool, const char *f Line 84  void SAPI::log(Pool& pool, const char *f
   
         if(opened)          if(opened)
                 fclose(f);                  fclose(f);
           else
                   fflush(f);
   }
   
   const char *SAPI::get_env(Pool& pool, const char *name) {
           return getenv(name);
   }
   
   size_t SAPI::read_post(Pool& pool, char *buf, size_t max_bytes) {
           size_t read_size=0;
           do {
                   int chunk_size=read(fileno(stdin), 
                           buf+read_size, min(READ_POST_CHUNK_SIZE, max_bytes-read_size));
                   if(chunk_size<0)
                           break;
                   read_size+=chunk_size;
           } while(read_size<max_bytes);
   
           return read_size;
   }
   
   void SAPI::add_header_attribute(Pool& pool, const char *key, const char *value) {
           if(cgi)
                   printf("%s: %s\n", key, value);
   }
   
   /// @todo intelligent cache-control
   void SAPI::send_header(Pool& pool) {
           if(cgi) {
                   puts("expires: Fri, 23 Mar 2001 09:32:23 GMT");
   
                   // header | body  delimiter
                   puts("");
           }
   }
   
   void SAPI::send_body(Pool& pool, const void *buf, size_t size) {
           stdout_write(buf, size);
 }  }
   
 /**  /**
         main workhorse          main workhorse
   
         @todo parser4:          @todo 
                 IIS: remove trailing default-document[index.html] from $request.uri.                  IIS: remove trailing default-document[index.html] from $request.uri.
                 to do that we need to consult metabase,                  to do that we need to consult metabase,
                 wich is tested but seems slow.                  wich is tested but seems slow.
Line 150  int main(int argc, char *argv[]) { Line 152  int main(int argc, char *argv[]) {
                   
         if(!cgi) {          if(!cgi) {
                 if(argc<2) {                  if(argc<2) {
                         printf("Usage: %s <file>\n", argv0?argv0:"parser3");                          printf(
                         exit(1);                                  "Parser/%s Copyright(c) 2001 ArtLebedev Group(http://www.artlebedev.com)\n"
                                   "Author: Alexander Petrosyan <paf@design.ru>(http://design.ru/paf)\n"
                                   "\n"
                                   "Usage: %s <file>\n",
                                   PARSER_VERSION, 
                                   argv0?argv0:"parser3");
                           return 1;
                 }                  }
         }          }
   
Line 166  int main(int argc, char *argv[]) { Line 174  int main(int argc, char *argv[]) {
                 // must be first in PTRY{}PCATCH                  // must be first in PTRY{}PCATCH
 #ifdef WIN32  #ifdef WIN32
                 SetUnhandledExceptionFilter(&TopLevelExceptionFilter);                  SetUnhandledExceptionFilter(&TopLevelExceptionFilter);
                 //TODO: initSocks();  
 #endif  #endif
   
                   // init socks
                   init_socks(pool);
   
                   // init global classes
                   init_methoded_array(pool);
                 // init global variables                  // init global variables
                 pa_globals_init(pool);                  pa_globals_init(pool);
   
                 if(!filespec_to_process)                  if(!filespec_to_process)
                         PTHROW(0, 0,                          PTHROW(0, 0,
                                 0,                                  0,
                                 "no file to process");                                  "Parser/%s", PARSER_VERSION);
   
                 // Request info                  // Request info
                 Request::Info request_info;                  Request::Info request_info;
Line 196  int main(int argc, char *argv[]) { Line 208  int main(int argc, char *argv[]) {
                 } else {                  } else {
                         static char buf[MAX_STRING];                          static char buf[MAX_STRING];
                         strncpy(buf, filespec_to_process, MAX_STRING);                          strncpy(buf, filespec_to_process, MAX_STRING);
                         rsplit(buf, '/');  rsplit(buf, '\\');// strip filename                          if(rsplit(buf, '/') || rsplit(buf, '\\')) // strip filename
                         request_info.document_root=buf;                                  request_info.document_root=buf;
                           else
                                   request_info.document_root="";
                 }                  }
                 request_info.path_translated=filespec_to_process;                  request_info.path_translated=filespec_to_process;
                 request_info.method=request_method;                  request_info.method=request_method;
                 const char *query_string=SAPI::get_env(pool, "QUERY_STRING");                  const char *query_string=SAPI::get_env(pool, "QUERY_STRING");
                 request_info.query_string=query_string;                  request_info.query_string=query_string;
                 if(cgi)                   if(cgi) {
                         if(const char *env_request_uri=SAPI::get_env(pool, "REQUEST_URI"))                          if(const char *env_request_uri=SAPI::get_env(pool, "REQUEST_URI"))
                                 request_info.uri=env_request_uri;                                  request_info.uri=env_request_uri;
                         else if(const char *path_info=SAPI::get_env(pool, "PATH_INFO"))                          else if(const char *path_info=SAPI::get_env(pool, "PATH_INFO"))
Line 221  int main(int argc, char *argv[]) { Line 235  int main(int argc, char *argv[]) {
                                 PTHROW(0, 0,                                  PTHROW(0, 0,
                                         0,                                          0,
                                         "CGI: no PATH_INFO defined(in reinventing REQUEST_URI)");                                          "CGI: no PATH_INFO defined(in reinventing REQUEST_URI)");
                 else  
                           if(const char *script_name=SAPI::get_env(pool, "SCRIPT_NAME")) {
                                   size_t script_name_len=strlen(script_name);
                                   size_t uri_len=strlen(request_info.uri);
                                   if(strncmp(request_info.uri,script_name, script_name_len)==0 &&
                                           script_name_len != uri_len) // under IIS they are the same
                                           PTHROW(0, 0,
                                                   0,
                                                   "CGI: illegal call");
                           }
                   } else
                         request_info.uri=0;                          request_info.uri=0;
   
                 request_info.content_type=SAPI::get_env(pool, "CONTENT_TYPE");                  request_info.content_type=SAPI::get_env(pool, "CONTENT_TYPE");
Line 233  int main(int argc, char *argv[]) { Line 257  int main(int argc, char *argv[]) {
                 // prepare to process request                  // prepare to process request
                 Request request(pool,                  Request request(pool,
                         request_info,                          request_info,
                         cgi ? String::UL_HTML_TYPO : String::UL_CLEAN                          cgi ? String::UL_USER_HTML : String::UL_AS_IS
                         );                          );
                                   
                 // some root-controlled location                  // some root-controlled location
Line 243  int main(int argc, char *argv[]) { Line 267  int main(int argc, char *argv[]) {
                 GetWindowsDirectory(root_auto_path, MAX_STRING);                  GetWindowsDirectory(root_auto_path, MAX_STRING);
 #else  #else
                 // ~nobody  todo: figure out a better place                  // ~nobody  todo: figure out a better place
                 char *root_auto_path=SAPI::get_env(pool, "HOME");                  const char *root_auto_path=SAPI::get_env(pool, "HOME");
 #endif  #endif
                                   
                 // beside by binary                  // beside by binary
                 static char site_auto_path[MAX_STRING];                  static char site_auto_path[MAX_STRING];
                 strncpy(site_auto_path, argv[0], MAX_STRING);  // filespec of my binary                  strncpy(site_auto_path, argv[0], MAX_STRING);  // filespec of my binary
                 rsplit(site_auto_path, '/');  rsplit(site_auto_path, '\\');// strip filename                  rsplit(site_auto_path, '/');  rsplit(site_auto_path, '\\');// strip filename
                   SAPI::log(pool, "r=%s, s=%s", 
                           root_auto_path, 
                           site_auto_path);
                                   
                 // process the request                  // process the request
                 request.core(                  request.core(
Line 257  int main(int argc, char *argv[]) { Line 284  int main(int argc, char *argv[]) {
                         site_auto_path, false,                          site_auto_path, false,
                         header_only);                          header_only);
   
                   //
                   done_socks();
   
   #ifdef DEBUG_POOL_MALLOC
                   extern void log_pool_stats(Pool& pool);
                   log_pool_stats(pool);
   #endif
   
                 // must be last in PTRY{}PCATCH                  // must be last in PTRY{}PCATCH
 #ifdef WIN32  #ifdef WIN32
                 SetUnhandledExceptionFilter(0);                  SetUnhandledExceptionFilter(0);
Line 282  int main(int argc, char *argv[]) { Line 317  int main(int argc, char *argv[]) {
                 // prepare header                  // prepare header
                 SAPI::add_header_attribute(pool, "content-type", "text/plain");                  SAPI::add_header_attribute(pool, "content-type", "text/plain");
                 char content_length_cstr[MAX_NUMBER];                  char content_length_cstr[MAX_NUMBER];
                 snprintf(content_length_cstr, MAX_NUMBER, "%lu", content_length);                  snprintf(content_length_cstr, MAX_NUMBER, "%u", content_length);
                 SAPI::add_header_attribute(pool, "content-length", content_length_cstr);                  SAPI::add_header_attribute(pool, "content-length", content_length_cstr);
   
                 // send header                  // send header

Removed from v.1.52  
changed lines
  Added in v.1.86


E-mail: