static int rpc_sum(char *buf, int len, struct ns_rpc_request *req) { double sum = 0; int i; if (req->params[0].type != JSON_TYPE_ARRAY) { return ns_rpc_create_std_error(buf, len, req, JSON_RPC_INVALID_PARAMS_ERROR); } for (i = 0; i < req->params[0].num_desc; i++) { if (req->params[i + 1].type != JSON_TYPE_NUMBER) { return ns_rpc_create_std_error(buf, len, req, JSON_RPC_INVALID_PARAMS_ERROR); } sum += strtod(req->params[i + 1].ptr, NULL); } return ns_rpc_create_reply(buf, len, req, "f", sum); }
/* * Dispatches a JSON-RPC request. * * Parses JSON-RPC request contained in `buf`, `len`. Then, dispatches the *request * to the correct handler method. Valid method names should be specified in NULL * terminated array `methods`, and corresponding handlers in `handlers`. * Result is put in `dst`, `dst_len`. Return: length of the result, which * can be larger then `dst_len` that indicates an overflow. */ int ns_rpc_dispatch(const char *buf, int len, char *dst, int dst_len, const char **methods, ns_rpc_handler_t *handlers) { struct json_token tokens[200]; struct ns_rpc_request req; int i, n; memset(&req, 0, sizeof(req)); n = parse_json(buf, len, tokens, sizeof(tokens) / sizeof(tokens[0])); if (n <= 0) { int err_code = (n == JSON_STRING_INVALID) ? JSON_RPC_PARSE_ERROR : JSON_RPC_SERVER_ERROR; return ns_rpc_create_std_error(dst, dst_len, &req, err_code); } req.message = tokens; req.id = find_json_token(tokens, "id"); req.method = find_json_token(tokens, "method"); req.params = find_json_token(tokens, "params"); if (req.id == NULL || req.method == NULL) { return ns_rpc_create_std_error(dst, dst_len, &req, JSON_RPC_INVALID_REQUEST_ERROR); } for (i = 0; methods[i] != NULL; i++) { int mlen = strlen(methods[i]); if (mlen == req.method->len && memcmp(methods[i], req.method->ptr, mlen) == 0) break; } if (methods[i] == NULL) { return ns_rpc_create_std_error(dst, dst_len, &req, JSON_RPC_METHOD_NOT_FOUND_ERROR); } return handlers[i](dst, dst_len, &req); }