#include "responses.h" #define srv conn->server #define LOGGER srv->logger #define LOG_FUNC srv->log_func #define LOG_CONTEXT log_ctx declare_RequestHandler(SendMessage) { Deferral(4); logInfo("requested %s", req_type_name); // receive request SendMessageRequest req; try_void(PacketHeader_validateContentSize(req_head, sizeof(req))); try_void(EncryptedSocketTCP_recvStruct(&conn->sock, &req)); if(!conn->authorized){ try_void(sendErrorMessage(log_ctx, conn, res_head, LogSeverity_Warn, STR("is not authorized") )); Return RESULT_VOID; } if(req.data_size < MESSAGE_SIZE_MIN || req.data_size > MESSAGE_SIZE_MAX){ try_void(sendErrorMessage_f(log_ctx, conn, res_head, LogSeverity_Warn, "message size must be >= %i and <= %i", MESSAGE_SIZE_MIN, MESSAGE_SIZE_MAX )); // this will close socket connection Return RESULT_ERROR("invalid message size", false); } // receive message data Array(u8) message_data = Array_u8_alloc(req.data_size); try_void(EncryptedSocketTCP_recv(&conn->sock, message_data, SocketRecvFlag_WholeBuffer)); // save message to channel Channel* ch = Server_tryGetChannel(conn->server, req.channel_id); if(ch == NULL){ try_void(sendErrorMessage(log_ctx, conn, res_head, LogSeverity_Warn, STR("invalid channel id") )); Return RESULT_VOID; } MessageMeta message_meta; try_void(Channel_saveMessage(ch, message_data, conn->user_id, &message_meta)); // send response SendMessageResponse res; SendMessageResponse_construct(&res, res_head, message_meta.id, message_meta.receiving_time_utc); try_void(EncryptedSocketTCP_sendStruct(&conn->sock, res_head)); try_void(EncryptedSocketTCP_sendStruct(&conn->sock, &res)); Return RESULT_VOID; }