diff --git a/lib/webfuse_provider/impl/client_protocol.c b/lib/webfuse_provider/impl/client_protocol.c index 9e20ef6..1997fc8 100644 --- a/lib/webfuse_provider/impl/client_protocol.c +++ b/lib/webfuse_provider/impl/client_protocol.c @@ -221,9 +221,18 @@ static bool wfp_impl_client_protocol_send( { struct wfp_client_protocol * protocol = user_data; - struct wfp_message * message = wfp_message_create(request); - wfp_slist_append(&protocol->messages, &message->item); - lws_callback_on_writable(protocol->wsi); + size_t length = json_dumpb(request, NULL, 0, JSON_COMPACT); + if (0 < length) + { + char * raw_data = malloc(LWS_PRE + length); + char * data = raw_data + LWS_PRE; + json_dumpb(request, data, length, JSON_COMPACT); + + struct wfp_message * message = wfp_message_create(data, length); + wfp_slist_append(&protocol->messages, &message->item); + lws_callback_on_writable(protocol->wsi); + } + return true; } diff --git a/lib/webfuse_provider/impl/json/writer.c b/lib/webfuse_provider/impl/json/writer.c index ba809dd..1d4a7e1 100644 --- a/lib/webfuse_provider/impl/json/writer.c +++ b/lib/webfuse_provider/impl/json/writer.c @@ -172,7 +172,6 @@ wfp_impl_json_writer_take_data( wfp_impl_json_writer_reserve(writer, 1); writer->data[writer->offset] = '\0'; - char * result = writer->raw_data; writer->raw_data = NULL; if (NULL != size) @@ -180,7 +179,7 @@ wfp_impl_json_writer_take_data( *size = writer->offset; } - return result; + return writer->data; } void diff --git a/lib/webfuse_provider/impl/jsonrpc/request.c b/lib/webfuse_provider/impl/jsonrpc/request.c index d5c110a..2ac4db1 100644 --- a/lib/webfuse_provider/impl/jsonrpc/request.c +++ b/lib/webfuse_provider/impl/jsonrpc/request.c @@ -22,20 +22,6 @@ wfp_jsonrpc_is_request( } -struct wfp_jsonrpc_request * -wfp_jsonrpc_request_create( - int id, - wfp_jsonrpc_send_fn * send, - void * user_data) -{ - struct wfp_jsonrpc_request * request = malloc(sizeof(struct wfp_jsonrpc_request)); - request->id = id; - request->send = send; - request->user_data = user_data; - - return request; -} - void wfp_jsonrpc_request_dispose( struct wfp_jsonrpc_request * request) diff --git a/lib/webfuse_provider/impl/jsonrpc/request.h b/lib/webfuse_provider/impl/jsonrpc/request.h index 28281be..11514ee 100644 --- a/lib/webfuse_provider/impl/jsonrpc/request.h +++ b/lib/webfuse_provider/impl/jsonrpc/request.h @@ -24,12 +24,6 @@ struct wfp_jsonrpc_request; extern bool wfp_jsonrpc_is_request( json_t * message); -extern struct wfp_jsonrpc_request * -wfp_jsonrpc_request_create( - int id, - wfp_jsonrpc_send_fn * send, - void * user_data); - extern void wfp_jsonrpc_request_dispose( struct wfp_jsonrpc_request * request); diff --git a/lib/webfuse_provider/impl/message.c b/lib/webfuse_provider/impl/message.c index f82a2e0..f929b5b 100644 --- a/lib/webfuse_provider/impl/message.c +++ b/lib/webfuse_provider/impl/message.c @@ -3,17 +3,14 @@ #include #include -extern struct wfp_message * wfp_message_create(json_t const * value) +extern struct wfp_message * wfp_message_create( + char * data, + size_t length) { - size_t const length = json_dumpb(value, NULL, 0, JSON_COMPACT); - - char * data = malloc(sizeof(struct wfp_message) + LWS_PRE + length); - struct wfp_message * message = (struct wfp_message *) data; - message->data = &data[sizeof(struct wfp_message) + LWS_PRE]; + struct wfp_message * message = malloc(sizeof(struct wfp_message)); + message->data = data; message->length = length; - message->raw_data = NULL; - - json_dumpb(value, message->data, length, JSON_COMPACT); + message->raw_data = data - LWS_PRE; return message; } diff --git a/lib/webfuse_provider/impl/message.h b/lib/webfuse_provider/impl/message.h index 1d55ddb..ae1d029 100644 --- a/lib/webfuse_provider/impl/message.h +++ b/lib/webfuse_provider/impl/message.h @@ -8,7 +8,6 @@ using std::size_t; #endif -#include #include "webfuse_provider/impl/util/slist.h" struct wfp_message @@ -24,8 +23,10 @@ extern "C" { #endif -extern struct wfp_message * wfp_message_create( - json_t const * value); +extern struct wfp_message * +wfp_message_create( + char * data, + size_t length); extern void wfp_message_dispose( struct wfp_message * message); diff --git a/lib/webfuse_provider/impl/message_writer.c b/lib/webfuse_provider/impl/message_writer.c index 143cd9c..8ef9314 100644 --- a/lib/webfuse_provider/impl/message_writer.c +++ b/lib/webfuse_provider/impl/message_writer.c @@ -51,11 +51,10 @@ wfp_impl_message_writer_take_message( writer->is_finished = true; } - struct wfp_message * message = malloc(sizeof(struct wfp_message)); - message->raw_data = wfp_impl_json_writer_take_data(writer->json_writer, &message->length); - message->data = &(message->raw_data[LWS_PRE]); + size_t length; + char * data = wfp_impl_json_writer_take_data(writer->json_writer, &length); - return message; + return wfp_message_create(data, length); } void diff --git a/test/webfuse_provider/jsonrpc/test_request.cc b/test/webfuse_provider/jsonrpc/test_request.cc index 317c983..44a8335 100644 --- a/test/webfuse_provider/jsonrpc/test_request.cc +++ b/test/webfuse_provider/jsonrpc/test_request.cc @@ -23,20 +23,6 @@ bool jsonrpc_send( } -TEST(wfp_jsonrpc_request, create_dispose) -{ - Context context{nullptr}; - void * user_data = reinterpret_cast(&context); - - struct wfp_jsonrpc_request * request = - wfp_jsonrpc_request_create(42, &jsonrpc_send, user_data); - - ASSERT_NE(nullptr, request); - ASSERT_EQ(user_data, wfp_jsonrpc_request_get_userdata(request)); - - wfp_jsonrpc_request_dispose(request); -} - TEST(wfp_jsonrpc_request, is_request_object_params) { json_t * request = json_object(); diff --git a/test/webfuse_provider/util/test_message.cc b/test/webfuse_provider/util/test_message.cc index ae46b2f..a4ab4be 100644 --- a/test/webfuse_provider/util/test_message.cc +++ b/test/webfuse_provider/util/test_message.cc @@ -1,16 +1,22 @@ +#include "webfuse_provider/impl/message.h" + #include +#include + +#include #include -#include "webfuse_provider/impl/message.h" TEST(wfp_message, create) { - json_t * value = json_object(); - - struct wfp_message * message = wfp_message_create(value); + size_t length = 3; + char * raw_data = reinterpret_cast(malloc(LWS_PRE + length)); + char * data = raw_data + LWS_PRE; + snprintf(data, length, "{}"); + + struct wfp_message * message = wfp_message_create(data, length); ASSERT_NE(nullptr, message); - ASSERT_EQ(2, message->length); - ASSERT_TRUE(0 == strncmp("{}", message->data, 2)); + ASSERT_EQ(3, message->length); + ASSERT_STREQ("{}", message->data); wfp_message_dispose(message); - json_decref(value); } diff --git a/test/webfuse_provider/util/test_message_queue.cc b/test/webfuse_provider/util/test_message_queue.cc index 3f135c2..ead767c 100644 --- a/test/webfuse_provider/util/test_message_queue.cc +++ b/test/webfuse_provider/util/test_message_queue.cc @@ -3,16 +3,22 @@ #include "webfuse_provider/impl/message.h" #include "webfuse_provider/impl/util/slist.h" +#include +#include +#include + namespace { struct wfp_slist_item * create_message(char const * content) { - json_t * value = json_object(); - json_object_set_new(value, "content", json_string(content)); - struct wfp_message * message = wfp_message_create(value); + size_t length = strlen(content); + char * raw_data = reinterpret_cast(malloc(LWS_PRE + length)); + char * data = raw_data + LWS_PRE; + + memcpy(data, content, length); + struct wfp_message * message = wfp_message_create(data, length); - json_decref(value); return &message->item; }