--- parser3/src/main/pa_request.C 2002/11/26 14:36:49 1.241 +++ parser3/src/main/pa_request.C 2003/01/29 15:39:28 1.245.2.2 @@ -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/11/26 14:36:49 $"; +static const char* IDENT_REQUEST_C="$Date: 2003/01/29 15:39:28 $"; #include "pa_sapi.h" #include "pa_common.h" @@ -56,8 +56,8 @@ Request::Request(Pool& apool, fclasses(apool), fdefault_lang(adefault_lang), flang(adefault_lang), info(ainfo), + charsets(UTF8_charset, UTF8_charset, UTF8_charset), post_data(0), post_size(0), - used_files(apool), configure_admin_done(false), default_content_type(0), mime_types(0), @@ -72,8 +72,8 @@ Request::Request(Pool& apool, finterrupted(false) { // default charsets - pool().set_source_charset(*utf8_charset); - pool().set_client_charset(*utf8_charset); + pool().set_source_charset(UTF8_charset); + pool().set_client_charset(UTF8_charset); // maybe expire old caches cache_managers->maybe_expire(); @@ -286,7 +286,12 @@ 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) @@ -299,7 +304,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 @@ -437,7 +442,7 @@ 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; } @@ -450,7 +455,7 @@ VStateless_class *Request::use_file(VSta // 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? @@ -548,6 +553,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; @@ -556,9 +562,10 @@ static void add_header_attribute(const H SAPI::add_header_attribute(pool, aattribute.cstr(), - attributed_meaning_to_string(lmeaning, String::UL_HTTP_HEADER).cstr(String::UL_UNSPECIFIED)); + 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(); @@ -579,7 +586,10 @@ void Request::output_result(const VFile& if(VString *vfile_name=static_cast(body_file.fields().get(*name_name))) if(vfile_name->string()!=NONAME_DAT) { VHash& vhash=*NEW VHash(pool()); - vhash.hash(0).put(*content_disposition_filename_name, vfile_name); + Hash& hash=vhash.hash(0); + 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); }