Annotation of parser3/src/classes/form.C, revision 1.25

1.3       paf         1: /** @file
                      2:        Parser: @b form parser class.
                      3: 
1.20      paf         4:        Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com)
1.21      paf         5:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.3       paf         6: 
1.25    ! paf         7:        $Id: form.C,v 1.24 2002/07/01 14:00:36 paf Exp $
1.1       paf         8: */
                      9: 
1.10      paf        10: #include "classes.h"
1.1       paf        11: #include "pa_request.h"
                     12: #include "pa_vform.h"
                     13: 
1.6       paf        14: /// $LIMITS.max_post_size default 10M
1.25    ! paf        15: const size_t MAX_POST_SIZE_DEFAULT=10*0x400*0x400;
1.5       paf        16: 
1.4       paf        17: // defines
1.1       paf        18: 
1.8       paf        19: #define LIMITS_NAME "LIMITS"
                     20: 
1.7       paf        21: #define MAX_POST_SIZE_NAME "post_max_size"
                     22: 
1.4       paf        23: // class
                     24: 
                     25: class MForm : public Methoded {
                     26: public:
                     27:        MForm(Pool& pool);
1.11      paf        28: public: // Methoded
1.4       paf        29:        bool used_directly() { return false; }
1.5       paf        30:        void configure_admin(Request& r);
1.7       paf        31: private:
                     32:        String max_post_size_name;
1.8       paf        33:        String limits_name;
1.4       paf        34: };
1.1       paf        35: 
                     36: // methods
                     37: 
1.5       paf        38: // constructor & configurator
1.4       paf        39: 
1.23      paf        40: MForm::MForm(Pool& apool) : Methoded(apool, "form"),
1.8       paf        41:        max_post_size_name(apool, MAX_POST_SIZE_NAME),
1.23      paf        42:        limits_name(apool, LIMITS_NAME) {
1.5       paf        43: }
                     44: 
                     45: void MForm::configure_admin(Request& r) {
                     46:        Pool& pool=r.pool();
                     47: 
1.8       paf        48:        Value *limits=r.main_class?r.main_class->get_element(limits_name):0;
1.6       paf        49:        if(r.info.method && StrEqNc(r.info.method, "post", true)) {
                     50:                // $limits.max_post_size default 10M
1.7       paf        51:                Value *element=limits?limits->get_element(max_post_size_name):0;
1.5       paf        52:                size_t value=element?(size_t)element->as_double():0;
1.6       paf        53:                size_t max_post_size=value?value:MAX_POST_SIZE_DEFAULT;
1.5       paf        54:                
1.6       paf        55:                if(r.info.content_length>max_post_size)
1.22      paf        56:                        throw Exception("parser.runtime",
1.5       paf        57:                                0,
                     58:                                "posted content_length(%u) > max_post_size(%u)",
1.24      paf        59:                                        r.content_length, max_post_size);
1.17      parser     60:                if(r.info.content_length<0)
1.22      paf        61:                        throw Exception(0,
1.17      parser     62:                                0,
                     63:                                "posted content_length(%u) < 0",
1.24      paf        64:                                        r.content_length);
1.5       paf        65: 
                     66:                // read POST data
1.17      parser     67:                if(r.info.content_length) {
                     68:                        r.post_data=(char *)pool.malloc(r.info.content_length);
                     69:                        r.post_size=SAPI::read_post(pool, r.post_data, r.info.content_length);
                     70:                }
1.5       paf        71:                if(r.post_size!=r.info.content_length)
1.22      paf        72:                        throw Exception(0, 
1.5       paf        73:                                0, 
1.25    ! paf        74:                                "post_size(%u) != content_length(%u)", 
1.5       paf        75:                                        r.post_size, r.info.content_length);
1.6       paf        76:        }
1.4       paf        77: }
                     78: 
                     79: // global variable
                     80: 
                     81: Methoded *form_base_class;
                     82: 
                     83: // creator
1.1       paf        84: 
1.4       paf        85: Methoded *MForm_create(Pool& pool) {
                     86:        return form_base_class=new(pool) MForm(pool);
1.1       paf        87: }

E-mail: