Annotation of parser3/src/types/pa_vrequest.C, revision 1.57
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.57 ! misha 18: volatile const char * IDENT_PA_VREQUEST_C="$Id: pa_vrequest.C,v 1.56 2013/10/04 21:21:57 moko Exp $" IDENT_PA_VREQUEST_H;
1.52 moko 19:
1.30 paf 20: // defines
21:
22: #define DOCUMENT_ROOT_NAME "document-root"
23:
1.40 misha 24: VRequest::VRequest(Request_info& ainfo, Request_charsets& acharsets, VForm& aform):
1.38 misha 25: finfo(ainfo),
1.40 misha 26: fcharsets(acharsets),
27: fform(aform) {
1.41 misha 28:
1.46 misha 29: if(ainfo.argv)
30: for(size_t i=ainfo.args_skip; ainfo.argv[i]; i++) {
31: char* value=new(PointerFreeGC) char[strlen(ainfo.argv[i])+1];
1.38 misha 32: strcpy(value, ainfo.argv[i]);
33:
34: fargv.put_dont_replace(
1.46 misha 35: String(i-ainfo.args_skip, "%d"),
1.45 misha 36: new VString(*new String(value, String::L_TAINTED))
1.38 misha 37: );
38: }
39: }
1.30 paf 40:
1.49 misha 41: Value* VRequest::get_element(const String& aname) {
1.40 misha 42: // $request: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.39 misha 45:
1.40 misha 46: // $request:post-charset
47: if(aname==POST_CHARSET_NAME){
48: if(Charset* post_charset=fform.get_post_charset())
49: return new VString(*new String(post_charset->NAME(), String::L_TAINTED));
50: else
1.42 misha 51: return VVoid::get();
1.40 misha 52: }
1.50 misha 53:
54: // $resuest:post-body
55: if(aname==POST_BODY_NAME){
56: VFile& result=*new VFile;
1.55 moko 57: result.set_binary(true/*tainted*/, (finfo.post_data)?finfo.post_data:"" /*to distinguish from stat-ed file*/, finfo.post_size);
1.50 misha 58: return &result;
59: }
60:
1.57 ! misha 61: #ifndef OPTIMIZE_BYTECODE_GET_ELEMENT__SPECIAL
1.41 misha 62: // $CLASS
63: if(aname==CLASS_NAME)
64: return this;
65:
66: // $CLASS_NAME
67: if(aname==CLASS_NAMETEXT)
68: return new VString(request_class_name);
1.57 ! misha 69: #endif
1.41 misha 70:
1.40 misha 71: // $request:argv
1.39 misha 72: if(aname==REQUEST_ARGV_ELEMENT_NAME)
1.38 misha 73: return new VHash(fargv);
1.30 paf 74:
1.40 misha 75: // $request:query $request:uri $request:document-root $request:body
1.30 paf 76: const char* buf;
77: if(aname=="query")
78: buf=finfo.query_string;
79: else if(aname=="uri")
80: buf=finfo.uri;
81: else if(aname==DOCUMENT_ROOT_NAME)
82: buf=finfo.document_root;
1.43 misha 83: else if(aname=="body")
1.30 paf 84: buf=finfo.post_data;
1.43 misha 85: else
1.30 paf 86: return bark("%s field not found", &aname);
1.12 paf 87:
1.45 misha 88: return new VString(*new String(buf, String::L_TAINTED));
1.1 paf 89: }
90:
1.56 moko 91: const VJunction* VRequest::put_element(const String& aname, Value* avalue) {
1.30 paf 92: // $charset
1.20 paf 93: if(aname==CHARSET_NAME) {
1.46 misha 94: fcharsets.set_source(charsets.get(avalue->as_string().change_case(UTF8_charset, String::CC_UPPER)));
1.33 paf 95: return PUT_ELEMENT_REPLACED_ELEMENT;
1.30 paf 96: }
97:
98: // $document-root
99: if(aname==DOCUMENT_ROOT_NAME) {
1.48 misha 100: finfo.document_root=avalue->as_string().taint_cstr(String::L_FILE_SPEC);
1.33 paf 101: return PUT_ELEMENT_REPLACED_ELEMENT;
1.30 paf 102: }
103:
1.56 moko 104: return Value::put_element(aname, avalue);
1.12 paf 105: }
E-mail: