/** Common part of request parser, usually after JSON representation is made available in req->params * @param req the request * @param leave leave the req->params */ static bool common(struct req *req, bool leave) { ut *ut; /* guarantee that req->params is ok */ if (!ut_ok(req->params)) { req->reply = req->params; req->params = NULL; return false; } else if (ut_type(req->params) != T_HASH) { return errcode(JSON_RPC_INVALID_REQUEST); } /* JSON-RPC argument check */ if ((ut = uth_get(req->params, "service"))) /* used by Qooxdoo */ req->service = ut_char(ut); if ((ut = uth_get(req->params, "method"))) req->method = ut_char(ut); if ((ut = uth_get(req->params, "id"))) req->id = ut_char(ut); /* XXX: dont check jsonrpc=2.0 */ if (!leave) { if ((ut = uth_get(req->params, "params"))) req->params = ut; else req->params = uth_set_thash(req->params, "params", NULL); /* create empty hash */ if (ut_is_tlist(req->params) && thash_get(req->http.headers, "X-Qooxdoo-Response-Type")) { tlist *tl = ut_tlist(req->params); req->params = tlist_shift(tl); } } return true; }
/** Parse config file part passed as unitype object * @retval 0 success * @retval 1 error */ static int parse_config_ut(struct mg *mg, ut *cfg) { thash *t; char *key, *key2; ut *subcfg; int num1, num2; t = ut_thash(cfg); /* parse global config */ thash_iter_loop(t, key, subcfg) { if (isdigit(key[0])) continue; if (streq(key, "id")) { mg->options.myid = ut_int(subcfg); } else if (streq(key, "stats")) { mg->options.stats = ut_int(subcfg); } else if (streq(key, "sync")) { mg->options.sync = ut_int(subcfg); } else if (streq(key, "root")) { mg->options.stats_root = ut_char(subcfg); } else if (streq(key, "session")) { mg->options.stats_sess = ut_char(subcfg); } else if (streq(key, "dump")) { mg->options.dump = ut_bool(subcfg); } else if (streq(key, "dump-size")) { mg->options.dumpsize = ut_int(subcfg); } else if (streq(key, "dump-beacons")) { mg->options.dumpb = ut_bool(subcfg); } else if (streq(key, "svc-ifname")) { mg->options.svc_ifname = ut_char(subcfg); } else { dbg(0, "unrecognized configuration file option: %s\n", key); return 1; } } /* parse per-node config */ thash_iter_loop(t, key, subcfg) { if (!(isdigit(key[0]) && ut_type(subcfg) == T_HASH)) continue; /* parse list consisting of ranges and lists of ids */ while (isdigit(key[0])) { num1 = strtol(key, &key2, 10); if (key2[0] == '-') { /* range */ num2 = strtol(key2+1, &key, 10); key++; } else if (key2[0] == ',') { /* list */ num2 = 0; key = key2 + 1; } else { /* single */ num2 = 0; key = key2; } /* if its for me... */ if (mg->options.myid == num1 || (num2 > 0 && (mg->options.myid >= num1 && mg->options.myid <= num2))) { parse_config_ut(mg, subcfg); } } } return 0; }