public async Task <HttpResponseMessage> SendCommandAsync(HttpMethod method, Uri uri, object data, Func <StreamWriter, Task> onStreamReady, NetworkCredential credential)
        {
            var requestMessage = new HttpRequestMessage(method, uri);

            string encodedAuthorization = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(credential.UserName + ":" + credential.Password));

            requestMessage.Headers.Add("Authorization", "Basic " + encodedAuthorization);

            if (db.LoggerAvailable)
            {
                db.Log("==============================");
                db.Log(DateTime.Now.ToString());
                db.Log("sending http request:");
                db.Log($"url: {uri.ToString()}");
                db.Log($"method: {method.ToString()}");
                if (db.Setting.Logger.HttpHeaders)
                {
                    db.Log($"headers:");
                    foreach (var h in requestMessage.Headers)
                    {
                        db.Log($"{h.Key} : {string.Join(" ", h.Value)}");
                    }
                    foreach (var h in httpClient.DefaultRequestHeaders)
                    {
                        db.Log($"{h.Key} : {string.Join(" ", h.Value)}");
                    }
                }
                if (db.Setting.Logger.LogOnlyLightOperations == false)
                {
                    db.Log($"data: {new DocumentSerializer(db).SerializeWithoutReader(data)}");
                }
            }

            if (onStreamReady == null && data != null)
            {
                requestMessage.Content = new JsonContent(db, data);
            }
            if (onStreamReady != null)
            {
                requestMessage.Content = new GenericStreamContent(db, onStreamReady);
            }

            var responseMessage = await httpClient.SendAsync(requestMessage).ConfigureAwait(false);

            if (db.LoggerAvailable)
            {
                db.Log("==============================");
                db.Log(DateTime.Now.ToString());
                db.Log("received http response:");
                db.Log($"url: {uri.ToString()}");
                db.Log($"status-code: {responseMessage.StatusCode.ToString()}");
                if (db.Setting.Logger.HttpHeaders)
                {
                    db.Log($"headers:");
                    foreach (var h in responseMessage.Headers)
                    {
                        db.Log($"{h.Key} : {string.Join(" ", h.Value)}");
                    }
                }
                if (db.Setting.Logger.LogOnlyLightOperations == false)
                {
                    db.Log($"data: {new DocumentSerializer(db).SerializeWithoutReader(await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false))}");
                }
            }

            if (responseMessage.StatusCode == HttpStatusCode.Unauthorized)
            {
                throw new AuthenticationException($"The user '{credential.UserName}' is not authorized");
            }

            return(responseMessage);
        }