From 4502bfb9d80329c152df62f3036b5d61881fbe96 Mon Sep 17 00:00:00 2001
From: "alexey.stratulat" <alexey.stratulat@demlabs.net>
Date: Tue, 18 Jun 2024 08:29:37 +0000
Subject: [PATCH] Bugfix 11833

---
 modules/net/dap_chain_net_balancer.c      | 47 ++++++++++++++---------
 modules/net/dap_chain_net_node_list.c     |  4 +-
 modules/net/srv/dap_chain_net_srv_geoip.c |  3 +-
 3 files changed, 33 insertions(+), 21 deletions(-)

diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c
index 47b69087d4..c0a5e03f68 100644
--- a/modules/net/dap_chain_net_balancer.c
+++ b/modules/net/dap_chain_net_balancer.c
@@ -140,15 +140,42 @@ static void s_balancer_link_prepare_success(dap_chain_net_t* a_net, dap_chain_ne
     }
 }
 
+/**
+ * @brief callback to error in balancer request preparing
+ * @param a_request - balancer request
+ * @param a_host_addr - host addr
+ * @param a_errno - error code
+ */
+static void s_balancer_link_prepare_error(dap_balancer_link_request_t *a_request, const char *a_host_addr, uint16_t a_host_port, int a_errno)
+{
+    struct json_object *l_json = s_balancer_states_json_collect(a_request->net, a_host_addr, a_host_port);
+    char l_err_str[512] = { '\0' };
+    snprintf(l_err_str, sizeof(l_err_str)
+            , "Link from balancer %s:%u in net %s can't be prepared, errno %d"
+            , a_host_addr, a_host_port, a_request->net->pub.name, a_errno);
+    log_it(L_WARNING, "%s", l_err_str);
+    json_object_object_add(l_json, "errorMessage", json_object_new_string(l_err_str));
+    dap_notify_server_send_mt(json_object_get_string(l_json));
+    json_object_put(l_json);
+}
+
 /**
  * @brief callback to success http balancer request
  * @param a_response - response
  * @param a_response_size - a response size
  * @param a_arg - callback arg (l_balancer_request)
  */
-void s_http_balancer_link_prepare_success(void *a_response, size_t a_response_size, void *a_arg)
+void s_http_balancer_link_prepare_success(void *a_response,
+                                          size_t a_response_size, void *a_arg, http_status_code_t a_response_code)
 {
     dap_balancer_link_request_t *l_balancer_request = (dap_balancer_link_request_t *)a_arg;
+    if (a_response_code != 200) {
+        log_it(L_ERROR, "The server responded with code %d. It is not possible to install the link.", a_response_code);
+        s_balancer_link_prepare_error(l_balancer_request, l_balancer_request->host_addr, l_balancer_request->host_port, a_response_code);
+        l_balancer_request->request_info->request_time = dap_time_now();
+        DAP_DELETE(l_balancer_request);
+        return;
+    }
     dap_chain_net_links_t *l_link_full_node_list = (dap_chain_net_links_t *)a_response;
 
     size_t l_response_size_need = sizeof(dap_chain_net_links_t) + (sizeof(dap_link_info_t) * l_balancer_request->required_links_count);
@@ -162,24 +189,6 @@ void s_http_balancer_link_prepare_success(void *a_response, size_t a_response_si
     DAP_DELETE(l_balancer_request);
 }
 
-/**
- * @brief callback to error in balancer request preparing
- * @param a_request - balancer request
- * @param a_host_addr - host addr
- * @param a_errno - error code
- */
-static void s_balancer_link_prepare_error(dap_balancer_link_request_t *a_request, const char *a_host_addr, uint16_t a_host_port, int a_errno)
-{
-    struct json_object *l_json = s_balancer_states_json_collect(a_request->net, a_host_addr, a_host_port);
-    char l_err_str[512] = { '\0' };
-    snprintf(l_err_str, sizeof(l_err_str)
-                 , "Link from balancer %s:%u in net %s can't be prepared, errno %d"
-                 , a_host_addr, a_host_port, a_request->net->pub.name, a_errno);
-    log_it(L_WARNING, "%s", l_err_str);
-    json_object_object_add(l_json, "errorMessage", json_object_new_string(l_err_str));
-    dap_notify_server_send_mt(json_object_get_string(l_json));
-    json_object_put(l_json);
-}
 
 /**
  * @brief callback to error in http balancer request preparing
diff --git a/modules/net/dap_chain_net_node_list.c b/modules/net/dap_chain_net_node_list.c
index 85d7f8228f..87257742cb 100644
--- a/modules/net/dap_chain_net_node_list.c
+++ b/modules/net/dap_chain_net_node_list.c
@@ -167,7 +167,9 @@ void dap_chain_net_node_check_http_issue_link(dap_http_simple_t *a_http_simple,
     dap_http_simple_reply(a_http_simple, &l_response, sizeof(uint8_t));
 }
 
-static void s_net_node_link_prepare_success(void *a_response, size_t a_response_size, void *a_arg) {
+static void s_net_node_link_prepare_success(void *a_response, size_t a_response_size, void *a_arg,
+                                            http_status_code_t http_status_code) {
+    (void)http_status_code;
     struct node_link_request *l_node_list_request = (struct node_link_request *)a_arg;
     pthread_mutex_lock(&l_node_list_request->wait_mutex);
     l_node_list_request->response = *(uint8_t*)a_response;
diff --git a/modules/net/srv/dap_chain_net_srv_geoip.c b/modules/net/srv/dap_chain_net_srv_geoip.c
index a5ac230d49..633234a295 100644
--- a/modules/net/srv/dap_chain_net_srv_geoip.c
+++ b/modules/net/srv/dap_chain_net_srv_geoip.c
@@ -46,7 +46,8 @@ static char *s_geoip_db_file_path = NULL; // share/geoip/GeoLite2-City.mmdb
  * @param a_response_size
  * @param a_obj
  */
-static void m_request_getip_response(void * a_response, size_t a_response_size, void * a_obj)
+static void m_request_getip_response(void * a_response, size_t a_response_size, void * a_obj,
+                                     http_status_code_t http_status_code)
 {
     char *l_addr = (char *) a_obj;
     //printf("m_request_getip_response %s\n", a_response);
-- 
GitLab