diff --git a/attachments/nano_attachment/include/mock_nano_attachment_io.h b/attachments/nano_attachment/include/mock_nano_attachment_io.h index 677f228..a29918b 100644 --- a/attachments/nano_attachment/include/mock_nano_attachment_io.h +++ b/attachments/nano_attachment/include/mock_nano_attachment_io.h @@ -97,7 +97,8 @@ public: NanoAttachment *attachment, HttpEventThreadCtx *ctx, SessionID cur_request_id, - unsigned int *num_messages_sent + unsigned int *num_messages_sent, + bool is_verdict_requested ) ); @@ -200,7 +201,8 @@ CMOCK_MOCK_FUNCTION4( NanoAttachment *attachment, HttpEventThreadCtx *ctx, SessionID cur_request_id, - unsigned int *num_messages_sent + unsigned int *num_messages_sent, + bool is_verdict_requested ) ); diff --git a/attachments/nano_attachment/nano_attachment.c b/attachments/nano_attachment/nano_attachment.c index 8eb0659..861dfc6 100755 --- a/attachments/nano_attachment/nano_attachment.c +++ b/attachments/nano_attachment/nano_attachment.c @@ -265,6 +265,9 @@ SendDataNanoAttachmentAsync(NanoAttachment *attachment, AttachmentData *data) case HTTP_RESPONSE_END: { return SendResponseEndAsync(attachment, data); } + case HOLD_DATA: { + return SendHoldDataAsync(attachment, data); + } default: break; } diff --git a/attachments/nano_attachment/nano_attachment_io.c b/attachments/nano_attachment/nano_attachment_io.c index 03fd410..ac7429c 100755 --- a/attachments/nano_attachment/nano_attachment_io.c +++ b/attachments/nano_attachment/nano_attachment_io.c @@ -1703,7 +1703,8 @@ nano_request_delayed_verdict( NanoAttachment *attachment, HttpEventThreadCtx *ctx, SessionID cur_request_id, - unsigned int *num_messages_sent + unsigned int *num_messages_sent, + bool is_verdict_requested ) { char *fragments[DELAYED_VERDICT_DATA_COUNT]; @@ -1740,13 +1741,17 @@ nano_request_delayed_verdict( *num_messages_sent += 1; - ctx->res = service_reply_receiver( - attachment, - ctx->session_data_p, - &ctx->web_response_data, - &ctx->modifications, - wait_transaction_type - ); + if (is_verdict_requested) { + ctx->res = service_reply_receiver( + attachment, + ctx->session_data_p, + &ctx->web_response_data, + &ctx->modifications, + wait_transaction_type + ); + } else { + ctx->res = NANO_OK; + } } AttachmentVerdictResponse @@ -1796,6 +1801,8 @@ PopResponseVerdictFromQueue(NanoAttachment *attachment) return response; } + response.session_id = reply_p->session_id; + // Convert ServiceVerdict to AttachmentVerdict switch ((ServiceVerdict)reply_p->verdict) { case TRAFFIC_VERDICT_INSPECT: @@ -1814,15 +1821,23 @@ PopResponseVerdictFromQueue(NanoAttachment *attachment) case TRAFFIC_VERDICT_RECONF: write_dbg( attachment, - reply_p->session_id, + 0, DBG_LEVEL_TRACE, "Verdict reconf received from the nano service" ); reset_attachment_config(attachment); response.verdict = ATTACHMENT_VERDICT_INSPECT; + response.session_id = 0; break; case TRAFFIC_VERDICT_DELAYED: - response.verdict = ATTACHMENT_VERDICT_INSPECT; + write_dbg( + attachment, + reply_p->session_id, + DBG_LEVEL_TRACE, + "Verdict delayed received from the nano service" + ); + + response.verdict = ATTACHMENT_VERDICT_DELAYED; break; default: write_dbg( @@ -1835,7 +1850,6 @@ PopResponseVerdictFromQueue(NanoAttachment *attachment) response.verdict = ATTACHMENT_VERDICT_INSPECT; break; } - response.session_id = reply_p->session_id; // TODO: Deal with data leak. response.web_response_data = NULL; diff --git a/attachments/nano_attachment/nano_attachment_io.h b/attachments/nano_attachment/nano_attachment_io.h index 45a7a9c..32ab995 100644 --- a/attachments/nano_attachment/nano_attachment_io.h +++ b/attachments/nano_attachment/nano_attachment_io.h @@ -220,7 +220,8 @@ nano_request_delayed_verdict( NanoAttachment *attachment, HttpEventThreadCtx *ctx, SessionID cur_request_id, - unsigned int *num_messages_sent + unsigned int *num_messages_sent, + bool is_verdict_requested ); /// diff --git a/attachments/nano_attachment/nano_attachment_sender.c b/attachments/nano_attachment/nano_attachment_sender.c index c5a6716..70cf055 100644 --- a/attachments/nano_attachment/nano_attachment_sender.c +++ b/attachments/nano_attachment/nano_attachment_sender.c @@ -1138,6 +1138,42 @@ SendResponseEndAsync(NanoAttachment *attachment, AttachmentData *data) return SendResponseEndAsyncImpl(attachment, session_data_p); } +NanoCommunicationResult +SendHoldDataAsync(NanoAttachment *attachment, AttachmentData *data) +{ + if (attachment == NULL || data == NULL) { + return NANO_ERROR; + } + + HttpSessionData *session_data_p = data->session_data; + if (session_data_p == NULL) { + return NANO_ERROR; + } + + SessionID session_id = session_data_p->session_id; + + write_dbg( + attachment, + session_id, + DBG_LEVEL_DEBUG, + "Hold data handling session ID: %d", + session_id + ); + + if (handle_shmem_corruption(attachment) == NANO_ERROR) { + write_dbg( + attachment, + session_id, + DBG_LEVEL_WARNING, + "Failed to handle shmem corruption in session ID: %d", + session_id + ); + return NANO_ERROR; + } + + return SendHoldDataAsyncImpl(attachment, session_data_p); +} + NanoCommunicationResult SendMetricData(NanoAttachment *attachment) { diff --git a/attachments/nano_attachment/nano_attachment_sender.h b/attachments/nano_attachment/nano_attachment_sender.h index 73f9617..0f2db52 100644 --- a/attachments/nano_attachment/nano_attachment_sender.h +++ b/attachments/nano_attachment/nano_attachment_sender.h @@ -204,6 +204,19 @@ NanoCommunicationResult SendRequestEndAsync(NanoAttachment *attachment, Attachme /// NanoCommunicationResult SendResponseEndAsync(NanoAttachment *attachment, AttachmentData *data); +/// +/// @brief Sends a delayed verdict signal to the agent asynchronously. +/// +/// This function sends a delayed verdict signal to the agent service, requesting an updated +/// verdict for a session that is currently in a delayed state. +/// +/// @param attachment A pointer to the NanoAttachment structure. +/// @param data A pointer to AttachmentData structure containing the session data. +/// +/// @return A NanoCommunicationResult indicating the outcome of the operation. +/// +NanoCommunicationResult SendHoldDataAsync(NanoAttachment *attachment, AttachmentData *data); + /// /// @brief Sends metric data to the nano service and resets it on the attachment. /// diff --git a/attachments/nano_attachment/nano_attachment_sender_async.c b/attachments/nano_attachment/nano_attachment_sender_async.c index 4980527..311e381 100644 --- a/attachments/nano_attachment/nano_attachment_sender_async.c +++ b/attachments/nano_attachment/nano_attachment_sender_async.c @@ -249,6 +249,36 @@ SendDelayedVerdictRequestAsyncImpl( return NANO_OK; } +NanoCommunicationResult +SendHoldDataAsyncImpl( + NanoAttachment *attachment, + HttpSessionData *session_data_p +) +{ + HttpEventThreadCtx ctx; + + if (attachment == NULL || session_data_p == NULL) { + return NANO_ERROR; + } + + ctx.attachment = attachment; + ctx.data = NULL; + ctx.session_data_p = session_data_p; + ctx.res = NANO_OK; + ctx.web_response_data = NULL; + ctx.modifications = NULL; + + nano_request_delayed_verdict( + attachment, + &ctx, + session_data_p->session_id, + &session_data_p->remaining_messages_to_reply, + false + ); + + return ctx.res; +} + NanoCommunicationResult SendMetricToServiceAsyncImpl( NanoAttachment *attachment, diff --git a/attachments/nano_attachment/nano_attachment_sender_thread.c b/attachments/nano_attachment/nano_attachment_sender_thread.c index a429a04..117cdf5 100644 --- a/attachments/nano_attachment/nano_attachment_sender_thread.c +++ b/attachments/nano_attachment/nano_attachment_sender_thread.c @@ -321,7 +321,8 @@ SendDelayedVerdictRequestThread(void *_ctx) attachment, ctx, session_data_p->session_id, - &session_data_p->remaining_messages_to_reply + &session_data_p->remaining_messages_to_reply, + true ); return NULL; diff --git a/core/include/attachments/nano_attachment_common.h b/core/include/attachments/nano_attachment_common.h index 85aa1ed..bd5c246 100755 --- a/core/include/attachments/nano_attachment_common.h +++ b/core/include/attachments/nano_attachment_common.h @@ -241,7 +241,8 @@ typedef enum AttachmentVerdict ATTACHMENT_VERDICT_INSPECT, ATTACHMENT_VERDICT_ACCEPT, ATTACHMENT_VERDICT_DROP, - ATTACHMENT_VERDICT_INJECT + ATTACHMENT_VERDICT_INJECT, + ATTACHMENT_VERDICT_DELAYED } AttachmentVerdict; #ifdef __cplusplus