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

1.2       paf         1: /** @file
1.5       paf         2:        Parser: @b request class.
1.2       paf         3: 
1.37      paf         4:        Copyright(c) 2001-2005 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.38    ! misha       8: static const char * const IDENT_VREQUEST_C="$Date: 2005/08/09 08:14:55 $";
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.1       paf        16: 
1.30      paf        17: // defines
                     18: 
                     19: #define DOCUMENT_ROOT_NAME "document-root"
                     20: 
1.38    ! misha      21: VRequest::VRequest(Request_info& ainfo, Request_charsets& acharsets): 
        !            22:                finfo(ainfo), 
        !            23:                fcharsets(acharsets) {
        !            24:    
        !            25:        if(ainfo.argv) {
        !            26:                for (size_t i = ainfo.args_skip; ainfo.argv[i]; i++) {
        !            27:                char *name = new(PointerFreeGC) char[3 /* max 999 argvs */ + 1/* terminating 0 */];
        !            28: 
        !            29:                        char *value = new(PointerFreeGC) char[strlen(ainfo.argv[i])+1];
        !            30:                        strcpy(value, ainfo.argv[i]);
        !            31:        
        !            32:                        fargv.put_dont_replace(
        !            33:                                *new String(name, sprintf(name, "%d", i - ainfo.args_skip)),
        !            34:                                new VString(*new String(value))
        !            35:                        );
        !            36:                }
        !            37:        }
        !            38: }
1.30      paf        39: 
1.7       parser     40: // request: CLASS,method,field
1.28      paf        41: Value* VRequest::get_element(const String& aname, Value&  /*aself*/, bool /*looking_up*/) {
1.12      paf        42:        // $charset
1.24      paf        43:        if(aname==CHARSET_NAME)
1.28      paf        44:                return new VString(*new String(fcharsets.source().NAME(), String::L_TAINTED));
1.38    ! misha      45:        else if(aname==REQUEST_ARGV_ELEMENT_NAME)
        !            46:                return new VHash(fargv);
1.30      paf        47:        
                     48:        // $query $uri $document-root $body
                     49:        const char* buf;
                     50:        size_t size=0;
                     51:        if(aname=="query")
                     52:                buf=finfo.query_string;
                     53:        else if(aname=="uri")
                     54:                buf=finfo.uri;
                     55:        else if(aname==DOCUMENT_ROOT_NAME)
                     56:                buf=finfo.document_root;
                     57:        else if(aname=="body") {
                     58:                buf=finfo.post_data;
                     59:                size=finfo.post_size;
                     60:        } else
                     61:                return bark("%s field not found", &aname);
1.12      paf        62: 
1.30      paf        63:        return new VString(*new String(buf?buf:"", size, true));
1.1       paf        64: }
                     65: 
1.36      paf        66: const VJunction* VRequest::put_element(Value& aself, const String& aname, Value* avalue, bool areplace) {
1.30      paf        67:        // $charset
1.20      paf        68:        if(aname==CHARSET_NAME) {
1.28      paf        69:                fcharsets.set_source(charsets.get(avalue->as_string().
                     70:                        change_case(UTF8_charset, String::CC_UPPER)));
1.33      paf        71:                return PUT_ELEMENT_REPLACED_ELEMENT;
1.30      paf        72:        } 
                     73: 
                     74:        // $document-root
                     75:        if(aname==DOCUMENT_ROOT_NAME) {
                     76:                finfo.document_root=avalue->as_string().cstr(String::L_FILE_SPEC);
1.33      paf        77:                return PUT_ELEMENT_REPLACED_ELEMENT;
1.30      paf        78:        } 
                     79: 
1.35      paf        80:        return Value::put_element(aself, aname, avalue, areplace);
1.12      paf        81: }

E-mail: