From 5e70658d77286b0af31a1c98ffca3987a8bd247f Mon Sep 17 00:00:00 2001 From: Granyaa Date: Wed, 14 Jan 2026 16:36:14 +0200 Subject: [PATCH] Implemented Async Request Start, Request Header, Request Body, Request End in async manner. --- .../nano_attachment/nano_attachment_io.c | 42 +++-- .../nano_attachment/nano_attachment_io.h | 8 +- .../nano_attachment_sender_async.c | 143 +++++++++++++++--- .../nano_attachment_sender_thread.c | 19 ++- 4 files changed, 171 insertions(+), 41 deletions(-) diff --git a/attachments/nano_attachment/nano_attachment_io.c b/attachments/nano_attachment/nano_attachment_io.c index 57ac7bb..4390d94 100755 --- a/attachments/nano_attachment/nano_attachment_io.c +++ b/attachments/nano_attachment/nano_attachment_io.c @@ -1564,7 +1564,8 @@ nano_body_sender( HttpEventThreadCtx *ctx, AttachmentDataType body_type, uint32_t cur_request_id, - unsigned int *num_messages_sent + unsigned int *num_messages_sent, + bool is_verdict_requested ) { char *fragments[BODY_DATA_COUNT]; @@ -1626,13 +1627,17 @@ nano_body_sender( bodies->bodies_count ); - ctx->res = service_reply_receiver( - attachment, - ctx->session_data_p, - &ctx->web_response_data, - &ctx->modifications, - body_type - ); + if (is_verdict_requested) { + ctx->res = service_reply_receiver( + attachment, + ctx->session_data_p, + &ctx->web_response_data, + &ctx->modifications, + body_type + ); + } else { + ctx->res = NANO_OK; + } } void @@ -1641,7 +1646,8 @@ nano_end_transaction_sender( AttachmentDataType end_transaction_type, HttpEventThreadCtx *ctx, SessionID cur_request_id, - unsigned int *num_messages_sent + unsigned int *num_messages_sent, + bool is_verdict_requested ) { char *fragments[END_TRANSACTION_DATA_COUNT]; @@ -1679,13 +1685,17 @@ nano_end_transaction_sender( *num_messages_sent += 1; - ctx->res = service_reply_receiver( - attachment, - ctx->session_data_p, - &ctx->web_response_data, - &ctx->modifications, - end_transaction_type - ); + if (is_verdict_requested) { + ctx->res = service_reply_receiver( + attachment, + ctx->session_data_p, + &ctx->web_response_data, + &ctx->modifications, + end_transaction_type + ); + } else { + ctx->res = NANO_OK; + } } void diff --git a/attachments/nano_attachment/nano_attachment_io.h b/attachments/nano_attachment/nano_attachment_io.h index dab5d9a..cb5c20d 100644 --- a/attachments/nano_attachment/nano_attachment_io.h +++ b/attachments/nano_attachment/nano_attachment_io.h @@ -173,6 +173,7 @@ nano_header_sender( /// @param body_type Enum value indicating whether the body is a request or response body. /// @param cur_request_id Current request ID for logging and tracking purposes. /// @param num_messages_sent Pointer to an unsigned int to track the number of messages sent. +/// @param is_verdict_requested Boolean value indicating if a verdict is requested. /// void nano_body_sender( @@ -181,7 +182,8 @@ nano_body_sender( HttpEventThreadCtx *ctx, AttachmentDataType body_type, uint32_t cur_request_id, - unsigned int *num_messages_sent + unsigned int *num_messages_sent, + bool is_verdict_requested ); /// @@ -192,6 +194,7 @@ nano_body_sender( /// @param ctx Pointer to the HttpEventThreadCtx struct containing the context of the current thread. /// @param cur_request_id The ID of the current request. /// @param num_messages_sent Pointer to an unsigned integer to store the number of messages sent. +/// @param is_verdict_requested Boolean value indicating if a verdict is requested. /// @return NANO_OK if the end transaction event was sent successfully, NANO_ERROR otherwise. /// void @@ -200,7 +203,8 @@ nano_end_transaction_sender( AttachmentDataType end_transaction_type, 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_async.c b/attachments/nano_attachment/nano_attachment_sender_async.c index 73a69f5..ed5e6ae 100644 --- a/attachments/nano_attachment/nano_attachment_sender_async.c +++ b/attachments/nano_attachment/nano_attachment_sender_async.c @@ -2,6 +2,8 @@ #include "nano_attachment_common.h" #include "nano_initializer.h" +#include "nano_attachment_io.h" +#include "nano_attachment_sender_thread.h" NanoCommunicationResult RegistrationCommSocketAsyncImpl( @@ -32,9 +34,33 @@ SendRequestFilterAsyncImpl( HttpRequestFilterData *start_data ) { - (void)attachment; - (void)session_data_p; - (void)start_data; + NanoCommunicationResult res; + + if (start_data == NULL) { + return NANO_ERROR; + } + + if (start_data->meta_data != NULL) { + res = SendMetadataAsyncImpl(attachment, session_data_p, start_data->meta_data); + if (res != NANO_OK) { + return res; + } + } + + if (start_data->req_headers != NULL) { + res = SendRequestHeadersAsyncImpl(attachment, session_data_p, start_data->req_headers); + if (res != NANO_OK) { + return res; + } + } + + if (!start_data->contains_body) { + res = SendRequestEndAsyncImpl(attachment, session_data_p); + if (res != NANO_OK) { + return res; + } + } + return NANO_OK; } @@ -45,10 +71,30 @@ SendMetadataAsyncImpl( HttpMetaData *metadata ) { - (void)attachment; - (void)session_data_p; - (void)metadata; - return NANO_OK; + HttpEventThreadCtx ctx; + bool is_verdict_requested = false; + + if (attachment == NULL || session_data_p == NULL || metadata == 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_metadata_sender( + attachment, + metadata, + &ctx, + session_data_p->session_id, + &session_data_p->remaining_messages_to_reply, + is_verdict_requested + ); + + return ctx.res; } NanoCommunicationResult @@ -58,10 +104,31 @@ SendRequestHeadersAsyncImpl( HttpHeaders *headers ) { - (void)attachment; - (void)session_data_p; - (void)headers; - return NANO_OK; + HttpEventThreadCtx ctx; + bool is_verdict_requested = false; + + if (attachment == NULL || session_data_p == NULL || headers == 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_header_sender( + attachment, + headers, + &ctx, + REQUEST_HEADER, + session_data_p->session_id, + &session_data_p->remaining_messages_to_reply, + is_verdict_requested + ); + + return ctx.res; } NanoCommunicationResult @@ -84,10 +151,30 @@ SendRequestBodyAsyncImpl( NanoHttpBody *bodies ) { - (void)attachment; - (void)session_data_p; - (void)bodies; - return NANO_OK; + HttpEventThreadCtx ctx; + + if (attachment == NULL || session_data_p == NULL || bodies == 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_body_sender( + attachment, + bodies, + &ctx, + REQUEST_BODY, + session_data_p->session_id, + &session_data_p->remaining_messages_to_reply, + false + ); + + return ctx.res; } NanoCommunicationResult @@ -109,9 +196,29 @@ SendRequestEndAsyncImpl( HttpSessionData *session_data_p ) { - (void)attachment; - (void)session_data_p; - return NANO_OK; + 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_end_transaction_sender( + attachment, + REQUEST_END, + &ctx, + session_data_p->session_id, + &session_data_p->remaining_messages_to_reply, + false + ); + + return ctx.res; } NanoCommunicationResult diff --git a/attachments/nano_attachment/nano_attachment_sender_thread.c b/attachments/nano_attachment/nano_attachment_sender_thread.c index fb2a43e..a429a04 100644 --- a/attachments/nano_attachment/nano_attachment_sender_thread.c +++ b/attachments/nano_attachment/nano_attachment_sender_thread.c @@ -130,7 +130,8 @@ SendRequestFilterThread(void *_ctx) REQUEST_END, ctx, session_data_p->session_id, - &session_data_p->remaining_messages_to_reply + &session_data_p->remaining_messages_to_reply, + is_verdict_requested ); } @@ -232,6 +233,7 @@ SendRequestBodyThread(void *_ctx) NanoHttpBody *bodies = (NanoHttpBody*)ctx->data->data; NanoAttachment *attachment = ctx->attachment; HttpSessionData *session_data_p = ctx->session_data_p; + bool is_verdict_requested = true; nano_body_sender( attachment, @@ -239,7 +241,8 @@ SendRequestBodyThread(void *_ctx) ctx, REQUEST_BODY, session_data_p->session_id, - &session_data_p->remaining_messages_to_reply + &session_data_p->remaining_messages_to_reply, + is_verdict_requested ); return NULL; @@ -252,6 +255,7 @@ SendResponseBodyThread(void *_ctx) NanoHttpBody *bodies = (NanoHttpBody*)ctx->data->data; NanoAttachment *attachment = ctx->attachment; HttpSessionData *session_data_p = ctx->session_data_p; + bool is_verdict_requested = true; nano_body_sender( attachment, @@ -259,7 +263,8 @@ SendResponseBodyThread(void *_ctx) ctx, RESPONSE_BODY, session_data_p->session_id, - &session_data_p->remaining_messages_to_reply + &session_data_p->remaining_messages_to_reply, + is_verdict_requested ); return NULL; @@ -271,13 +276,15 @@ SendRequestEndThread(void *_ctx) HttpEventThreadCtx *ctx = (HttpEventThreadCtx *)_ctx; NanoAttachment *attachment = ctx->attachment; HttpSessionData *session_data_p = ctx->session_data_p; + bool is_verdict_requested = true; nano_end_transaction_sender( attachment, REQUEST_END, ctx, session_data_p->session_id, - &session_data_p->remaining_messages_to_reply + &session_data_p->remaining_messages_to_reply, + is_verdict_requested ); return NULL; @@ -289,13 +296,15 @@ SendResponseEndThread(void *_ctx) HttpEventThreadCtx *ctx = (HttpEventThreadCtx *)_ctx; NanoAttachment *attachment = ctx->attachment; HttpSessionData *session_data_p = ctx->session_data_p; + bool is_verdict_requested = true; nano_end_transaction_sender( attachment, RESPONSE_END, ctx, session_data_p->session_id, - &session_data_p->remaining_messages_to_reply + &session_data_p->remaining_messages_to_reply, + is_verdict_requested ); return NULL;