|
version 1.138.2.1, 2002/06/20 16:31:08
|
version 1.160.2.1, 2003/01/23 17:05:34
|
|
Line 1
|
Line 1
|
| /** @file |
/** @file |
| Parser: request class decl. |
Parser: request class decl. |
| |
|
| Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) |
Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com) |
| Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) |
Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) |
| |
|
| $Id$ |
|
| */ |
*/ |
| |
|
| #ifndef PA_REQUEST_H |
#ifndef PA_REQUEST_H |
| #define PA_REQUEST_H |
#define PA_REQUEST_H |
| |
|
| |
static const char* IDENT_REQUEST_H="$Date$"; |
| |
|
| #include "pa_pool.h" |
#include "pa_pool.h" |
| #include "pa_hash.h" |
#include "pa_hash.h" |
| #include "pa_wcontext.h" |
#include "pa_wcontext.h" |
|
Line 20
|
Line 20
|
| #include "pa_venv.h" |
#include "pa_venv.h" |
| #include "pa_vstatus.h" |
#include "pa_vstatus.h" |
| #include "pa_vform.h" |
#include "pa_vform.h" |
| |
#include "pa_vmail.h" |
| #include "pa_vmath.h" |
#include "pa_vmath.h" |
| #include "pa_vrequest.h" |
#include "pa_vrequest.h" |
| #include "pa_vresponse.h" |
#include "pa_vresponse.h" |
|
Line 39 const uint ANTI_ENDLESS_EXECUTE_RECOURSI
|
Line 40 const uint ANTI_ENDLESS_EXECUTE_RECOURSI
|
| |
|
| #ifndef NO_STRING_ORIGIN |
#ifndef NO_STRING_ORIGIN |
| # define COMPILE_PARAMS \ |
# define COMPILE_PARAMS \ |
| const char *source, \ |
VStateless_class& aclass, const char *source \ |
| VStateless_class *aclass, const String *name, \ |
, const char *file |
| VStateless_class *base_class, \ |
# define COMPILE(aclass, source, file) \ |
| const char *file |
real_compile(aclass, source, file) |
| # define COMPILE(source, aclass, name, base_class, file) \ |
|
| real_compile(source, aclass, name, base_class, file) |
|
| #else |
#else |
| # define COMPILE_PARAMS \ |
# define COMPILE_PARAMS \ |
| const char *source, \ |
VStateless_class& aclass, const char *source |
| VStateless_class *aclass, const String *name, \ |
# define COMPILE(aclass, source, file) \ |
| VStateless_class *base_class |
real_compile(aclass, source) |
| # define COMPILE(source, aclass, name, base_class, file) \ |
|
| real_compile(source, aclass, name, base_class) |
|
| #endif |
#endif |
| |
|
| class Temp_lang; |
class Temp_lang; |
|
Line 62 class VMethodFrame;
|
Line 59 class VMethodFrame;
|
| class Request : public Pooled { |
class Request : public Pooled { |
| friend class Temp_lang; |
friend class Temp_lang; |
| friend class Temp_connection; |
friend class Temp_connection; |
| |
friend class Request_context_saver; |
| |
friend class Temp_request_self; |
| public: |
public: |
| |
|
| |
Pool& pool() { return fpool; } |
| |
|
| #ifdef RESOURCES_DEBUG |
#ifdef RESOURCES_DEBUG |
| /// measures |
/// measures |
| double sql_connect_time; |
double sql_connect_time; |
|
Line 81 public:
|
Line 82 public:
|
| const char *content_type; |
const char *content_type; |
| size_t content_length; |
size_t content_length; |
| const char *cookie; |
const char *cookie; |
| |
bool mail_received; |
| }; |
}; |
| |
|
| Request(Pool& apool, |
Request( |
| Info& ainfo, |
Info& ainfo, |
| uchar adefault_lang, ///< all tainted data default untainting lang |
uchar adefault_lang, ///< all tainted data default untainting lang |
| bool status_allowed ///< status class allowed |
bool status_allowed ///< status class allowed |
|
Line 119 public:
|
Line 121 public:
|
| } |
} |
| |
|
| /// compiles the file, maybe forcing it's class @a name and @a base_class. |
/// compiles the file, maybe forcing it's class @a name and @a base_class. |
| VStateless_class *use_file( |
VStateless_class *use_file(VStateless_class& aclass, |
| const String& file_name, |
const String& file_name, |
| bool ignore_class_path=false, bool fail_on_read_problem=true, |
bool ignore_class_path=false, |
| const String *name=0, |
bool fail_on_read_problem=true, bool fail_on_file_absence=true); // core.C |
| VStateless_class *base_class=0); // core.C |
|
| /// compiles a @a source buffer |
/// compiles a @a source buffer |
| VStateless_class *use_buf( |
VStateless_class *use_buf(VStateless_class& aclass, |
| const char *source, const String& filespec, const char *filespec_cstr, |
const char *source, |
| VStateless_class *aclass=0, const String *name=0, |
const String& filespec, const char *filespec_cstr); // core.C |
| VStateless_class *base_class=0); // core.C |
|
| |
|
| /// processes any code-junction there may be inside of @a value |
/// processes any code-junction there may be inside of @a value |
| StringOrValue process(Value& input_value, bool intercept_string=true); // execute.C |
StringOrValue process(Value& input_value, bool intercept_string=true); // execute.C |
|
Line 216 public:
|
Line 216 public:
|
| return fconnection; |
return fconnection; |
| } |
} |
| |
|
| bool origins_mode() { |
bool origins_mode(); |
| return main_class->get_element(*origins_mode_name)!=0; // $ORIGINS mode |
|
| } |
void interrupt() { finterrupted=true; } |
| |
bool interrupted() { return finterrupted; } |
| |
|
| public: |
public: |
| |
|
| /// info from web server |
/// info from web server |
| Info& info; |
Info& info; |
| /// user's post data |
/// user's post data |
| char *post_data; size_t post_size; |
const char *post_data; size_t post_size; |
| |
|
| /// name of 'main' method |
/// name of 'main' method |
| const String main_method_name; |
const String main_method_name; |
| |
|
| /// operators are methods of this class |
/// 'MAIN' class conglomerat & operators are methods of this class |
| Methoded& OP; |
VClass& main_class; |
| /// $env:fields |
/// $env:fields |
| VEnv env; |
VEnv env; |
| /// $status:fields |
/// $status:fields |
| VStatus status; |
VStatus status; |
| /// $form:elements |
/// $form:elements |
| VForm form; |
VForm form; |
| |
/// $mail |
| |
VMail mail; |
| /// $math:constants |
/// $math:constants |
| VMath math; |
VMath math; |
| /// $request:elements |
/// $request:elements |
|
Line 247 public:
|
Line 250 public:
|
| /// $cookie:elements |
/// $cookie:elements |
| VCookie cookie; |
VCookie cookie; |
| |
|
| |
/// classes configured data |
| |
Hash classes_conf; |
| |
|
| |
private: |
| |
|
| |
Pool fpool; |
| |
|
| //@{ request processing status |
//@{ request processing status |
| |
/// exception stack trace |
| |
Stack exception_trace; |
| /// execution stack |
/// execution stack |
| Stack stack; |
Stack stack; |
| /// contexts |
/// contexts |
| Value *self, *root, *rcontext; |
VMethodFrame *method_frame; |
| /// contexts |
Value *rcontext; |
| WContext *wcontext; |
WContext *wcontext; |
| /// exception stack trace |
/// current language |
| Stack exception_trace; |
uchar flang; |
| |
/// current connection |
| |
SQL_Connection *fconnection; |
| //@} |
//@} |
| |
/// interrupted flag, raised on signals [SIGPIPE] |
| |
bool finterrupted; |
| |
|
| /// 'MAIN' class conglomerat |
public: // status read methods |
| VStateless_class *main_class; |
|
| |
|
| /// classes configured data |
VMethodFrame *get_method_frame() { return method_frame; } |
| Hash classes_conf; |
Value *get_self(); |
| |
|
| private: // core data |
private: // core data |
| |
|
|
Line 327 private: // lang manipulation
|
Line 342 private: // lang manipulation
|
| flang=alang; |
flang=alang; |
| } |
} |
| |
|
| private: // lang&raw |
|
| |
|
| uchar flang; |
|
| |
|
| |
|
| private: // connection manipulation |
private: // connection manipulation |
| |
|
| SQL_Connection *set_connection(SQL_Connection *aconnection) { |
SQL_Connection *set_connection(SQL_Connection *aconnection) { |
|
Line 345 private: // connection manipulation
|
Line 355 private: // connection manipulation
|
| |
|
| private: |
private: |
| |
|
| /// connection |
void output_result(const VFile& body_file, bool header_only, bool as_attachment); |
| |
}; |
| |
|
| |
/// Auto-object used to save request context across ^try body |
| |
class Request_context_saver { |
| |
Request& fr; |
| |
|
| |
/// exception stack trace |
| |
int exception_trace; |
| |
/// execution stack |
| |
int stack; |
| |
/// contexts |
| |
VMethodFrame *method_frame; |
| |
Value *rcontext; |
| |
WContext *wcontext; |
| |
/// current language |
| |
uchar flang; |
| |
/// current connection |
| SQL_Connection *fconnection; |
SQL_Connection *fconnection; |
| |
|
| void output_result(const VFile& body_file, bool header_only); |
public: |
| |
Request_context_saver(Request& ar) : |
| |
exception_trace(ar.exception_trace.top_index()), |
| |
stack(ar.stack.top_index()), |
| |
method_frame(ar.method_frame), |
| |
rcontext(ar.rcontext), |
| |
wcontext(ar.wcontext), |
| |
flang(ar.flang), |
| |
fconnection(ar.fconnection), |
| |
fr(ar) {} |
| |
void restore() { |
| |
fr.exception_trace.top_index(exception_trace); |
| |
fr.stack.top_index(stack); |
| |
fr.method_frame=method_frame, fr.rcontext=rcontext; fr.wcontext=wcontext; |
| |
fr.flang=flang; |
| |
fr.fconnection=fconnection; |
| |
} |
| }; |
}; |
| |
|
| /// Auto-object used for temporary changing Request::flang. |
/// Auto-object used for temporary changing Request::flang. |