From 9f94f159fd4328fda5f738c0eed01e49383945ec Mon Sep 17 00:00:00 2001 From: "oljas.jarasbaev" <oljas.jarasbaev@demlabs.net> Date: Tue, 22 Oct 2024 13:00:07 +0700 Subject: [PATCH] [*] refactor --- .../rpc_core/src/dap_json_rpc_request.c | 141 ++++++++++++++---- 1 file changed, 113 insertions(+), 28 deletions(-) diff --git a/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c b/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c index 1deb4336d..0e99f189d 100644 --- a/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c +++ b/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c @@ -17,6 +17,7 @@ struct exec_cmd_request { #endif char* response; size_t response_size; + int error_code; }; enum ExecCmdRetCode { @@ -60,6 +61,25 @@ static struct exec_cmd_request* s_exec_cmd_request_init(dap_client_pvt_t * a_cli return l_exec_cmd_request; } +void s_exec_cmd_request_free(struct exec_cmd_request *a_exec_cmd_request) +{ + if (!a_exec_cmd_request) + return; + +#ifdef DAP_OS_WINDOWS + DeleteCriticalSection(&a_exec_cmd_request->wait_crit_sec); +#else + pthread_mutex_destroy(&a_exec_cmd_request->wait_mutex); + pthread_cond_destroy(&a_exec_cmd_request->wait_cond); +#endif + + if (a_exec_cmd_request->response) { + DAP_DEL_Z(a_exec_cmd_request->response); + } + + DAP_DEL_Z(a_exec_cmd_request); +} + static void s_exec_cmd_response_handler(void *a_response, size_t a_response_size, void *a_arg, http_status_code_t http_status_code) { (void)http_status_code; @@ -69,20 +89,8 @@ static void s_exec_cmd_response_handler(void *a_response, size_t a_response_size #else pthread_mutex_lock(&l_exec_cmd_request->wait_mutex); #endif - - dap_client_pvt_t * l_client_pvt = l_exec_cmd_request->client_pvt; - l_client_pvt->http_client = NULL; - size_t l_response_dec_size_max = a_response_size ? a_response_size * 2 + 16 : 0; - char * l_response_dec = a_response_size ? DAP_NEW_Z_SIZE(char, l_response_dec_size_max) : NULL; - size_t l_response_dec_size = 0; - if(a_response_size) - l_response_dec_size = dap_enc_decode(l_client_pvt->session_key, - a_response, a_response_size, - l_response_dec, l_response_dec_size_max, - DAP_ENC_DATA_TYPE_RAW); - - l_exec_cmd_request->response = l_response_dec; - l_exec_cmd_request->response_size = l_response_dec_size; + l_exec_cmd_request->response = a_response; + l_exec_cmd_request->response_size = a_response_size; #ifdef DAP_OS_WINDOWS WakeConditionVariable(&l_exec_cmd_request->wait_cond); LeaveCriticalSection(&l_exec_cmd_request->wait_crit_sec); @@ -96,17 +104,69 @@ static void s_exec_cmd_error_handler(int a_error_code, void *a_arg){ struct exec_cmd_request * l_exec_cmd_request = (struct exec_cmd_request *)a_arg; #ifdef DAP_OS_WINDOWS EnterCriticalSection(&l_exec_cmd_request->wait_crit_sec); - l_exec_cmd_request->response = a_error_code; + l_exec_cmd_request->error_code = a_error_code; WakeConditionVariable(&l_exec_cmd_request->wait_cond); LeaveCriticalSection(&l_exec_cmd_request->wait_crit_sec); #else pthread_mutex_lock(&l_exec_cmd_request->wait_mutex); - // l_exec_cmd_request->response = a_error_code; + l_exec_cmd_request->error_code = a_error_code; pthread_cond_signal(&l_exec_cmd_request->wait_cond); pthread_mutex_unlock(&l_exec_cmd_request->wait_mutex); #endif } +static int s_exec_cmd_request_get_response(struct exec_cmd_request *a_exec_cmd_request, char **a_response, size_t *a_response_size, int timeout_ms) +{ + int ret = 0; + char *l_enc_response = NULL; + size_t l_enc_response_size = 0; + +#ifdef DAP_OS_WINDOWS + EnterCriticalSection(&a_exec_cmd_request->wait_crit_sec); + if (a_exec_cmd_request->error_code != 0) { + ret = a_exec_cmd_request->error_code; + } else { + l_enc_response = dap_strdup(a_exec_cmd_request->response); + l_enc_response_size = a_exec_cmd_request->response_size; + ret = 0; + } + LeaveCriticalSection(&a_exec_cmd_request->wait_crit_sec); +#else + pthread_mutex_lock(&a_exec_cmd_request->wait_mutex); + if (a_exec_cmd_request->error_code != 0) { + ret = a_exec_cmd_request->error_code; + } else { + l_enc_response = dap_strdup(a_exec_cmd_request->response); + l_enc_response_size = a_exec_cmd_request->response_size; + ret = 0; + } + pthread_mutex_unlock(&a_exec_cmd_request->wait_mutex); +#endif + if (a_exec_cmd_request->error_code) { + log_it(L_ERROR, "Response error code: %d", ret); + ret - 1; + } else if (l_enc_response) { + dap_client_pvt_t * l_client_pvt = a_exec_cmd_request->client_pvt; + l_client_pvt->http_client = NULL; + size_t l_response_dec_size_max = l_enc_response_size ? l_enc_response_size * 2 + 16 : 0; + *a_response = l_enc_response_size ? DAP_NEW_Z_SIZE(char, l_response_dec_size_max) : NULL; + *a_response_size = 0; + if(l_enc_response_size) + *a_response_size = dap_enc_decode(l_client_pvt->session_key, + l_enc_response, l_enc_response_size, + *a_response, l_response_dec_size_max, + DAP_ENC_DATA_TYPE_RAW); + if (l_enc_response) { + DAP_DEL_Z(l_enc_response); + } + } else { + log_it(L_ERROR, "Empty response in json-rpc"); + ret -2; + } + + return ret; +} + static int dap_chain_exec_cmd_list_wait(struct exec_cmd_request *a_exec_cmd_request, int a_timeout_ms) { #ifdef DAP_OS_WINDOWS @@ -154,8 +214,9 @@ char * dap_json_rpc_enc_request(dap_client_pvt_t* a_client_internal, char * a_re char ** a_path, size_t * a_enc_request_size, char * a_custom_header) { const char * l_sub_url = dap_strdup_printf("channels=%s,enc_type=%d,enc_key_size=%zu,enc_headers=%d", - a_client_internal->client->active_channels, a_client_internal->session_key_type, - a_client_internal->session_key_block_size, 0); + a_client_internal->client->active_channels, + a_client_internal->session_key_type, + a_client_internal->session_key_block_size, 0); bool is_query_enc = true; const char * a_query = "type=tcp,maxconn=4"; @@ -201,7 +262,7 @@ char * dap_json_rpc_enc_request(dap_client_pvt_t* a_client_internal, char * a_re size_t l_path_size= l_query_enc_size_max + l_sub_url_enc_size_max + 1; const char * path = "exec_cmd"; *a_path = DAP_NEW_Z_SIZE(char, l_path_size); - a_path[0] = '\0'; + (*a_path)[0] = '\0'; if(path) { if(l_sub_url_size){ if(l_query_size){ @@ -218,11 +279,14 @@ char * dap_json_rpc_enc_request(dap_client_pvt_t* a_client_internal, char * a_re size_t l_size_required = a_client_internal->session_key_id ? strlen(a_client_internal->session_key_id) + 40 : 40; a_custom_header = DAP_NEW_Z_SIZE(char, l_size_required); - size_t l_off = snprintf(a_custom_header, l_size_required, "KeyID: %s\r\n", a_client_internal->session_key_id ? a_client_internal->session_key_id : "NULL"); + size_t l_off = snprintf(a_custom_header, l_size_required, "KeyID: %s\r\n", + a_client_internal->session_key_id ? a_client_internal->session_key_id : "NULL"); if (a_client_internal->is_close_session) snprintf(a_custom_header + l_off, l_size_required - l_off, "%s\r\n", "SessionCloseAfterRequest: true"); + DAP_DEL_Z(l_sub_url_enc); DAP_DEL_Z(l_query_enc); + return l_request_enc; } @@ -459,20 +523,41 @@ int dap_json_rpc_request_send(dap_client_pvt_t* a_client_internal, dap_json_rpc char* l_custom_header = NULL, *l_path = NULL; char* l_request_data_str = dap_json_rpc_request_to_http_str(a_request, &l_request_data_size); + if (!l_request_data_str) { + return -1; + } char * l_enc_request = dap_json_rpc_enc_request(a_client_internal, l_request_data_str, l_request_data_size, &l_path, &l_enc_request_size, l_custom_header); - + DAP_DEL_Z(l_request_data_str); + if (!l_enc_request || !l_path) { + DAP_DEL_Z(l_request_data_str); + DAP_DEL_Z(l_custom_header); + return -2; + } struct exec_cmd_request* l_exec_cmd_request = s_exec_cmd_request_init(a_client_internal); + if (!l_exec_cmd_request) { + DAP_DEL_Z(l_custom_header); + DAP_DEL_Z(l_path); + DAP_DEL_Z(l_enc_request); + return -3; + } - a_client_internal->http_client = dap_client_http_request(a_client_internal->worker, a_client_internal->client->link_info.uplink_addr, - a_client_internal->client->link_info.uplink_port, - "POST", "application/json", - l_path, l_enc_request, l_enc_request_size, NULL, - s_exec_cmd_response_handler, s_exec_cmd_error_handler, l_exec_cmd_request, l_custom_header); + a_client_internal->http_client = dap_client_http_request( + a_client_internal->worker, + a_client_internal->client->link_info.uplink_addr, + a_client_internal->client->link_info.uplink_port, + "POST", "application/json", + l_path, l_enc_request, l_enc_request_size, NULL, + s_exec_cmd_response_handler, s_exec_cmd_error_handler, + l_exec_cmd_request, l_custom_header); int l_ret = dap_chain_exec_cmd_list_wait(l_exec_cmd_request, 10000); - a_response = dap_strdup(l_exec_cmd_request->response); + switch (l_ret) { + case EXEC_CMD_OK{ + + } + DAP_DEL_Z(l_custom_header); DAP_DEL_Z(l_path); DAP_DEL_Z(l_enc_request); - return 0; + return l_ret; } -- GitLab