diff --git a/dap-sdk/net/client/dap_client_http.c b/dap-sdk/net/client/dap_client_http.c
index e5f1ae6bb283e48bb3d7c53d509820bb3caf8cfc..3d13fa40d72a9229a9de0d0f879609aa42fb3d8a 100644
--- a/dap-sdk/net/client/dap_client_http.c
+++ b/dap-sdk/net/client/dap_client_http.c
@@ -33,6 +33,7 @@
 //#include <bits/socket_type.h>
 #endif
 #include <unistd.h>
+#include <errno.h>
 
 #include "dap_common.h"
 #include "dap_strfuncs.h"
@@ -258,6 +259,52 @@ static void s_http_delete(dap_events_socket_t *a_es, void *arg)
     a_es->_inheritor = NULL;
 }
 
+/**
+ * @brief resolve_host
+ * @param a_host hostname
+ * @param ai_family AF_INET  for ipv4 or AF_INET6 for ipv6
+ * @param a_addr_out out addr (struct in_addr or struct in6_addr)
+ * @param return 0 of OK, <0 Error
+ */
+int resolve_host(const char *a_host, int ai_family, struct sockaddr *a_addr_out)
+{
+    struct addrinfo l_hints, *l_res;
+    void *l_cur_addr = NULL;
+
+    memset(&l_hints, 0, sizeof(l_hints));
+    l_hints.ai_family = PF_UNSPEC;
+    l_hints.ai_socktype = SOCK_STREAM;
+    l_hints.ai_flags |= AI_CANONNAME;
+
+    int errcode = getaddrinfo(a_host, NULL, &l_hints, &l_res);
+    if(errcode != 0)
+            {
+        return -2;
+    }
+    while(l_res)
+    {
+        if(ai_family == l_res->ai_family)
+            switch (l_res->ai_family)
+            {
+            case AF_INET:
+                l_cur_addr = &((struct sockaddr_in *) l_res->ai_addr)->sin_addr;
+                memcpy(a_addr_out, l_cur_addr, sizeof(struct in_addr));
+                break;
+            case AF_INET6:
+                l_cur_addr = &((struct sockaddr_in6 *) l_res->ai_addr)->sin6_addr;
+                memcpy(a_addr_out, l_cur_addr, sizeof(struct in6_addr));
+                break;
+            }
+        if(l_cur_addr) {
+            freeaddrinfo(l_res);
+            return 0;
+        }
+        l_res = l_res->ai_next;
+    }
+    freeaddrinfo(l_res);
+    return -1;
+}
+
 /**
  * @brief dap_client_http_request_custom
  * @param a_uplink_addr
@@ -309,35 +356,37 @@ void* dap_client_http_request_custom(const char *a_uplink_addr, uint16_t a_uplin
     //l_client_http_internal->socket = l_socket;
     l_client_http_internal->obj = a_obj;
 
-    // add to dap_worker
-    dap_events_socket_create_after(l_ev_socket);
-
-    // connect
     struct sockaddr_in l_remote_addr;
     memset(&l_remote_addr, 0, sizeof(l_remote_addr));
+    // get struct in_addr from ip_str
+    inet_pton(AF_INET, a_uplink_addr, &(l_remote_addr.sin_addr));
+    //Resolve addr if
+    if(!l_remote_addr.sin_addr.s_addr) {
+        if(resolve_host(a_uplink_addr, AF_INET, &l_remote_addr.sin_addr) < 0) {
+            log_it(L_ERROR, "Wrong remote address '%s:%u'", a_uplink_addr, a_uplink_port);
+            dap_events_socket_kill_socket(l_ev_socket);
+            return NULL;
+        }
+    }
+    // connect
     l_remote_addr.sin_family = AF_INET;
     l_remote_addr.sin_port = htons(a_uplink_port);
-    if(inet_pton(AF_INET, a_uplink_addr, &(l_remote_addr.sin_addr)) < 0) {
-        log_it(L_ERROR, "Wrong remote address '%s:%u'", a_uplink_addr, a_uplink_port);
-        //close(l_ev_socket->socket);
-        dap_events_socket_kill_socket(l_ev_socket);
-        return NULL;
+    int l_err = 0;
+    if((l_err = connect(l_socket, (struct sockaddr *) &l_remote_addr, sizeof(struct sockaddr_in))) != -1) {
+        //s_set_sock_nonblock(a_client_pvt->stream_socket, false);
+        log_it(L_INFO, "Remote address connected (%s:%u) with sock_id %d", a_uplink_addr, a_uplink_port, l_socket);
+        // add to dap_worker
+        dap_events_socket_create_after(l_ev_socket);
     }
     else {
-        int l_err = 0;
-        if((l_err = connect(l_socket, (struct sockaddr *) &l_remote_addr, sizeof(struct sockaddr_in))) != -1) {
-            //s_set_sock_nonblock(a_client_pvt->stream_socket, false);
-            log_it(L_INFO, "Remote address connected (%s:%u) with sock_id %d", a_uplink_addr, a_uplink_port, l_socket);
-        }
-        else {
-            log_it(L_ERROR, "Remote address can't connected (%s:%u) with sock_id %d", a_uplink_addr, a_uplink_port, l_socket);
-            //l_ev_socket->no_close = false;
-            dap_events_socket_kill_socket(l_ev_socket);
-            //shutdown(l_ev_socket->socket, SHUT_RDWR);
-            //dap_events_socket_remove_and_delete(l_ev_socket, true);
-            //l_ev_socket->socket = 0;
-            return NULL;
-        }
+        log_it(L_ERROR, "Remote address can't connected (%s:%u) with sock_id %d err=%d", a_uplink_addr, a_uplink_port,
+                l_socket, errno);
+        //l_ev_socket->no_close = false;
+        dap_events_socket_kill_socket(l_ev_socket);
+        //shutdown(l_ev_socket->socket, SHUT_RDWR);
+        //dap_events_socket_remove_and_delete(l_ev_socket, true);
+        //l_ev_socket->socket = 0;
+        return NULL ;
     }
 
     //dap_client_pvt_t * l_client_pvt = (dap_client_pvt_t*) a_obj;
@@ -370,10 +419,18 @@ void* dap_client_http_request_custom(const char *a_uplink_addr, uint16_t a_uplin
     }
 
     // adding string for GET request
-    char *l_get_str = NULL;
     if(!dap_strcmp(a_method, "GET")) {
-        l_get_str = dap_strdup_printf("?%s", a_request);
+        char l_buf[1024];
+        dap_snprintf(l_buf, sizeof(l_buf), "User-Agent: Mozilla\r\n");
+        if(a_cookie) {
+            dap_snprintf(l_buf, sizeof(l_buf), "Cookie: %s\r\n", a_cookie);
+            l_request_headers = dap_string_append(l_request_headers, l_buf);
+        }
+
+        if(a_request)
+            l_get_str = dap_strdup_printf("?%s", a_request);
     }
+
     // send header
     dap_events_socket_write_f(l_ev_socket, "%s /%s%s HTTP/1.1\r\n"
             "Host: %s\r\n"