Annotation of parser3/src/types/pa_vrequest.C, revision 1.44
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.44 ! misha 8: static const char * const IDENT_VREQUEST_C="$Date: 2009-05-13 07:35:27 $";
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),
38: new VString(*new String(value, true/*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.44 ! misha 82: return new VString(*new String(buf, true/*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: