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: