--- parser3/src/main/pa_request.C 2001/12/14 12:53:48 1.184 +++ parser3/src/main/pa_request.C 2002/02/08 08:30:16 1.194 @@ -1,16 +1,12 @@ /** @file Parser: request class main part. @see compile.C and execute.C. - Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexander Petrosyan (http://paf.design.ru) + Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) + Author: Alexandr Petrosian (http://paf.design.ru) - $Id: pa_request.C,v 1.184 2001/12/14 12:53:48 paf Exp $ + $Id: pa_request.C,v 1.194 2002/02/08 08:30:16 paf Exp $ */ -#include "pa_config_includes.h" - -extern "C" unsigned char pcre_default_tables[]; // pcre/chartables.c - #include "pa_sapi.h" #include "pa_common.h" #include "pa_request.h" @@ -23,8 +19,8 @@ extern "C" unsigned char pcre_default_ta #include "pa_vtable.h" #include "pa_vfile.h" #include "pa_dictionary.h" -#include "pa_charset_manager.h" -#include "pa_charset_connection.h" +#include "pa_charsets.h" +#include "pa_charset.h" /// content type of exception response, when no @MAIN:exception handler defined const char *UNHANDLED_EXCEPTION_CONTENT_TYPE="text/plain"; @@ -36,15 +32,8 @@ const char *ORIGINS_CONTENT_TYPE="text/p Methoded *MOP_create(Pool&); static void load_charset(const Hash::Key& akey, Hash::Val *avalue, - void *info) { - Value& value=*static_cast(avalue); - Hash& CTYPE=*static_cast(info); - - Charset_connection& connection= - charset_manager->get_connection(akey, value.as_string()); - - // charset->transcoder - CTYPE.put(akey, &connection.transcoder()); + void *) { + charsets->load_charset(akey, static_cast(avalue)->as_string()); } // @@ -62,7 +51,6 @@ Request::Request(Pool& apool, response(apool), cookie(apool), fclasses(apool), - CTYPE(apool), fdefault_lang(adefault_lang), flang(adefault_lang), info(ainfo), post_data(0), post_size(0), @@ -70,7 +58,7 @@ Request::Request(Pool& apool, default_content_type(0), mime_types(0), main_class(0), - connection(0), + fconnection(0), classes_conf(apool), anti_endless_execute_recoursion(0), trace(apool) @@ -78,6 +66,10 @@ Request::Request(Pool& apool, ,sql_connect_time(0),sql_request_time(0) #endif { + // default charsets + pool().set_source_charset(*utf8_charset); + pool().set_client_charset(*utf8_charset); + // maybe expire old caches cache_managers->maybe_expire(); @@ -110,6 +102,17 @@ Request::Request(Pool& apool, classes().put(math.get_class()->base()->name(), &math); } +Request::~Request() { +#ifdef XML + // if for some strange reason xml generic errors failed to be reported, free them up + if(const char *xml_generic_errors=xmlGenericErrors()) { + SAPI::log(pool(), "warning: unreported xmlGenericErrors: %s", xml_generic_errors); + free((void *)xml_generic_errors); + } +#endif +} + + /** load MAIN class, execute @main. MAIN class consists of all the auto.p files we'd manage to find @@ -144,7 +147,8 @@ gettimeofday(&mt[0],NULL); true/*ignore class_path*/, root_config_fail_on_read_problem, main_class_name, main_class); } - + // charsets must only be specified in root config + // so that users would not interfere if(main_class) { /* $MAIN:CHARSETS[ $.charsetname1[/full/path/to/charset/file.cfg] @@ -153,14 +157,13 @@ gettimeofday(&mt[0],NULL); */ if(Value *vcharsets=main_class->get_element(*charsets_name)) { if(Hash *charsets=vcharsets->get_hash(0)) - charsets->for_each(load_charset, &CTYPE); + charsets->for_each(load_charset); else throw Exception(0, 0, &vcharsets->name(), "must be hash"); } } - // configure root options // until someone with less privileges have overriden them OP.configure_admin(*this); @@ -232,8 +235,7 @@ gettimeofday(&mt[0],NULL); gettimeofday(&mt[1],NULL); #endif // execute @main[] - const String *body_string=execute_virtual_method( - *main_class, *main_method_name); + const String *body_string=execute_virtual_method(*main_class, *main_method_name); if(!body_string) throw Exception(0,0, 0, @@ -258,7 +260,7 @@ gettimeofday(&mt[2],NULL); frame.store_param(method->name, &body_vstring_before_post_process); body_vstring_after_post_process= - NEW VString(*execute_method(frame, *method)); + NEW VString(execute_method(frame, *method)); } bool origins_mode=main_class->get_element(*origins_mode_name)!=0; @@ -431,7 +433,7 @@ t[9]-t[3] // future $response:body= // execute ^exception[origin;source;comment;type;code;stack] - body_string=execute_method(frame, *method); + body_string=&execute_method(frame, *method); } } @@ -503,12 +505,12 @@ VStateless_class *Request::use_file(cons if(main_class) if(Value *element=main_class->get_element(*class_path_name)) { if(element->is_string()) { - file_spec=file_readable(element->as_string(), file_name); // found at class_path? + file_spec=file_readable(absolute(element->as_string()), file_name); // found at class_path? } else if(Table *table=element->get_table()) { int size=table->size(); for(int i=size; i--; ) { const String& path=*static_cast(table->get(i))->get_string(0); - if(file_spec=file_readable(path, file_name)) + if(file_spec=file_readable(absolute(path), file_name)) break; // found along class_path } } else @@ -606,22 +608,12 @@ void Request::output_result(const VFile& // prepare header: $response:fields without :body response.fields().for_each(add_header_attribute, this); - // source bytes+transcoder - const Transcoder *source_transcoder=transcoder(); - const void *source_body=body_file.value_ptr(); - size_t source_content_length=body_file.value_size(); - - // client bytes+transcoder - Transcoder *client_transcoder; - Value *vclient_charset=static_cast(response.fields().get(*charset_name)); - client_transcoder=vclient_charset?(Transcoder *)CTYPE.get(vclient_charset->as_string()):0; + // transcode const void *client_body; size_t client_content_length; - - // transcode - transcoder_transcode(pool(), - source_transcoder, source_body, source_content_length, - client_transcoder, client_body, client_content_length + Charset::transcode(pool(), + pool().get_source_charset(), body_file.value_ptr(), body_file.value_size(), + pool().get_client_charset(), client_body, client_content_length ); // prepare header: content-length @@ -653,16 +645,3 @@ const String& Request::mime_type_of(cons } return *NEW String(pool(), "application/octet-stream"); } - -const Transcoder* Request::transcoder() { - return (Transcoder *)CTYPE.get(pool().get_charset()); -} - -const unsigned char *Request::pcre_tables() { - if(const Transcoder *ltranscoder=transcoder()) - return ltranscoder->pcre_tables; - - // this is not for pcre itself, - // it can do default, it's for string.lower&co - return pcre_default_tables; -}