Diff for /parser3/src/classes/json.C between versions 1.35 and 1.43

version 1.35, 2015/07/22 18:29:09 version 1.43, 2016/07/20 13:57:04
Line 1 Line 1
 /** @file  /** @file
         Parser: @b json parser class.          Parser: @b json parser class.
   
         Copyright (c) 2000-2012 Art. Lebedev Studio (http://www.artlebedev.com)          Copyright (c) 2000-2015 Art. Lebedev Studio (http://www.artlebedev.com)
 */  */
   
 #include "classes.h"  #include "classes.h"
Line 29  public: Line 29  public:
   
 // global variable  // global variable
   
 DECLARE_CLASS_VAR(json, new MJson, 0);  DECLARE_CLASS_VAR(json, new MJson);
   
 // methods  // methods
 struct Json {  struct Json {
Line 97  String* json_string(Json *json, const ch Line 97  String* json_string(Json *json, const ch
         String::C result = json->charset !=NULL ?           String::C result = json->charset !=NULL ? 
                 Charset::transcode(String::C(value, length), UTF8_charset, *json->charset) :                  Charset::transcode(String::C(value, length), UTF8_charset, *json->charset) :
                 String::C(pa_strdup(value, length), length);                  String::C(pa_strdup(value, length), length);
         return new String(result.str, json->taint, result.length);          return new String(result, json->taint);
 }  }
   
 static Value *json_hook(Request &r, Junction *hook, String* key, Value* value){  static Value *json_hook(Request &r, Junction *hook, String* key, Value* value){
Line 343  static void _parse(Request& r, MethodPar Line 343  static void _parse(Request& r, MethodPar
         if(int result = json_parser_init(&parser, &config, (json_parser_callback)&json_callback, &json))          if(int result = json_parser_init(&parser, &config, (json_parser_callback)&json_callback, &json))
                 throw Exception("json.parse", 0, "%s", json_error_message(result));                  throw Exception("json.parse", 0, "%s", json_error_message(result));
   
           if(!*json_cstr)
                   throw Exception("json.parse", 0, "empty string is not valid json");
   
           const char *first_quote=strchr(json_cstr,'"');
           if(first_quote && first_quote>json_cstr && *(--first_quote) == '\\')
                   json_exception_with_source(r, "illegal quote escape, json may be tainted", json_cstr, first_quote-json_cstr);
   
         uint32_t processed;          uint32_t processed;
         if(int result = json_parser_string(&parser, json_cstr, strlen(json_cstr), &processed))          if(int result = json_parser_string(&parser, json_cstr, strlen(json_cstr), &processed))
                 json_exception_with_source(r, json_error_message(result), json_cstr, processed);                  json_exception_with_source(r, json_error_message(result), json_cstr, processed);
Line 383  public: Line 390  public:
   
 const String& value_json_string(String::Body key, Value& v, Json_options& options);  const String& value_json_string(String::Body key, Value& v, Json_options& options);
   
 const String* Json_options::hash_json_string(HashStringValue &hash) {  const String* Json_options::hash_json_string(HashStringValue *hash) {
         if(!hash.count())          if(!hash || !hash->count())
                 return new String("{}", String::L_AS_IS);                  return new String("{}", String::L_AS_IS);
   
         Json_string_recoursion go_down(*this);          Json_string_recoursion go_down(*this);
Line 395  const String* Json_options::hash_json_st Line 402  const String* Json_options::hash_json_st
   
                 String *delim=NULL;                  String *delim=NULL;
                 indent=get_indent(json_string_recoursion);                  indent=get_indent(json_string_recoursion);
                 for(HashStringValue::Iterator i(hash); i; i.next() ){                  for(HashStringValue::Iterator i(*hash); i; i.next() ){
                         if (delim){                          if (delim){
                                 result << *delim;                                  result << *delim;
                         } else {                          } else {
Line 409  const String* Json_options::hash_json_st Line 416  const String* Json_options::hash_json_st
         } else {          } else {
   
                 bool need_delim=false;                  bool need_delim=false;
                 for(HashStringValue::Iterator i(hash); i; i.next() ){                  for(HashStringValue::Iterator i(*hash); i; i.next() ){
                         result << (need_delim ? ",\n\"" : "\"");                          result << (need_delim ? ",\n\"" : "\"");
                         result << String(i.key(), String::L_JSON) << "\":" << value_json_string(i.key(), *i.value(), *this);                          result << String(i.key(), String::L_JSON) << "\":" << value_json_string(i.key(), *i.value(), *this);
                         need_delim=true;                          need_delim=true;
Line 470  static void _string(Request& r, MethodPa Line 477  static void _string(Request& r, MethodPa
                                 } else if(key == "date" && value->is_string()){                                  } else if(key == "date" && value->is_string()){
                                         const String& svalue=value->as_string();                                          const String& svalue=value->as_string();
                                         if(!json.set_date_format(svalue))                                          if(!json.set_date_format(svalue))
                                                 throw Exception(PARSER_RUNTIME, &svalue, "must be 'sql-string', 'gmt-string' or 'unix-timestamp'");                                                  throw Exception(PARSER_RUNTIME, &svalue, "must be 'sql-string', 'gmt-string', 'iso-string' or 'unix-timestamp'");
                                         valid_options++;                                          valid_options++;
                                 } else if(key == "indent"){                                  } else if(key == "indent"){
                                         if(value->is_string()){                                          if(value->is_string()){
Line 511  static void _string(Request& r, MethodPa Line 518  static void _string(Request& r, MethodPa
                                 throw Exception(PARSER_RUNTIME, 0, CALLED_WITH_INVALID_OPTION);                                  throw Exception(PARSER_RUNTIME, 0, CALLED_WITH_INVALID_OPTION);
   
                         // special handling for $._default                           // special handling for $._default 
                         if(VHash* vhash=static_cast<VHash*>(params[1].as(VHASH_TYPE)))                          if(VHashBase* vhash=static_cast<VHashBase*>(params[1].as(VHASH_TYPE)))
                                 if(Value* value=vhash->get_default()) {                                  if(Value* value=vhash->get_default()) {
                                         if(!value->is_string()){                                          if(!value->is_string()){
                                         Junction* junction=value->get_junction();                                                  Junction* junction=value->get_junction();
                                         if(!junction || !junction->method || !junction->method->params_names || junction->method->params_names->count() != 3)                                                  if(!junction || !junction->method || !junction->method->params_names || junction->method->params_names->count() != 3)
                                                         throw Exception(PARSER_RUNTIME, 0, "$.%s must be string or parser method with 3 parameters", HASH_DEFAULT_ELEMENT_NAME);                                                          throw Exception(PARSER_RUNTIME, 0, "$._default must be string or parser method with 3 parameters");
                                         }                                          }
                                         json.default_method=value;                                          json.default_method=value;
                                 }                                  }

Removed from v.1.35  
changed lines
  Added in v.1.43


E-mail: