Annotation of parser3/src/types/pa_vrequest.C, revision 1.58

1.2       paf         1: /** @file
1.5       paf         2:        Parser: @b request class.
1.2       paf         3: 
1.52      moko        4:        Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com)
1.16      paf         5:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.18      paf         6: */
1.2       paf         7: 
1.1       paf         8: #include "pa_vrequest.h"
1.28      paf         9: #include "pa_request_info.h"
                     10: #include "pa_request_charsets.h"
1.13      paf        11: #include "pa_charsets.h"
1.28      paf        12: #include "pa_vstring.h"
1.38      misha      13: #include "pa_vhash.h"
1.40      misha      14: #include "pa_vform.h"
                     15: #include "pa_vvoid.h"
1.50      misha      16: #include "pa_vfile.h"
1.1       paf        17: 
1.58    ! moko       18: volatile const char * IDENT_PA_VREQUEST_C="$Id: pa_vrequest.C,v 1.57 2015/03/16 09:47:36 misha Exp $" IDENT_PA_VREQUEST_H;
1.52      moko       19: 
1.30      paf        20: // defines
                     21: 
                     22: #define DOCUMENT_ROOT_NAME "document-root"
1.58    ! moko       23: #define REQUEST_HEADERS_ELEMENT_NAME "headers"
1.30      paf        24: 
1.58    ! moko       25: VRequest::VRequest(Request_info& ainfo, Request_charsets& acharsets, VForm& aform, SAPI_Info& asapi_info): 
1.38      misha      26:                finfo(ainfo), 
1.40      misha      27:                fcharsets(acharsets),
1.58    ! moko       28:                fform(aform),
        !            29:                fsapi_info(asapi_info) {
1.41      misha      30: 
1.46      misha      31:        if(ainfo.argv)
                     32:                for(size_t i=ainfo.args_skip; ainfo.argv[i]; i++) {
                     33:                        char* value=new(PointerFreeGC) char[strlen(ainfo.argv[i])+1];
1.38      misha      34:                        strcpy(value, ainfo.argv[i]);
                     35:        
                     36:                        fargv.put_dont_replace(
1.46      misha      37:                                String(i-ainfo.args_skip, "%d"),
1.45      misha      38:                                new VString(*new String(value, String::L_TAINTED))
1.38      misha      39:                        );
                     40:                }
                     41: }
1.30      paf        42: 
1.49      misha      43: Value* VRequest::get_element(const String& aname) {
1.58    ! moko       44: #ifndef OPTIMIZE_BYTECODE_GET_ELEMENT__SPECIAL
        !            45:        // $CLASS
        !            46:        if(aname==CLASS_NAME)
        !            47:                return this;
        !            48: 
        !            49:        // $CLASS_NAME
        !            50:        if(aname==CLASS_NAMETEXT)
        !            51:                return new VString(request_class_name);
        !            52: #endif
        !            53: 
1.40      misha      54:        // $request:charset
1.24      paf        55:        if(aname==CHARSET_NAME)
1.28      paf        56:                return new VString(*new String(fcharsets.source().NAME(), String::L_TAINTED));
1.39      misha      57: 
1.58    ! moko       58:        // $request:body-charset
        !            59:        if(aname==REQUEST_BODY_CHARSET_NAME || aname==POST_CHARSET_NAME /*backward*/){
        !            60:                if(Charset* body_charset=fform.get_body_charset())
        !            61:                        return new VString(*new String(body_charset->NAME(), String::L_TAINTED));
1.40      misha      62:                else
1.42      misha      63:                        return VVoid::get();
1.40      misha      64:        }
1.50      misha      65: 
1.58    ! moko       66:        // $resuest:body-file
        !            67:        if(aname==REQUEST_BODY_BODY_NAME || aname==POST_BODY_NAME /*backward*/){
1.50      misha      68:                VFile& result=*new VFile;
1.55      moko       69:                result.set_binary(true/*tainted*/, (finfo.post_data)?finfo.post_data:"" /*to distinguish from stat-ed file*/, finfo.post_size);
1.50      misha      70:                return &result;
                     71:        }
                     72: 
1.40      misha      73:        // $request:argv
1.39      misha      74:        if(aname==REQUEST_ARGV_ELEMENT_NAME)
1.38      misha      75:                return new VHash(fargv);
1.30      paf        76:        
1.58    ! moko       77:        //$request:headers
        !            78:        if(aname==REQUEST_HEADERS_ELEMENT_NAME){
        !            79:                if(!ffields.count())
        !            80:                        fill();
        !            81:                return new VHash(ffields);
        !            82:        }
        !            83: 
        !            84:        // $request:query $request:uri $request:document-root $request:body $request:method
1.30      paf        85:        const char* buf;
                     86:        if(aname=="query")
                     87:                buf=finfo.query_string;
                     88:        else if(aname=="uri")
                     89:                buf=finfo.uri;
                     90:        else if(aname==DOCUMENT_ROOT_NAME)
                     91:                buf=finfo.document_root;
1.43      misha      92:        else if(aname=="body")
1.30      paf        93:                buf=finfo.post_data;
1.58    ! moko       94:        else if(aname=="method")
        !            95:                buf=finfo.method;
1.43      misha      96:        else
1.30      paf        97:                return bark("%s field not found", &aname);
1.12      paf        98: 
1.45      misha      99:        return new VString(*new String(buf, String::L_TAINTED));
1.1       paf       100: }
                    101: 
1.56      moko      102: const VJunction* VRequest::put_element(const String& aname, Value* avalue) {
1.30      paf       103:        // $charset
1.20      paf       104:        if(aname==CHARSET_NAME) {
1.46      misha     105:                fcharsets.set_source(charsets.get(avalue->as_string().change_case(UTF8_charset, String::CC_UPPER)));
1.33      paf       106:                return PUT_ELEMENT_REPLACED_ELEMENT;
1.30      paf       107:        } 
                    108: 
                    109:        // $document-root
                    110:        if(aname==DOCUMENT_ROOT_NAME) {
1.48      misha     111:                finfo.document_root=avalue->as_string().taint_cstr(String::L_FILE_SPEC);
1.33      paf       112:                return PUT_ELEMENT_REPLACED_ELEMENT;
1.30      paf       113:        } 
                    114: 
1.56      moko      115:        return Value::put_element(aname, avalue);
1.12      paf       116: }
1.58    ! moko      117: 
        !           118: void VRequest::fill(){
        !           119:        for(SAPI::Env::Iterator i(fsapi_info); i; i.next() ){
        !           120:                char* key=i.key();
        !           121: 
        !           122:                if(pa_strncasecmp(key, "HTTP_")==0) {
        !           123:                        for(char* c=key+5; *c; c++)
        !           124:                                *c=(char)toupper((unsigned char)*c);
        !           125: 
        !           126:                        ffields.put(
        !           127:                                key+5 /*skip "HTTP_" */,
        !           128:                                new VString(*new String(i.value(), String::L_TAINTED))
        !           129:                        );
        !           130:                }
        !           131:        }
        !           132: }

E-mail: