Change-Id: I7100961ef8f8a75d623a0667178f191dd4cfb9d3
Signed-off-by: Jose Bollo <jose.bollo@iot.bzh>
int rc;
struct dbus_memo *memo;
const char *json, *error, *info;
int rc;
struct dbus_memo *memo;
const char *json, *error, *info;
+ struct json_object *object;
+ enum json_tokener_error jerr;
/* retrieve the recorded data */
memo = userdata;
/* retrieve the recorded data */
memo = userdata;
afb_xreq_reply(memo->xreq, NULL, "error", "dbus error");
} else {
/* report the answer */
afb_xreq_reply(memo->xreq, NULL, "error", "dbus error");
} else {
/* report the answer */
- afb_xreq_reply(memo->xreq, *json ? json_tokener_parse(json) : NULL, *error ? error : NULL, *info ? info : NULL);
+ if (!*json)
+ object = NULL;
+ else {
+ object = json_tokener_parse_verbose(json, &jerr);
+ if (jerr != json_tokener_success)
+ object = json_object_new_string(json);
+ }
+ afb_xreq_reply(memo->xreq, object, *error ? error : NULL, *info ? info : NULL);
}
api_dbus_client_memo_destroy(memo);
return 1;
}
api_dbus_client_memo_destroy(memo);
return 1;
{
struct json_object *object;
const char *event, *data;
{
struct json_object *object;
const char *event, *data;
+ enum json_tokener_error jerr;
int rc = sd_bus_message_read(m, "ss", &event, &data);
if (rc < 0)
ERROR("unreadable broadcasted event");
else {
int rc = sd_bus_message_read(m, "ss", &event, &data);
if (rc < 0)
ERROR("unreadable broadcasted event");
else {
- object = json_tokener_parse(data);
+ object = json_tokener_parse_verbose(data, &jerr);
+ if (jerr != json_tokener_success)
+ object = json_object_new_string(data);
afb_evt_broadcast(event, object);
}
return 1;
afb_evt_broadcast(event, object);
}
return 1;
{
struct json_object *object;
struct dbus_event *ev;
{
struct json_object *object;
struct dbus_event *ev;
+ enum json_tokener_error jerr;
/* retrieves the event */
ev = api_dbus_client_event_search(api, id, name);
/* retrieves the event */
ev = api_dbus_client_event_search(api, id, name);
}
/* destroys the event */
}
/* destroys the event */
- object = json_tokener_parse(data);
+ object = json_tokener_parse_verbose(data, &jerr);
+ if (jerr != json_tokener_success)
+ object = json_object_new_string(data);
afb_evt_event_x2_push(ev->event, object);
}
afb_evt_event_x2_push(ev->event, object);
}
uint32_t flags;
struct afb_session *session;
struct listener *listener;
uint32_t flags;
struct afb_session *session;
struct listener *listener;
+ enum json_tokener_error jerr;
/* check the interface */
if (strcmp(sd_bus_message_get_interface(message), api->name) != 0)
/* check the interface */
if (strcmp(sd_bus_message_get_interface(message), api->name) != 0)
dreq->xreq.context.flags = flags;
dreq->xreq.cred = afb_cred_mixed_on_behalf_import(listener->origin->cred, uuid, creds && creds[0] ? creds : NULL);
dreq->message = sd_bus_message_ref(message);
dreq->xreq.context.flags = flags;
dreq->xreq.cred = afb_cred_mixed_on_behalf_import(listener->origin->cred, uuid, creds && creds[0] ? creds : NULL);
dreq->message = sd_bus_message_ref(message);
- dreq->json = json_tokener_parse(dreq->request);
- if (dreq->json == NULL && strcmp(dreq->request, "null")) {
+ dreq->json = json_tokener_parse_verbose(dreq->request, &jerr);
+ if (jerr != json_tokener_success) {
/* lazy error detection of json request. Is it to improve? */
dreq->json = json_object_new_string(dreq->request);
}
/* lazy error detection of json request. Is it to improve? */
dreq->json = json_object_new_string(dreq->request);
}
char buffer[256];
const struct afb_verb_v2 *verb;
struct json_object *r, *f, *a, *i, *p, *g;
char buffer[256];
const struct afb_verb_v2 *verb;
struct json_object *r, *f, *a, *i, *p, *g;
+ enum json_tokener_error jerr;
if (binding->specification) {
if (binding->specification) {
- r = json_tokener_parse(binding->specification);
- if (r)
+ r = json_tokener_parse_verbose(binding->specification, &jerr);
+ if (jerr == json_tokener_success)
struct afb_hsrv *hsrv;
struct hsrv_handler *iter;
const char *type;
struct afb_hsrv *hsrv;
struct hsrv_handler *iter;
const char *type;
+ enum json_tokener_error jerr;
hsrv = cls;
hreq = *recordreq;
hsrv = cls;
hreq = *recordreq;
}
} else if (hreq->tokener) {
hreq->json = json_tokener_parse_ex(hreq->tokener, upload_data, (int)*upload_data_size);
}
} else if (hreq->tokener) {
hreq->json = json_tokener_parse_ex(hreq->tokener, upload_data, (int)*upload_data_size);
- switch (json_tokener_get_error(hreq->tokener)) {
- case json_tokener_success:
- case json_tokener_continue:
- break;
- default:
- ERROR("error in POST json: %s", json_tokener_error_desc(json_tokener_get_error(hreq->tokener)));
+ jerr = json_tokener_get_error(hreq->tokener);
+ if (jerr == json_tokener_continue) {
+ hreq->json = json_tokener_parse_ex(hreq->tokener, "", 1);
+ jerr = json_tokener_get_error(hreq->tokener);
+ }
+ if (jerr != json_tokener_success) {
+ ERROR("error in POST json: %s", json_tokener_error_desc(jerr));
afb_hreq_reply_error(hreq, MHD_HTTP_BAD_REQUEST);
return MHD_YES;
}
afb_hreq_reply_error(hreq, MHD_HTTP_BAD_REQUEST);
return MHD_YES;
}
{
const char *string;
struct json_object *o;
{
const char *string;
struct json_object *o;
+ enum json_tokener_error jerr;
int rc = readbuf_string(rb, &string, NULL);
if (rc) {
int rc = readbuf_string(rb, &string, NULL);
if (rc) {
- o = json_tokener_parse(string);
- if (o == NULL && strcmp(string, "null"))
+ o = json_tokener_parse_verbose(string, &jerr);
+ if (jerr != json_tokener_success)
o = json_object_new_string(string);
*object = o;
}
o = json_object_new_string(string);
*object = o;
}
struct json_object *afb_wsj1_msg_object_j(struct afb_wsj1_msg *msg)
{
struct json_object *afb_wsj1_msg_object_j(struct afb_wsj1_msg *msg)
{
+ enum json_tokener_error jerr;
struct json_object *object = msg->object_j;
if (object == NULL) {
pthread_mutex_lock(&msg->wsj1->mutex);
json_tokener_reset(msg->wsj1->tokener);
struct json_object *object = msg->object_j;
if (object == NULL) {
pthread_mutex_lock(&msg->wsj1->mutex);
json_tokener_reset(msg->wsj1->tokener);
- object = json_tokener_parse_ex(msg->wsj1->tokener, msg->object_s, (int)msg->object_s_length);
- if (object == NULL && json_tokener_get_error(msg->wsj1->tokener) == json_tokener_continue)
- object = json_tokener_parse_ex(msg->wsj1->tokener, "", 1);
+ object = json_tokener_parse_ex(msg->wsj1->tokener, msg->object_s, 1 + (int)msg->object_s_length);
+ jerr = json_tokener_get_error(msg->wsj1->tokener);
pthread_mutex_unlock(&msg->wsj1->mutex);
pthread_mutex_unlock(&msg->wsj1->mutex);
+ if (jerr != json_tokener_success) {
/* lazy error detection of json request. Is it to improve? */
object = json_object_new_string_len(msg->object_s, (int)msg->object_s_length);
}
/* lazy error detection of json request. Is it to improve? */
object = json_object_new_string_len(msg->object_s, (int)msg->object_s_length);
}
char *key;
int rc;
struct json_object *o;
char *key;
int rc;
struct json_object *o;
+ enum json_tokener_error jerr;
/* allocates an id for the request */
rc = asprintf(&key, "%d:%s", ++num, verb);
/* allocates an id for the request */
rc = asprintf(&key, "%d:%s", ++num, verb);
/* send the request */
callcount++;
/* send the request */
callcount++;
- if (object == NULL || object[0] == 0 || !strcmp(object, "null"))
+ if (object == NULL || object[0] == 0)
- o = json_tokener_parse(object);
- if (!o)
+ o = json_tokener_parse_verbose(object, &jerr);
+ if (jerr != json_tokener_success)
o = json_object_new_string(object);
}
rc = afb_proto_ws_client_call(pws, verb, o, sessionid, key, NULL);
o = json_object_new_string(object);
}
rc = afb_proto_ws_client_call(pws, verb, o, sessionid, key, NULL);
static void startup_call_current(struct startup_req *sreq)
{
const char *api, *verb, *json;
static void startup_call_current(struct startup_req *sreq)
{
const char *api, *verb, *json;
+ enum json_tokener_error jerr;
sreq->callspec = json_object_get_string(json_object_array_get_idx(sreq->calls, sreq->index)),
api = sreq->callspec;
sreq->callspec = json_object_get_string(json_object_array_get_idx(sreq->calls, sreq->index)),
api = sreq->callspec;
sreq->verb = strndup(verb + 1, json - verb - 1);
sreq->xreq.request.called_api = sreq->api;
sreq->xreq.request.called_verb = sreq->verb;
sreq->verb = strndup(verb + 1, json - verb - 1);
sreq->xreq.request.called_api = sreq->api;
sreq->xreq.request.called_verb = sreq->verb;
- sreq->xreq.json = json_tokener_parse(json + 1);
- if (sreq->api && sreq->verb && sreq->xreq.json) {
+ sreq->xreq.json = json_tokener_parse_verbose(json + 1, &jerr);
+ if (sreq->api && sreq->verb && jerr == json_tokener_success) {
afb_xreq_process(&sreq->xreq, main_apiset);
return;
}
afb_xreq_process(&sreq->xreq, main_apiset);
return;
}