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

1.2       paf         1: /** @file
1.5       paf         2:        Parser: @b request class.
1.2       paf         3: 
1.41      misha       4:        Copyright(c) 2001-2009 ArtLebedev Group (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.45    ! misha       8: static const char * const IDENT_VREQUEST_C="$Date: 2009-05-13 08:36:22 $";
1.1       paf         9: 
                     10: #include "pa_vrequest.h"
1.28      paf        11: #include "pa_request_info.h"
                     12: #include "pa_request_charsets.h"
1.13      paf        13: #include "pa_charsets.h"
1.28      paf        14: #include "pa_vstring.h"
1.38      misha      15: #include "pa_vhash.h"
1.40      misha      16: #include "pa_vform.h"
                     17: #include "pa_vvoid.h"
1.1       paf        18: 
1.30      paf        19: // defines
                     20: 
                     21: #define DOCUMENT_ROOT_NAME "document-root"
                     22: 
1.40      misha      23: VRequest::VRequest(Request_info& ainfo, Request_charsets& acharsets, VForm& aform): 
1.38      misha      24:                finfo(ainfo), 
1.40      misha      25:                fcharsets(acharsets),
                     26:                fform(aform) {
1.41      misha      27: 
1.38      misha      28:        if(ainfo.argv) {
                     29:                for (size_t i = ainfo.args_skip; ainfo.argv[i]; i++) {
1.41      misha      30:                        char *name = new(PointerFreeGC) char[3 /* max 999 argvs */ + 1/* terminating 0 */];
1.38      misha      31: 
                     32:                        char *value = new(PointerFreeGC) char[strlen(ainfo.argv[i])+1];
                     33:                        strcpy(value, ainfo.argv[i]);
                     34:        
1.43      misha      35:                        sprintf(name, "%d", i - ainfo.args_skip);
1.38      misha      36:                        fargv.put_dont_replace(
1.43      misha      37:                                *new String(name),
1.45    ! misha      38:                                new VString(*new String(value, String::L_TAINTED))
1.38      misha      39:                        );
                     40:                }
                     41:        }
                     42: }
1.30      paf        43: 
1.28      paf        44: Value* VRequest::get_element(const String& aname, Value&  /*aself*/, bool /*looking_up*/) {
1.40      misha      45:        // $request:charset
1.24      paf        46:        if(aname==CHARSET_NAME)
1.28      paf        47:                return new VString(*new String(fcharsets.source().NAME(), String::L_TAINTED));
1.39      misha      48: 
1.40      misha      49:        // $request:post-charset
                     50:        if(aname==POST_CHARSET_NAME){
                     51:                if(Charset* post_charset=fform.get_post_charset())
                     52:                        return new VString(*new String(post_charset->NAME(), String::L_TAINTED));
                     53:                else
1.42      misha      54:                        return VVoid::get();
1.40      misha      55:        }
                     56:        
1.41      misha      57:        // $CLASS
                     58:        if(aname==CLASS_NAME)
                     59:                return this;
                     60: 
                     61:        // $CLASS_NAME
                     62:        if(aname==CLASS_NAMETEXT)
                     63:                return new VString(request_class_name);
                     64: 
1.40      misha      65:        // $request:argv
1.39      misha      66:        if(aname==REQUEST_ARGV_ELEMENT_NAME)
1.38      misha      67:                return new VHash(fargv);
1.30      paf        68:        
1.40      misha      69:        // $request:query $request:uri $request:document-root $request:body
1.30      paf        70:        const char* buf;
                     71:        if(aname=="query")
                     72:                buf=finfo.query_string;
                     73:        else if(aname=="uri")
                     74:                buf=finfo.uri;
                     75:        else if(aname==DOCUMENT_ROOT_NAME)
                     76:                buf=finfo.document_root;
1.43      misha      77:        else if(aname=="body")
1.30      paf        78:                buf=finfo.post_data;
1.43      misha      79:        else
1.30      paf        80:                return bark("%s field not found", &aname);
1.12      paf        81: 
1.45    ! misha      82:        return new VString(*new String(buf, String::L_TAINTED));
1.1       paf        83: }
                     84: 
1.36      paf        85: const VJunction* VRequest::put_element(Value& aself, const String& aname, Value* avalue, bool areplace) {
1.30      paf        86:        // $charset
1.20      paf        87:        if(aname==CHARSET_NAME) {
1.28      paf        88:                fcharsets.set_source(charsets.get(avalue->as_string().
                     89:                        change_case(UTF8_charset, String::CC_UPPER)));
1.33      paf        90:                return PUT_ELEMENT_REPLACED_ELEMENT;
1.30      paf        91:        } 
                     92: 
                     93:        // $document-root
                     94:        if(aname==DOCUMENT_ROOT_NAME) {
                     95:                finfo.document_root=avalue->as_string().cstr(String::L_FILE_SPEC);
1.33      paf        96:                return PUT_ELEMENT_REPLACED_ELEMENT;
1.30      paf        97:        } 
                     98: 
1.35      paf        99:        return Value::put_element(aself, aname, avalue, areplace);
1.12      paf       100: }

E-mail: