1
0
mirror of https://github.com/falk-werner/webfuse synced 2024-10-27 20:34:10 +00:00
falk-werner_webfuse/lib/webfuse/impl/jsonrpc/request.c

103 lines
2.9 KiB
C
Raw Normal View History

#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"
#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>
#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;
int id;
2020-03-01 15:55:58 +00:00
wf_jsonrpc_send_fn * send;
void * user_data;
};
2020-02-29 01:32:03 +00:00
bool
wf_impl_jsonrpc_is_request(
struct wf_json const * message)
{
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");
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
}
2020-03-01 15:55:58 +00:00
struct wf_jsonrpc_request *
wf_impl_jsonrpc_request_create(
int id,
2020-03-01 15:55:58 +00:00
wf_jsonrpc_send_fn * send,
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);
request->id = id;
request->send = send;
request->user_data = user_data;
return request;
}
2020-02-29 01:32:03 +00:00
void
wf_impl_jsonrpc_request_dispose(
2020-03-01 15:55:58 +00:00
struct wf_jsonrpc_request * request)
{
2020-07-13 20:41:19 +00:00
wf_impl_jsonrpc_response_writer_dispose(request->writer);
free(request);
}
2020-02-29 01:32:03 +00:00
void *
wf_impl_jsonrpc_request_get_userdata(
2020-03-01 15:55:58 +00:00
struct wf_jsonrpc_request * request)
{
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;
}
2020-02-29 01:32:03 +00:00
void
wf_impl_jsonrpc_respond(
2020-07-13 20:41:19 +00:00
struct wf_jsonrpc_request * request)
{
2020-07-13 20:41:19 +00:00
struct wf_message * response = wf_impl_jsonrpc_response_writer_take_message(request->writer);
request->send(response, request->user_data);
wf_impl_jsonrpc_request_dispose(request);
}
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)
{
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);
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);
request->send(response, request->user_data);
2020-07-13 20:41:19 +00:00
wf_impl_jsonrpc_request_dispose(request);
}