Annotation of parser3/src/types/pa_vrequest.C, revision 1.58
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.58 ! moko 18: volatile const char * IDENT_PA_VREQUEST_C="$Id: pa_vrequest.C,v 1.57 2015/03/16 09:47:36 misha Exp $" IDENT_PA_VREQUEST_H;
1.52 moko 19:
1.30 paf 20: // defines
21:
22: #define DOCUMENT_ROOT_NAME "document-root"
1.58 ! moko 23: #define REQUEST_HEADERS_ELEMENT_NAME "headers"
1.30 paf 24:
1.58 ! moko 25: VRequest::VRequest(Request_info& ainfo, Request_charsets& acharsets, VForm& aform, SAPI_Info& asapi_info):
1.38 misha 26: finfo(ainfo),
1.40 misha 27: fcharsets(acharsets),
1.58 ! moko 28: fform(aform),
! 29: fsapi_info(asapi_info) {
1.41 misha 30:
1.46 misha 31: if(ainfo.argv)
32: for(size_t i=ainfo.args_skip; ainfo.argv[i]; i++) {
33: char* value=new(PointerFreeGC) char[strlen(ainfo.argv[i])+1];
1.38 misha 34: strcpy(value, ainfo.argv[i]);
35:
36: fargv.put_dont_replace(
1.46 misha 37: String(i-ainfo.args_skip, "%d"),
1.45 misha 38: new VString(*new String(value, String::L_TAINTED))
1.38 misha 39: );
40: }
41: }
1.30 paf 42:
1.49 misha 43: Value* VRequest::get_element(const String& aname) {
1.58 ! moko 44: #ifndef OPTIMIZE_BYTECODE_GET_ELEMENT__SPECIAL
! 45: // $CLASS
! 46: if(aname==CLASS_NAME)
! 47: return this;
! 48:
! 49: // $CLASS_NAME
! 50: if(aname==CLASS_NAMETEXT)
! 51: return new VString(request_class_name);
! 52: #endif
! 53:
1.40 misha 54: // $request:charset
1.24 paf 55: if(aname==CHARSET_NAME)
1.28 paf 56: return new VString(*new String(fcharsets.source().NAME(), String::L_TAINTED));
1.39 misha 57:
1.58 ! moko 58: // $request:body-charset
! 59: if(aname==REQUEST_BODY_CHARSET_NAME || aname==POST_CHARSET_NAME /*backward*/){
! 60: if(Charset* body_charset=fform.get_body_charset())
! 61: return new VString(*new String(body_charset->NAME(), String::L_TAINTED));
1.40 misha 62: else
1.42 misha 63: return VVoid::get();
1.40 misha 64: }
1.50 misha 65:
1.58 ! moko 66: // $resuest:body-file
! 67: if(aname==REQUEST_BODY_BODY_NAME || aname==POST_BODY_NAME /*backward*/){
1.50 misha 68: VFile& result=*new VFile;
1.55 moko 69: result.set_binary(true/*tainted*/, (finfo.post_data)?finfo.post_data:"" /*to distinguish from stat-ed file*/, finfo.post_size);
1.50 misha 70: return &result;
71: }
72:
1.40 misha 73: // $request:argv
1.39 misha 74: if(aname==REQUEST_ARGV_ELEMENT_NAME)
1.38 misha 75: return new VHash(fargv);
1.30 paf 76:
1.58 ! moko 77: //$request:headers
! 78: if(aname==REQUEST_HEADERS_ELEMENT_NAME){
! 79: if(!ffields.count())
! 80: fill();
! 81: return new VHash(ffields);
! 82: }
! 83:
! 84: // $request:query $request:uri $request:document-root $request:body $request:method
1.30 paf 85: const char* buf;
86: if(aname=="query")
87: buf=finfo.query_string;
88: else if(aname=="uri")
89: buf=finfo.uri;
90: else if(aname==DOCUMENT_ROOT_NAME)
91: buf=finfo.document_root;
1.43 misha 92: else if(aname=="body")
1.30 paf 93: buf=finfo.post_data;
1.58 ! moko 94: else if(aname=="method")
! 95: buf=finfo.method;
1.43 misha 96: else
1.30 paf 97: return bark("%s field not found", &aname);
1.12 paf 98:
1.45 misha 99: return new VString(*new String(buf, String::L_TAINTED));
1.1 paf 100: }
101:
1.56 moko 102: const VJunction* VRequest::put_element(const String& aname, Value* avalue) {
1.30 paf 103: // $charset
1.20 paf 104: if(aname==CHARSET_NAME) {
1.46 misha 105: fcharsets.set_source(charsets.get(avalue->as_string().change_case(UTF8_charset, String::CC_UPPER)));
1.33 paf 106: return PUT_ELEMENT_REPLACED_ELEMENT;
1.30 paf 107: }
108:
109: // $document-root
110: if(aname==DOCUMENT_ROOT_NAME) {
1.48 misha 111: finfo.document_root=avalue->as_string().taint_cstr(String::L_FILE_SPEC);
1.33 paf 112: return PUT_ELEMENT_REPLACED_ELEMENT;
1.30 paf 113: }
114:
1.56 moko 115: return Value::put_element(aname, avalue);
1.12 paf 116: }
1.58 ! moko 117:
! 118: void VRequest::fill(){
! 119: for(SAPI::Env::Iterator i(fsapi_info); i; i.next() ){
! 120: char* key=i.key();
! 121:
! 122: if(pa_strncasecmp(key, "HTTP_")==0) {
! 123: for(char* c=key+5; *c; c++)
! 124: *c=(char)toupper((unsigned char)*c);
! 125:
! 126: ffields.put(
! 127: key+5 /*skip "HTTP_" */,
! 128: new VString(*new String(i.value(), String::L_TAINTED))
! 129: );
! 130: }
! 131: }
! 132: }
E-mail: