Diff for /parser3/src/classes/json.C between versions 1.40 and 1.48

version 1.40, 2015/10/26 01:21:54 version 1.48, 2016/11/01 23:10:40
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 95  static void set_json_value(Json *json, V Line 95  static void set_json_value(Json *json, V
   
 String* json_string(Json *json, const char *value, uint32_t length){  String* json_string(Json *json, const char *value, uint32_t length){
         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), pa_UTF8_charset, *json->charset) :
                 String::C(pa_strdup(value, length), length);                  String::C(pa_strdup(value, length), length);
         return new String(result, json->taint);          return new String(result, json->taint);
 }  }
Line 107  static Value *json_hook(Request &r, Junc Line 107  static Value *json_hook(Request &r, Junc
         frame.store_params(params, 2);          frame.store_params(params, 2);
         r.execute_method(frame);          r.execute_method(frame);
   
         return &frame.result().as_value();          return &frame.result();
 }  }
   
 static int json_callback(Json *json, int type, const char *value, uint32_t length)  static int json_callback(Json *json, int type, const char *value, uint32_t length)
Line 297  static void _parse(Request& r, MethodPar Line 297  static void _parse(Request& r, MethodPar
                 if(HashStringValue* options=params.as_hash(1)) {                  if(HashStringValue* options=params.as_hash(1)) {
                         int valid_options=0;                          int valid_options=0;
                         if(Value* value=options->get("depth")) {                          if(Value* value=options->get("depth")) {
                                 config.max_nesting=r.process_to_value(*value).as_int();                                  config.max_nesting=r.process(*value).as_int();
                                 valid_options++;                                  valid_options++;
                         }                          }
                         if(Value* value=options->get("double")) {                          if(Value* value=options->get("double")) {
                                 json.handle_double=r.process_to_value(*value).as_bool();                                  json.handle_double=r.process(*value).as_bool();
                                 valid_options++;                                  valid_options++;
                         }                          }
                         if(Value* value=options->get("int")) {                          if(Value* value=options->get("int")) {
                                 json.handle_int=r.process_to_value(*value).as_bool();                                  json.handle_int=r.process(*value).as_bool();
                                 valid_options++;                                  valid_options++;
                         }                          }
                         if(Value* value=options->get("distinct")) {                          if(Value* value=options->get("distinct")) {
Line 337  static void _parse(Request& r, MethodPar Line 337  static void _parse(Request& r, MethodPar
                 }                  }
   
         const String::Body json_body = json_string.cstr_to_string_body_untaint(String::L_JSON, r.connection(false), &r.charsets);          const String::Body json_body = json_string.cstr_to_string_body_untaint(String::L_JSON, r.connection(false), &r.charsets);
         const char *json_cstr = json.charset != NULL ? Charset::transcode(json_body, *json.charset, UTF8_charset).cstr() : json_body.cstr();          const char *json_cstr = json.charset != NULL ? Charset::transcode(json_body, *json.charset, pa_UTF8_charset).cstr() : json_body.cstr();
   
         json_parser parser;          json_parser parser;
         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))
Line 359  static void _parse(Request& r, MethodPar Line 359  static void _parse(Request& r, MethodPar
   
         json_parser_free(&parser);          json_parser_free(&parser);
   
         if (json.result) r.write_no_lang(*json.result);          if (json.result) r.write(*json.result);
 }  }
   
 const uint ANTI_ENDLESS_JSON_STRING_RECOURSION=128;  const uint ANTI_ENDLESS_JSON_STRING_RECOURSION=128;
Line 464  static void _string(Request& r, MethodPa Line 464  static void _string(Request& r, MethodPa
   
         if(params.count() == 2)          if(params.count() == 2)
                 if(HashStringValue* options=params.as_hash(1)) {                  if(HashStringValue* options=params.as_hash(1)) {
                         json.params=params.get(1);                          json.params=&params[1];
                         HashStringValue* methods=new HashStringValue();                          HashStringValue* methods=new HashStringValue();
                         int valid_options=0;                          int valid_options=0;
                         HashStringValue* vvalue;                          HashStringValue* vvalue;
Line 472  static void _string(Request& r, MethodPa Line 472  static void _string(Request& r, MethodPa
                                 String::Body key=i.key();                                  String::Body key=i.key();
                                 Value* value=i.value();                                  Value* value=i.value();
                                 if(key == "skip-unknown"){                                  if(key == "skip-unknown"){
                                         json.skip_unknown=r.process_to_value(*value).as_bool();                                          json.skip_unknown=r.process(*value).as_bool();
                                         valid_options++;                                          valid_options++;
                                 } 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();
Line 483  static void _string(Request& r, MethodPa Line 483  static void _string(Request& r, MethodPa
                                         if(value->is_string()){                                          if(value->is_string()){
                                                 json.indent=value->as_string().cstr();                                                  json.indent=value->as_string().cstr();
                                                 json.json_string_recoursion=strlen(json.indent);                                                  json.json_string_recoursion=strlen(json.indent);
                                         } else json.indent=r.process_to_value(*value).as_bool() ? "" : NULL;                                          } else json.indent=r.process(*value).as_bool() ? "" : NULL;
                                         valid_options++;                                          valid_options++;
                                 } else if(key == "table" && value->is_string()){                                  } else if(key == "table" && value->is_string()){
                                         const String& svalue=value->as_string();                                          const String& svalue=value->as_string();
Line 518  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;
                                 }                                  }
Line 532  static void _string(Request& r, MethodPa Line 532  static void _string(Request& r, MethodPa
                                 json.methods=methods;                                  json.methods=methods;
                 }                  }
   
         const String& result_string=value_json_string(String::Body(), r.process_to_value(params[0]), json);          const String& result_string=value_json_string(String::Body(), r.process(params[0]), json);
         String::Body result_body=result_string.cstr_to_string_body_untaint(String::L_JSON, r.connection(false), &r.charsets);          String::Body result_body=result_string.cstr_to_string_body_untaint(String::L_JSON, r.connection(false), &r.charsets);
         r.write_pass_lang(*new String(result_body, String::L_AS_IS));          r.write(*new String(result_body, String::L_AS_IS));
  }   }
   
 // constructor  // constructor

Removed from v.1.40  
changed lines
  Added in v.1.48


E-mail: