|
|
| 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=¶ms[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 |