|
|
| version 1.122.2.1, 2001/04/27 15:19:30 | version 1.128, 2001/05/07 13:30:03 |
|---|---|
| Line 25 | Line 25 |
| #include "pa_vtable.h" | #include "pa_vtable.h" |
| #include "pa_vfile.h" | #include "pa_vfile.h" |
| /// $LIMITS.post_max_size default 10M | |
| const size_t MAX_POST_SIZE_DEFAULT=10*0x400*400; | |
| /// content type of exception response, when no @MAIN:exception handler defined | /// content type of exception response, when no @MAIN:exception handler defined |
| const char *UNHANDLED_EXCEPTION_CONTENT_TYPE="text/plain"; | const char *UNHANDLED_EXCEPTION_CONTENT_TYPE="text/plain"; |
| /// content type of response when no $MAIN:defaults.content-type defined | /// content type of response when no $MAIN:defaults.content-type defined |
| const char *DEFAULT_CONTENT_TYPE="text/html"; | const char *DEFAULT_CONTENT_TYPE="text/html"; |
| MOP_create(Pool&); | Methoded *MOP_create(Pool&); |
| // | // |
| Request::Request(Pool& apool, | Request::Request(Pool& apool, |
| Line 54 Request::Request(Pool& apool, | Line 51 Request::Request(Pool& apool, |
| used_files(apool), | used_files(apool), |
| default_content_type(0), | default_content_type(0), |
| mime_types(0), | mime_types(0), |
| connection(0), protocol2library(0), | main_class(0), |
| mail(0), | connection(0), |
| pcre_tables(0) | pcre_tables(0), |
| classes_conf(apool) | |
| { | { |
| /// directly used | |
| // operators | // operators |
| OP.register_directly_used(r); | OP.register_directly_used(*this); |
| // classes: | |
| // table, file, random, mail, image, ... | |
| methoded_array->register_directly_used(*this); | |
| /// methodless | |
| // env class | // env class |
| classes().put(NEW String(ENV_CLASS_NAME), &env); | classes().put(*NEW String(pool(), ENV_CLASS_NAME), &env); |
| // form class | |
| classes().put(form.get_class().name(), &form); | |
| // request class | // request class |
| classes().put(NEW String(REQUEST_CLASS_NAME), &request); | classes().put(*NEW String(pool(), REQUEST_CLASS_NAME), &request); |
| // response class | |
| classes().put(response.get_class().name(), &response); | |
| // cookie class | // cookie class |
| classes().put(NEW String(COOKIE_CLASS_NAME), &cookie); | classes().put(*NEW String(pool(), COOKIE_CLASS_NAME), &cookie); |
| // classes: | /// methoded |
| // table, file, random, mail, image | // response class |
| methoded_array->register_directly_used(*this); | classes().put(response.get_class()->name(), &response); |
| /// bases used | |
| // form class | |
| classes().put(form.get_class()->base()->name(), &form); | |
| } | } |
| static void element2ctypes(unsigned char *tables, | static void element2ctypes(unsigned char *tables, |
| Line 147 void Request::core(const char *root_auto | Line 151 void Request::core(const char *root_auto |
| const char *site_auto_path, bool site_auto_fail, | const char *site_auto_path, bool site_auto_fail, |
| bool header_only) { | bool header_only) { |
| //_asm { int 3 } | //_asm { int 3 } |
| VStateless_class *main_class=0; | |
| bool need_rethrow=false; Exception rethrow_me; | bool need_rethrow=false; Exception rethrow_me; |
| TRY { | TRY { |
| char *auto_filespec=(char *)malloc(MAX_STRING); | char *auto_filespec=(char *)malloc(MAX_STRING); |
| Line 162 void Request::core(const char *root_auto | Line 165 void Request::core(const char *root_auto |
| main_class_name, main_class); | main_class_name, main_class); |
| } | } |
| // $MAIN:LIMITS hash used here, | // configure root options |
| // until someone with less privileges have overriden them | // until someone with less privileges have overriden them |
| { | methoded_array->configure_admin(*this); |
| Value *limits=main_class?main_class->get_element(*limits_name):0; | |
| if(info.method && StrEqNc(info.method, "post", true)) { | |
| // $limits.post_max_size default 10M | |
| Value *element=limits?limits->get_element(*post_max_size_name):0; | |
| size_t value=element?(size_t)element->as_double():0; | |
| size_t post_max_size=value?value:MAX_POST_SIZE_DEFAULT; | |
| if(size_t limit=max(0, min(info.content_length, post_max_size))) { | |
| // read POST data | |
| post_data=(char *)malloc(limit); | |
| post_size=SAPI::read_post(pool(), post_data, limit); | |
| if(post_size!=limit) | |
| THROW(0, 0, | |
| 0, | |
| "post_size(%d)!=limit(%d)", | |
| post_size, limit); | |
| } | |
| } | |
| form.fill_fields(*this); | |
| } | |
| // filling cookies | |
| cookie.fill_fields(*this); | |
| // loading site auto.p | // loading site auto.p |
| if(site_auto_path) { | if(site_auto_path) { |
| Line 231 void Request::core(const char *root_auto | Line 210 void Request::core(const char *root_auto |
| } | } |
| } | } |
| // compiling requested file | // compile requested file |
| String& spath_translated=*NEW String(pool()); | String& spath_translated=*NEW String(pool()); |
| spath_translated.APPEND_CLEAN(info.path_translated, 0, "user-request", 0); | spath_translated.APPEND_CLEAN(info.path_translated, 0, "user-request", 0); |
| main_class=use_file(spath_translated, true/*don't ignore read problem*/, | main_class=use_file(spath_translated, true/*don't ignore read problem*/, |
| main_class_name, main_class); | main_class_name, main_class); |
| // configure not-root=user options | |
| methoded_array->configure_user(*this); | |
| // $MAIN:DEFAULTS | // $MAIN:DEFAULTS |
| Value *defaults=main_class->get_element(*defaults_name); | Value *defaults=main_class->get_element(*defaults_name); |
| // value must be allocated on request's pool for that pool used on | // value must be allocated on request's pool for that pool used on |
| Line 246 void Request::core(const char *root_auto | Line 228 void Request::core(const char *root_auto |
| if(Table *table=element->get_table()) | if(Table *table=element->get_table()) |
| pool().set_tag(table); | pool().set_tag(table); |
| // $MAIN:SQL.drivers | |
| if(Value *sql=main_class->get_element(*main_sql_name)) | |
| if(Value *element=sql->get_element(*main_sql_drivers_name)) | |
| protocol2library=element->get_table(); | |
| // $MAIN:MIME-TYPES | // $MAIN:MIME-TYPES |
| if(Value *element=main_class->get_element(*mime_types_name)) | if(Value *element=main_class->get_element(*mime_types_name)) |
| if(Table *table=element->get_table()) | if(Table *table=element->get_table()) |
| Line 268 void Request::core(const char *root_auto | Line 245 void Request::core(const char *root_auto |
| ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz] | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz] |
| $word[ | $word[ |
| 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz] | 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz] |
| $meta[ | |
| ^#00$()*+.?[^{|] | |
| $lowercase[ | $lowercase[ |
| AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz] | AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz] |
| Line 290 void Request::core(const char *root_auto | Line 265 void Request::core(const char *root_auto |
| element2case(pcre_tables, *ctype, *ctype_lowercase_name); | element2case(pcre_tables, *ctype, *ctype_lowercase_name); |
| } | } |
| // $MAIN:MAIL[$SMTP[mail.design.ru]] | // filling form fields |
| if(Value *mail_element=main_class->get_element(*mail_name)) | form.fill_fields(*this); |
| if(!(mail=mail_element->get_hash())) | |
| THROW(0, 0, | |
| 0, | |
| "$MAIN:MAIL is not hash"); | |
| // filling cookies | |
| cookie.fill_fields(*this); | |
| // execute @main[] | // execute @main[] |
| const String *body_string=execute_method(*main_class, *main_method_name); | const String *body_string=execute_method(*main_class, *main_method_name); |