--- parser3/src/main/pa_request.C 2002/12/02 10:07:39 1.243 +++ parser3/src/main/pa_request.C 2003/01/31 12:10:47 1.245.2.4 @@ -1,11 +1,11 @@ /** @file Parser: request class main part. @see compile.C and execute.C. - Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_REQUEST_C="$Date: 2002/12/02 10:07:39 $"; +static const char* IDENT_REQUEST_C="$Date: 2003/01/31 12:10:47 $"; #include "pa_sapi.h" #include "pa_common.h" @@ -21,6 +21,13 @@ static const char* IDENT_REQUEST_C="$Dat #include "pa_dictionary.h" #include "pa_charset.h" #include "pa_charsets.h" +#include "pa_cache_managers.h" + +// defines + +#define MAIN_METHOD_NAME "main" + +// consts const char *POST_PROCESS_METHOD_NAME="postprocess"; const char *UNHANDLED_EXCEPTION_METHOD_NAME="unhandled_exception"; @@ -32,81 +39,73 @@ const char *UNHANDLED_EXCEPTION_CONTENT_ const char *DEFAULT_CONTENT_TYPE="text/html"; const char *ORIGINS_CONTENT_TYPE="text/plain"; +// globals + +StringPtr main_method_name(new String(MAIN_METHOD_NAME)); + // op.C -VClass& VClassMAIN_create(Pool& pool); +VStateless_classPtr VClassMAIN_create(); // op.C VHash& exception2vhash(Pool& pool, const Exception& e); // -Request::Request(Pool& apool, - Info& ainfo, - uchar adefault_lang, - bool status_allowed) : Pooled(apool), - main_method_name(apool, MAIN_METHOD_NAME), - stack(apool), - main_class(VClassMAIN_create(apool)), - env(apool), - status(apool), - form(apool), - mail(apool), - math(apool), - request(apool, *this), - response(apool), - cookie(apool), - fclasses(apool), +Request::Request(SAPI_Info& asapi_info, Request_info& arequest_info, + uchar adefault_lang, bool status_allowed): + sapi_info(asapi_info), + request_info(arequest_info), fdefault_lang(adefault_lang), flang(adefault_lang), - info(ainfo), - post_data(0), post_size(0), - used_files(apool), - configure_admin_done(false), - default_content_type(0), - mime_types(0), - fconnection(0), - classes_conf(apool), - anti_endless_execute_recoursion(0), - exception_trace(apool) -#ifdef RESOURCES_DEBUG - , sql_connect_time(0),sql_request_time(0) -#endif - , method_frame(0), rcontext(0), wcontext(0), - finterrupted(false) -{ - // default charsets - pool().set_source_charset(*utf8_charset); - pool().set_client_charset(*utf8_charset); + main_class(VClassMAIN_create()), + charsets(pool(), *UTF8_charset, *UTF8_charset, *UTF8_charset) // default charsets +{ // maybe expire old caches - cache_managers->maybe_expire(); + cache_managers.maybe_expire(); /// directly used // MAIN class, operators - classes().put(main_class.name(), &main_class); + classes().put(main_class->name(), main_class); // classes: // table, file, random, mail, image, ... - methoded_array->register_directly_used(*this); + methoded_array.register_directly_used(*this); /// methodless // env class - classes().put(*NEW String(pool(), ENV_CLASS_NAME), &env); + classes().put(StringPtr(new String(ENV_CLASS_NAME)), + ValuePtr(new VEnv(asapi_info))); // status class if(status_allowed) - classes().put(*NEW String(pool(), STATUS_CLASS_NAME), &status); + classes().put(StringPtr(new String(STATUS_CLASS_NAME)), + ValuePtr(new VStatus)); // request class - classes().put(*NEW String(pool(), REQUEST_CLASS_NAME), &request); + classes().put(StringPtr(new String(REQUEST_CLASS_NAME)), + ValuePtr(new VRequest(arequest_info, charsets))); // cookie class - classes().put(*NEW String(pool(), COOKIE_CLASS_NAME), &cookie); + classes().put(StringPtr(new String(COOKIE_CLASS_NAME)), + ValuePtr(new VCookie)); /// methoded // response class - classes().put(response.get_class()->name(), &response); + { + ValuePtr response(new VResponse(arequest_info, charsets)); + classes().put(response->get_class()->name(), response); + } /// bases used // form class - classes().put(form.get_class()->base_class()->name(), &form); + { + ValuePtr form(new VForm); + classes().put(form->get_class()->base_class()->name(), form); + } // mail class - classes().put(mail.get_class()->base_class()->name(), &mail); + { + ValuePtr mail(new VMail); + classes().put(mail->get_class()->base_class()->name(), mail); + } // math class - classes().put(math.get_class()->base_class()->name(), &math); + { + ValuePtr math(new VMail); + classes().put(math->get_class()->base_class()->name(), math); + } } Request::~Request() { @@ -264,7 +263,7 @@ gettimeofday(&mt[2],NULL); VString *body_vstring_after_post_process=&body_vstring_before_post_process; // @postprocess if(Value *value=main_class.get_element( - *NEW String(pool(), POST_PROCESS_METHOD_NAME), + StringPtr(new String(POST_PROCESS_METHOD_NAME), main_class, false)) if(Junction *junction=value->get_junction()) @@ -286,12 +285,17 @@ gettimeofday(&mt[2],NULL); // extract response body Value *body_value=static_cast( - response.fields().get(*body_name)); + response.fields().get(*download_name)); + bool as_attachment=body_value!=0; + if(!body_value) + body_value=static_cast( + response.fields().get(*body_name)); + if(body_value) // there is some $response:body body_file=body_value->as_vfile(); else if(lorigins_mode) response.fields().put(*content_type_name, - NEW VString(*NEW String(pool(), ORIGINS_CONTENT_TYPE))); + NEW VString(StringPtr(new String(ORIGINS_CONTENT_TYPE))); #ifdef RESOURCES_DEBUG //measure:after postprocess @@ -299,7 +303,7 @@ gettimeofday(&mt[3],NULL); #endif // OK. write out the result - output_result(*body_file, header_only); + output_result(*body_file, header_only, as_attachment); #ifdef RESOURCES_DEBUG //measure:after output_result @@ -359,7 +363,7 @@ t[9]-t[3] // maybe we'd be lucky enough as to report an error // in a gracefull way... if(Value *value=main_class.get_element( - *NEW String(pool(), UNHANDLED_EXCEPTION_METHOD_NAME), + StringPtr(new String(UNHANDLED_EXCEPTION_METHOD_NAME), main_class, false)) { if(Junction *junction=value->get_junction()) { @@ -428,7 +432,7 @@ t[9]-t[3] // future $response:content-type response.fields().put(*content_type_name, - NEW VString(*NEW String(pool(), UNHANDLED_EXCEPTION_CONTENT_TYPE))); + NEW VString(StringPtr(new String(UNHANDLED_EXCEPTION_CONTENT_TYPE))); // future $response:body body_string=NEW String(pool(), buf); } @@ -437,20 +441,20 @@ t[9]-t[3] const VFile *body_file=body_vstring.as_vfile(); // ERROR. write it out - output_result(*body_file, header_only); + output_result(*body_file, header_only, false); } catch(const Exception& ) { /*re*/throw; } } } -VStateless_class *Request::use_file(VStateless_class& aclass, - const String& file_name, bool ignore_class_path, +VStateless_classPtr Request::use_file(VStateless_class& aclass, + StringPtr file_name, bool ignore_class_path, bool fail_on_read_problem, bool fail_on_file_absence) { // cyclic dependence check if(used_files.get(file_name)) return 0; - used_files.put(file_name, (Hash::Val *)true); + used_files.put(file_name, true); const String *file_spec; if(ignore_class_path) // ignore_class_path? @@ -496,7 +500,7 @@ VStateless_class *Request::use_file(VSta } -VStateless_class *Request::use_buf(VStateless_class& aclass, +VStateless_classPtr Request::use_buf(VStateless_class& aclass, const char *source, const String& filespec, const char *filespec_cstr) { // temporary zero @conf so to maybe-replace it in compiled code @@ -536,7 +540,7 @@ const String& Request::relative(const ch const String& Request::absolute(const String& relative_name) { if(relative_name.first_char()=='/') { - String& result=*NEW String(pool(), info.document_root); + String& result=StringPtr(new String(info.document_root); result << relative_name; return result; } else @@ -548,6 +552,7 @@ static void add_header_attribute(const H void *info) { Request& r=*static_cast(info); if(aattribute==BODY_NAME + || aattribute==DOWNLOAD_NAME || aattribute==CHARSET_NAME) return; @@ -559,7 +564,7 @@ static void add_header_attribute(const H attributed_meaning_to_string(lmeaning, String::UL_HTTP_HEADER, false) .cstr(String::UL_UNSPECIFIED)); } -void Request::output_result(const VFile& body_file, bool header_only) { +void Request::output_result(const VFile& body_file, bool header_only, bool as_attachment) { // header: cookies cookie.output_result(); @@ -573,7 +578,7 @@ void Request::output_result(const VFile& // default content type response.fields().put_dont_replace(*content_type_name, default_content_type?default_content_type - :NEW VString(*NEW String(pool(), DEFAULT_CONTENT_TYPE))); + :NEW VString(StringPtr(new String(DEFAULT_CONTENT_TYPE))); } // content-disposition @@ -581,7 +586,8 @@ void Request::output_result(const VFile& if(vfile_name->string()!=NONAME_DAT) { VHash& vhash=*NEW VHash(pool()); Hash& hash=vhash.hash(0); - hash.put(*value_name, NEW VString(*content_disposition_value)); + if(as_attachment) + hash.put(*value_name, NEW VString(*content_disposition_value)); hash.put(*content_disposition_filename_name, vfile_name); response.fields().put(*content_disposition_name, &vhash); } @@ -630,7 +636,7 @@ const String& Request::mime_type_of(cons mime_types->origin_string(), MIME_TYPES_NAME " table column elements must not be empty"); } - return *NEW String(pool(), "application/octet-stream"); + return StringPtr(new String("application/octet-stream"); } bool Request::origins_mode() {