2020-06-28 17:43:08 +00:00
|
|
|
#include "webfuse/impl/jsonrpc/request.h"
|
|
|
|
#include "webfuse/impl/jsonrpc/error.h"
|
2020-07-13 20:41:19 +00:00
|
|
|
#include "webfuse/impl/json/writer.h"
|
2020-07-16 20:36:12 +00:00
|
|
|
#include "webfuse/impl/json/node.h"
|
2020-07-13 20:41:19 +00:00
|
|
|
#include "webfuse/impl/jsonrpc/response_writer.h"
|
|
|
|
#include "webfuse/impl/message.h"
|
|
|
|
|
|
|
|
#include <libwebsockets.h>
|
2019-04-01 20:15:12 +00:00
|
|
|
#include <stdlib.h>
|
2019-02-09 02:08:02 +00:00
|
|
|
|
2020-03-01 15:55:58 +00:00
|
|
|
struct wf_jsonrpc_request
|
2019-02-09 02:08:02 +00:00
|
|
|
{
|
2020-07-13 20:41:19 +00:00
|
|
|
struct wf_jsonrpc_response_writer * writer;
|
2019-04-01 20:15:12 +00:00
|
|
|
int id;
|
2020-03-01 15:55:58 +00:00
|
|
|
wf_jsonrpc_send_fn * send;
|
2019-04-01 20:15:12 +00:00
|
|
|
void * user_data;
|
|
|
|
};
|
|
|
|
|
2020-02-29 01:32:03 +00:00
|
|
|
bool
|
2020-06-28 17:43:08 +00:00
|
|
|
wf_impl_jsonrpc_is_request(
|
2020-07-16 20:36:12 +00:00
|
|
|
struct wf_json const * message)
|
2019-04-01 20:15:12 +00:00
|
|
|
{
|
2020-07-16 20:36:12 +00:00
|
|
|
struct wf_json const * id = wf_impl_json_object_get(message, "id");
|
|
|
|
struct wf_json const * method = wf_impl_json_object_get(message, "method");
|
|
|
|
struct wf_json const * params = wf_impl_json_object_get(message, "params");
|
2019-04-01 20:15:12 +00:00
|
|
|
|
2020-07-16 20:36:12 +00:00
|
|
|
return ( (WF_JSON_TYPE_INT == wf_impl_json_type(id)) && (WF_JSON_TYPE_STRING == wf_impl_json_type(method)) &&
|
|
|
|
( (WF_JSON_TYPE_ARRAY == wf_impl_json_type(params)) || (WF_JSON_TYPE_OBJECT == wf_impl_json_type(params)) ));
|
2019-02-09 02:08:02 +00:00
|
|
|
}
|
2019-04-01 20:15:12 +00:00
|
|
|
|
|
|
|
|
2020-03-01 15:55:58 +00:00
|
|
|
struct wf_jsonrpc_request *
|
2020-06-28 17:43:08 +00:00
|
|
|
wf_impl_jsonrpc_request_create(
|
2019-04-01 20:15:12 +00:00
|
|
|
int id,
|
2020-03-01 15:55:58 +00:00
|
|
|
wf_jsonrpc_send_fn * send,
|
2019-04-01 20:15:12 +00:00
|
|
|
void * user_data)
|
|
|
|
{
|
2020-03-01 15:55:58 +00:00
|
|
|
struct wf_jsonrpc_request * request = malloc(sizeof(struct wf_jsonrpc_request));
|
2020-07-13 20:41:19 +00:00
|
|
|
request->writer = wf_impl_jsonrpc_response_writer_create(id);
|
2020-03-21 20:22:22 +00:00
|
|
|
request->id = id;
|
|
|
|
request->send = send;
|
|
|
|
request->user_data = user_data;
|
2019-04-01 20:15:12 +00:00
|
|
|
|
|
|
|
return request;
|
|
|
|
}
|
|
|
|
|
2020-02-29 01:32:03 +00:00
|
|
|
void
|
2020-06-28 17:43:08 +00:00
|
|
|
wf_impl_jsonrpc_request_dispose(
|
2020-03-01 15:55:58 +00:00
|
|
|
struct wf_jsonrpc_request * request)
|
2019-04-01 20:15:12 +00:00
|
|
|
{
|
2020-07-13 20:41:19 +00:00
|
|
|
wf_impl_jsonrpc_response_writer_dispose(request->writer);
|
2019-04-01 20:15:12 +00:00
|
|
|
free(request);
|
|
|
|
}
|
|
|
|
|
2020-02-29 01:32:03 +00:00
|
|
|
void *
|
2020-06-28 17:43:08 +00:00
|
|
|
wf_impl_jsonrpc_request_get_userdata(
|
2020-03-01 15:55:58 +00:00
|
|
|
struct wf_jsonrpc_request * request)
|
2019-04-01 20:15:12 +00:00
|
|
|
{
|
|
|
|
return request->user_data;
|
|
|
|
}
|
|
|
|
|
2020-07-13 20:41:19 +00:00
|
|
|
struct wf_jsonrpc_response_writer *
|
|
|
|
wf_impl_jsonrpc_request_get_response_writer(
|
|
|
|
struct wf_jsonrpc_request * request)
|
|
|
|
{
|
|
|
|
return request->writer;
|
|
|
|
}
|
|
|
|
|
2019-04-01 20:15:12 +00:00
|
|
|
|
2020-02-29 01:32:03 +00:00
|
|
|
void
|
2020-06-28 17:43:08 +00:00
|
|
|
wf_impl_jsonrpc_respond(
|
2020-07-13 20:41:19 +00:00
|
|
|
struct wf_jsonrpc_request * request)
|
2019-04-01 20:15:12 +00:00
|
|
|
{
|
2020-07-13 20:41:19 +00:00
|
|
|
struct wf_message * response = wf_impl_jsonrpc_response_writer_take_message(request->writer);
|
2019-04-01 20:15:12 +00:00
|
|
|
|
|
|
|
request->send(response, request->user_data);
|
2020-06-28 17:43:08 +00:00
|
|
|
wf_impl_jsonrpc_request_dispose(request);
|
2019-04-01 20:15:12 +00:00
|
|
|
}
|
|
|
|
|
2020-06-28 17:43:08 +00:00
|
|
|
void wf_impl_jsonrpc_respond_error(
|
2020-03-01 15:55:58 +00:00
|
|
|
struct wf_jsonrpc_request * request,
|
2020-02-29 01:32:03 +00:00
|
|
|
int code,
|
|
|
|
char const * message)
|
2019-04-01 20:15:12 +00:00
|
|
|
{
|
2020-07-13 20:41:19 +00:00
|
|
|
struct wf_json_writer * writer = wf_impl_json_writer_create(128, LWS_PRE);
|
|
|
|
wf_impl_json_write_object_begin(writer);
|
|
|
|
wf_impl_json_write_object_begin_object(writer, "error");
|
|
|
|
wf_impl_json_write_object_int(writer, "code", code);
|
|
|
|
wf_impl_json_write_object_string(writer, "message", message);
|
|
|
|
wf_impl_json_write_object_end(writer);
|
|
|
|
wf_impl_json_write_object_int(writer, "id", request->id);
|
|
|
|
wf_impl_json_write_object_end(writer);
|
2019-04-01 20:15:12 +00:00
|
|
|
|
2020-07-13 20:41:19 +00:00
|
|
|
size_t length;
|
|
|
|
char * data = wf_impl_json_writer_take(writer, &length);
|
|
|
|
wf_impl_json_writer_dispose(writer);
|
|
|
|
|
|
|
|
struct wf_message * response = wf_impl_message_create(data, length);
|
2019-04-01 20:15:12 +00:00
|
|
|
request->send(response, request->user_data);
|
2020-07-13 20:41:19 +00:00
|
|
|
|
2020-06-28 17:43:08 +00:00
|
|
|
wf_impl_jsonrpc_request_dispose(request);
|
2019-04-01 20:15:12 +00:00
|
|
|
}
|