diff --git a/lib/webfuse/adapter/impl/jsonrpc/request.c b/lib/webfuse/adapter/impl/jsonrpc/request.c index 541635b..fb9878a 100644 --- a/lib/webfuse/adapter/impl/jsonrpc/request.c +++ b/lib/webfuse/adapter/impl/jsonrpc/request.c @@ -9,6 +9,18 @@ struct wf_impl_jsonrpc_request void * user_data; }; +bool wf_impl_jsonrpc_is_request( + json_t * message) +{ + json_t * id = json_object_get(message, "id"); + json_t * method = json_object_get(message, "method"); + json_t * params = json_object_get(message, "params"); + + return (json_is_integer(id) && json_is_string(method) && + (json_is_array(params) || json_is_object(params))); +} + + struct wf_impl_jsonrpc_request * wf_impl_jsonrpc_request_create( int id, wf_impl_jsonrpc_send_fn * send, diff --git a/lib/webfuse/adapter/impl/jsonrpc/request.h b/lib/webfuse/adapter/impl/jsonrpc/request.h index ff1c8ea..d196779 100644 --- a/lib/webfuse/adapter/impl/jsonrpc/request.h +++ b/lib/webfuse/adapter/impl/jsonrpc/request.h @@ -22,6 +22,9 @@ extern "C" struct wf_impl_jsonrpc_request; +extern bool wf_impl_jsonrpc_is_request( + json_t * message); + extern struct wf_impl_jsonrpc_request * wf_impl_jsonrpc_request_create( int id, wf_impl_jsonrpc_send_fn * send, diff --git a/lib/webfuse/adapter/impl/jsonrpc/response.c b/lib/webfuse/adapter/impl/jsonrpc/response.c index 5cb2818..00eb396 100644 --- a/lib/webfuse/adapter/impl/jsonrpc/response.c +++ b/lib/webfuse/adapter/impl/jsonrpc/response.c @@ -1,5 +1,17 @@ #include "webfuse/adapter/impl/jsonrpc/response.h" +extern bool wf_impl_jsonrpc_is_response( + json_t * message) +{ + json_t * id = json_object_get(message, "id"); + json_t * err = json_object_get(message, "error"); + json_t * result = json_object_get(message, "result"); + + return (json_is_integer(id) && + (json_is_object(err) || (NULL != result))); +} + + void wf_impl_jsonrpc_response_init( struct wf_impl_jsonrpc_response * result, json_t * response) @@ -12,7 +24,6 @@ void wf_impl_jsonrpc_response_init( if ((NULL == id_holder) || (!json_is_integer(id_holder))) { result->status = WF_BAD_FORMAT; - json_decref(response); return; } diff --git a/lib/webfuse/adapter/impl/jsonrpc/response.h b/lib/webfuse/adapter/impl/jsonrpc/response.h index 90b2658..d53f667 100644 --- a/lib/webfuse/adapter/impl/jsonrpc/response.h +++ b/lib/webfuse/adapter/impl/jsonrpc/response.h @@ -2,6 +2,7 @@ #define WF_ADAPTER_IMPL_JSONRPC_RESPONSE_H #ifndef __cplusplus +#include #include #else #include @@ -22,6 +23,9 @@ struct wf_impl_jsonrpc_response json_t * result; }; +extern bool wf_impl_jsonrpc_is_response( + json_t * message); + extern void wf_impl_jsonrpc_response_init( struct wf_impl_jsonrpc_response * response, json_t * message); diff --git a/lib/webfuse/adapter/impl/session.c b/lib/webfuse/adapter/impl/session.c index 2f6eabc..46254a7 100644 --- a/lib/webfuse/adapter/impl/session.c +++ b/lib/webfuse/adapter/impl/session.c @@ -3,6 +3,8 @@ #include "webfuse/core/message_queue.h" #include "webfuse/core/message.h" #include "webfuse/adapter/impl/jsonrpc/proxy.h" +#include "webfuse/adapter/impl/jsonrpc/request.h" +#include "webfuse/adapter/impl/jsonrpc/response.h" #include #include @@ -89,7 +91,15 @@ void wf_impl_session_receive( json_t * message = json_loadb(data, length, 0, NULL); if (NULL != message) { - wf_impl_jsonrpc_proxy_onresult(&session->rpc, message); + if (wf_impl_jsonrpc_is_response(message)) + { + wf_impl_jsonrpc_proxy_onresult(&session->rpc, message); + } + else if (wf_impl_jsonrpc_is_request(message)) + { + wf_impl_jsonrpc_server_process(session->server, message, &wf_impl_session_send, session); + } + json_decref(message); } diff --git a/test/test_response_parser.cc b/test/test_response_parser.cc index e149628..db7fe2f 100644 --- a/test/test_response_parser.cc +++ b/test/test_response_parser.cc @@ -9,8 +9,11 @@ static void response_parse_str( struct wf_impl_jsonrpc_response * response) { json_t * message = json_loadb(buffer.c_str(), buffer.size(), 0, nullptr); - wf_impl_jsonrpc_response_init(response, message); - json_decref(message); + if (nullptr != message) + { + wf_impl_jsonrpc_response_init(response, message); + json_decref(message); + } } TEST(response_parser, test)