1
0
mirror of https://github.com/falk-werner/webfuse synced 2025-06-13 12:54:15 +00:00

moves some logic from server_protocol to session

This commit is contained in:
Falk Werner 2019-03-23 11:33:42 +01:00
parent eea13654b6
commit 54e16bfd3d
5 changed files with 127 additions and 43 deletions

View File

@ -34,31 +34,31 @@ static int wsfs_server_protocol_callback(
}
break;
case LWS_CALLBACK_ESTABLISHED:
{
bool is_authenticated = wsfs_authenticators_authenticate(&protocol->authenticators, NULL);
wsfs_session_manager_add(&protocol->session_manager, wsi, is_authenticated);
}
session = wsfs_session_manager_add(
&protocol->session_manager,
wsi,
&protocol->authenticators,
&protocol->rpc);
if (NULL != session)
{
wsfs_session_authenticate(session, NULL);
}
break;
case LWS_CALLBACK_CLOSED:
{
wsfs_session_manager_remove(&protocol->session_manager, wsi);
}
wsfs_session_manager_remove(&protocol->session_manager, wsi);
break;
case LWS_CALLBACK_SERVER_WRITEABLE:
if ((NULL != session) && (!wsfs_message_queue_empty(&session->queue)))
if (NULL != session)
{
struct wsfs_message * message = wsfs_message_queue_pop(&session->queue);
lws_write(wsi, (unsigned char*) message->data, message->length, LWS_WRITE_TEXT);
wsfs_message_dispose(message);
if (!wsfs_message_queue_empty(&session->queue))
{
lws_callback_on_writable(wsi);
}
wsfs_session_onwritable(session);
}
break;
case LWS_CALLBACK_RECEIVE:
wsfs_jsonrpc_server_onresult(&protocol->rpc, in, len);
if (NULL != session)
{
wsfs_session_receive(session, in, len);
}
break;
case LWS_CALLBACK_RAW_RX_FILE:
wsfs_filesystem_process_request(&protocol->filesystem);
@ -74,21 +74,11 @@ static bool wsfs_server_protocol_invoke(
void * user_data,
json_t const * request)
{
bool result = false;
struct wsfs_server_protocol * protocol = user_data;
struct wsfs_session * session = &protocol->session_manager.session;
struct wsfs_message * message = wsfs_message_create(request);
if ((session->is_authenticated) && (NULL != session->wsi))
{
struct wsfs_message * message = wsfs_message_create(request);
if (NULL != message)
{
wsfs_message_queue_push(&session->queue, message);
lws_callback_on_writable(session->wsi);
result = true;
}
}
bool const result = wsfs_session_send(session, message);
return result;
}

View File

@ -1,14 +1,23 @@
#include "wsfs/adapter/session.h"
#include "wsfs/adapter/authenticators.h"
#include "wsfs/message_queue.h"
#include "wsfs/message.h"
#include "wsfs/adapter/jsonrpc/server.h"
#include <libwebsockets.h>
#include <stddef.h>
void wsfs_session_init(
struct wsfs_session * session,
struct lws * wsi,
bool is_authenticated)
struct wsfs_authenticators * authenticators,
struct wsfs_jsonrpc_server * rpc)
{
session->wsi = wsi;
session->is_authenticated = is_authenticated;
wsfs_message_queue_init(&session->queue);
session->wsi = wsi;
session->is_authenticated = false;
session->authenticators = authenticators;
session->rpc = rpc;
wsfs_message_queue_init(&session->queue);
}
void wsfs_session_cleanup(
@ -17,4 +26,59 @@ void wsfs_session_cleanup(
wsfs_message_queue_cleanup(&session->queue);
session->is_authenticated = false;
session->wsi = NULL;
session->authenticators = NULL;
session->rpc = NULL;
}
void wsfs_session_authenticate(
struct wsfs_session * session,
struct wsfs_credentials * creds)
{
session->is_authenticated = wsfs_authenticators_authenticate(session->authenticators, creds);
}
bool wsfs_session_send(
struct wsfs_session * session,
struct wsfs_message * message)
{
bool result = (session->is_authenticated) && (NULL != session->wsi);
if (result)
{
wsfs_message_queue_push(&session->queue, message);
lws_callback_on_writable(session->wsi);
result = true;
}
else
{
wsfs_message_dispose(message);
}
return result;
}
void wsfs_session_onwritable(
struct wsfs_session * session)
{
if (!wsfs_message_queue_empty(&session->queue))
{
struct wsfs_message * message = wsfs_message_queue_pop(&session->queue);
lws_write(session->wsi, (unsigned char*) message->data, message->length, LWS_WRITE_TEXT);
wsfs_message_dispose(message);
if (!wsfs_message_queue_empty(&session->queue))
{
lws_callback_on_writable(session->wsi);
}
}
}
void wsfs_session_receive(
struct wsfs_session * session,
char const * data,
size_t length)
{
wsfs_jsonrpc_server_onresult(session->rpc, data, length);
}

View File

@ -3,6 +3,10 @@
#ifndef __cplusplus
#include <stdbool.h>
#include <stddef.h>
#else
#include <cstddef>
using std::size_t;
#endif
#include "wsfs/message_queue.h"
@ -13,18 +17,41 @@ extern "C"
#endif
struct lws;
struct wsfs_message;
struct wsfs_credentials;
struct wsfs_authenticators;
struct wsfs_jsonrpc_server;
struct wsfs_session
{
struct lws * wsi;
bool is_authenticated;
struct wsfs_message_queue queue;
struct wsfs_authenticators * authenticators;
struct wsfs_jsonrpc_server * rpc;
};
extern void wsfs_session_init(
struct wsfs_session * session,
struct lws * wsi,
bool is_authenticated);
struct wsfs_authenticators * authenticators,
struct wsfs_jsonrpc_server * rpc);
extern void wsfs_session_authenticate(
struct wsfs_session * session,
struct wsfs_credentials * creds);
extern bool wsfs_session_send(
struct wsfs_session * session,
struct wsfs_message * message);
extern void wsfs_session_receive(
struct wsfs_session * session,
char const * data,
size_t length);
extern void wsfs_session_onwritable(
struct wsfs_session * session);
extern void wsfs_session_cleanup(
struct wsfs_session * session);

View File

@ -4,7 +4,7 @@
void wsfs_session_manager_init(
struct wsfs_session_manager * manager)
{
wsfs_session_init(&manager->session, NULL, false);
wsfs_session_init(&manager->session, NULL, NULL, NULL);
}
void wsfs_session_manager_cleanup(
@ -13,18 +13,20 @@ void wsfs_session_manager_cleanup(
wsfs_session_cleanup(&manager->session);
}
bool wsfs_session_manager_add(
struct wsfs_session * wsfs_session_manager_add(
struct wsfs_session_manager * manager,
struct lws * wsi,
bool is_authenticated)
struct wsfs_authenticators * authenticators,
struct wsfs_jsonrpc_server * rpc)
{
bool const result = (NULL == manager->session.wsi);
if (result)
struct wsfs_session * session = NULL;
if (NULL == manager->session.wsi)
{
wsfs_session_init(&manager->session, wsi, is_authenticated);
session = &manager->session;
wsfs_session_init(&manager->session, wsi, authenticators, rpc);
}
return result;
return session;
}
struct wsfs_session * wsfs_session_manager_get(

View File

@ -25,10 +25,11 @@ extern void wsfs_session_manager_init(
extern void wsfs_session_manager_cleanup(
struct wsfs_session_manager * manager);
extern bool wsfs_session_manager_add(
extern struct wsfs_session * wsfs_session_manager_add(
struct wsfs_session_manager * manager,
struct lws * wsi,
bool is_authenticated);
struct wsfs_authenticators * authenticators,
struct wsfs_jsonrpc_server * rpc);
extern struct wsfs_session * wsfs_session_manager_get(
struct wsfs_session_manager * manager,