|
|
| version 1.166, 2008/07/18 09:12:17 | version 1.170, 2009/04/10 11:31:06 |
|---|---|
| Line 1 | Line 1 |
| /** @file | /** @file |
| Parser: @b string parser class. | Parser: @b string parser class. |
| Copyright (c) 2001-2005 ArtLebedev Group (http://www.artlebedev.com) | Copyright (c) 2001-2009 ArtLebedev Group (http://www.artlebedev.com) |
| Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) | Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) |
| */ | */ |
| Line 360 static void replace_action(Table& table, | Line 360 static void replace_action(Table& table, |
| *ai.dest << ai.src->mid(poststart, postfinish); | *ai.dest << ai.src->mid(poststart, postfinish); |
| } | } |
| /// @todo use pcre:study somehow | /// @todo use pcre_study somehow |
| static void _match(Request& r, MethodParams& params) { | static void _match(Request& r, MethodParams& params) { |
| Value& regexp=params.as_no_junction(0, "regexp must not be code"); | Value& regexp=params.as_no_junction(0, "regexp must not be code"); |
| Line 639 static void _append(Request& r, MethodPa | Line 639 static void _append(Request& r, MethodPa |
| static void _base64(Request& r, MethodParams& params) { | static void _base64(Request& r, MethodParams& params) { |
| if(params.count()) { | if(params.count()) { |
| // decode | // decode: ^string:base64[encoded] |
| const char* cstr=params.as_string(0, PARAMETER_MUST_BE_STRING).cstr(); | const char* cstr=params.as_string(0, PARAMETER_MUST_BE_STRING).cstr(); |
| char* decoded_cstr=0; | char* decoded=0; |
| size_t decoded_size=0; | size_t length=0; |
| pa_base64_decode(cstr, strlen(cstr), decoded_cstr, decoded_size); | pa_base64_decode(cstr, strlen(cstr), decoded, length); |
| if(decoded_cstr && decoded_size) | if(decoded && length){ |
| r.write_assign_lang(*new String(decoded_cstr, decoded_size, true)); | if(memchr((const char*)decoded, 0, length)) |
| throw Exception(PARSER_RUNTIME, | |
| 0, | |
| "Invalid \\x00 character found while decode to string. Decode it to file instead."); | |
| fix_line_breaks(decoded, length); | |
| if(length){ | |
| r.write_assign_lang(*new String(decoded, length, true/*tainted*/)); | |
| } | |
| } | |
| } else { | } else { |
| // encode | // encode: ^str.base64[] |
| VString& self=GET_SELF(r, VString); | VString& self=GET_SELF(r, VString); |
| const char* cstr=self.string().cstr(); | const char* cstr=self.string().cstr(); |
| const char* encoded=pa_base64_encode(cstr, strlen(cstr)); | const char* encoded=pa_base64_encode(cstr, strlen(cstr)); |
| r.write_assign_lang(*new String(encoded, 0, true/*once ?param=base64(something) was needed*/)); | r.write_assign_lang(*new String(encoded, 0, true/*tainted. once ?param=base64(something) was needed*/)); |
| } | } |
| } | } |
| static void _escape(Request& r, MethodParams&){ | |
| const String& src=GET_SELF(r, VString).string(); | |
| r.write_assign_lang(src.escape(r.charsets.source())); | |
| } | |
| static void _unescape(Request& r, MethodParams& params){ | |
| const String& src=params.as_string(0, PARAMETER_MUST_BE_STRING); | |
| if(const char* result=unescape_chars(src.cstr(), src.length(), &r.charsets.source(), true/* don't unescape '+' char */)) | |
| r.write_assign_lang(*new String(result)); | |
| } | |
| // constructor | // constructor |
| MString::MString(): Methoded("string") { | MString::MString(): Methoded("string") { |
| Line 727 MString::MString(): Methoded("string") { | Line 747 MString::MString(): Methoded("string") { |
| // ^string.base64[] << encode | // ^string.base64[] << encode |
| // ^string:base64[encoded string] << decode | // ^string:base64[encoded string] << decode |
| add_native_method("base64", Method::CT_ANY, _base64, 0, 1); | add_native_method("base64", Method::CT_ANY, _base64, 0, 1); |
| // ^string.js-escape[] | |
| // ^string:js-unescape[escaped%uXXXXstring] | |
| add_native_method("js-escape", Method::CT_ANY, _escape, 0, 0); | |
| add_native_method("js-unescape", Method::CT_STATIC, _unescape, 1, 1); | |
| } | } |