--- parser3/src/include/pa_request.h 2010/09/24 08:18:57 1.207 +++ parser3/src/include/pa_request.h 2015/04/08 18:08:52 1.217 @@ -1,14 +1,14 @@ /** @file Parser: request class decl. - Copyright (c) 2001-2009 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ #ifndef PA_REQUEST_H #define PA_REQUEST_H -static const char * const IDENT_REQUEST_H="$Date: 2010/09/24 08:18:57 $"; +#define IDENT_PA_REQUEST_H "$Id: pa_request.h,v 1.217 2015/04/08 18:08:52 moko Exp $" #include "pa_pool.h" #include "pa_hash.h" @@ -18,16 +18,10 @@ static const char * const IDENT_REQUEST_ #include "pa_request_info.h" #include "pa_request_charsets.h" #include "pa_sapi.h" -#include "pa_vconsole.h" - -#ifdef RESOURCES_DEBUG -#include -#endif // consts const uint ANTI_ENDLESS_EXECUTE_RECOURSION=1000; -const uint ANTI_ENDLESS_JSON_STRING_RECOURSION=100; const size_t pseudo_file_no__process=1; // forwards @@ -40,13 +34,15 @@ class VForm; class VResponse; class VCookie; class VStateless_class; +class VConsole; /// Main workhorse. class Request: public PA_Object { friend class Temp_lang; friend class Temp_connection; - friend class Request_context_saver; friend class Temp_request_self; + friend class Temp_value_element; + friend class Request_context_saver; friend class Exception_trace; public: @@ -132,8 +128,6 @@ private: */ uint anti_endless_execute_recoursion; - uint anti_endless_json_string_recoursion; - ///@} /// execution stack @@ -143,6 +137,8 @@ private: Exception_trace exception_trace; public: + bool allow_class_replace; + //@{ request processing status /// contexts VMethodFrame* method_frame; @@ -186,8 +182,7 @@ public: #endif Request(SAPI_Info& asapi_info, Request_info& arequest_info, - String::Language adefault_lang, ///< all tainted data default untainting lang - bool status_allowed ///< status class allowed + String::Language adefault_lang ///< all tainted data default untainting lang ); ~Request(); @@ -224,21 +219,6 @@ public: anti_endless_execute_recoursion--; } - uint json_string_recoursion_go_down(){ - if(++anti_endless_json_string_recoursion==ANTI_ENDLESS_JSON_STRING_RECOURSION){ - anti_endless_json_string_recoursion=0; - throw Exception(PARSER_RUNTIME, - 0, - "call canceled - endless json recursion detected"); - } - return anti_endless_json_string_recoursion; - } - - void json_string_recoursion_go_up(){ - if(anti_endless_json_string_recoursion) - anti_endless_json_string_recoursion--; - } - /// void use_file_directly(VStateless_class& aclass, const String& file_spec, @@ -283,7 +263,7 @@ public: /// appending, sure of clean string inside void write_no_lang(const String& astring) { wcontext->write(astring, - (String::Language)(String::L_CLEAN | flang&String::L_OPTIMIZE_BIT)); + (String::Language)(String::L_CLEAN | (flang & String::L_OPTIMIZE_BIT) )); } /// appending sure value, that would be converted to clean string void write_no_lang(Value& avalue) { @@ -291,7 +271,7 @@ public: wcontext->write(avalue); else wcontext->write(avalue, - (String::Language)(String::L_CLEAN | flang&String::L_OPTIMIZE_BIT)); + (String::Language)(String::L_CLEAN | (flang & String::L_OPTIMIZE_BIT) )); } /// appending string, passing language built into string being written @@ -320,6 +300,9 @@ public: /// returns an absolute @a path to relative @a name const String& absolute(const String& relative_name); + /// returns the mime type of 'user_file_name' + const String& mime_type_of(const String* file_name); + /// returns the mime type of 'user_file_name_cstr' const String& mime_type_of(const char* user_file_name_cstr); @@ -485,7 +468,6 @@ class Request_context_saver { /// execution stack size_t stack; uint anti_endless_execute_recoursion; - uint anti_endless_json_string_recoursion; /// contexts VMethodFrame* method_frame; Value* rcontext; @@ -502,7 +484,6 @@ public: exception_trace_bottom(ar.exception_trace.bottom_index()), stack(ar.stack.top_index()), anti_endless_execute_recoursion(ar.anti_endless_execute_recoursion), - anti_endless_json_string_recoursion(ar.anti_endless_json_string_recoursion), method_frame(ar.method_frame), rcontext(ar.rcontext), wcontext(ar.wcontext), @@ -513,7 +494,6 @@ public: fr.exception_trace.set_bottom_index(exception_trace_bottom); fr.stack.set_top_index(stack); fr.anti_endless_execute_recoursion=anti_endless_execute_recoursion; - fr.anti_endless_json_string_recoursion=anti_endless_json_string_recoursion; fr.method_frame=method_frame, fr.rcontext=rcontext; fr.wcontext=wcontext; fr.flang=flang; fr.fconnection=fconnection; @@ -560,6 +540,29 @@ public: } }; +/// Auto-object used for temporary changing Request::allow_class_replace. +class Temp_class_replace { + Request& frequest; +public: + Temp_class_replace(Request& arequest, bool avalue) : frequest(arequest){ + frequest.allow_class_replace=avalue; + } + ~Temp_class_replace() { + frequest.allow_class_replace=false; + } +}; + +/// Auto-object used for temporarily substituting/removing elements +class Temp_value_element { + Request& frequest; + Value& fwhere; + const String& fname; + Value* saved; +public: + Temp_value_element(Request& arequest, Value& awhere, const String& aname, Value* awhat); + ~Temp_value_element(); +}; + // defines for externs #define EXCEPTION_HANDLED_PART_NAME "handled"