/// <summary>
        /// Send a request, with retry
        /// </summary>
        protected ResponseEx Send(RequestFluent request)
        {
            // send
            var response = request.Send();

            // if failed
            if (response.StatusHttp == HttpStatusCode.InternalServerError)
            {
                // retry
                response = request.Send();
            }

            return(response);
        }
        /// <summary>
        /// Send a request, with retry
        /// </summary>
        protected ResponseEx Send <TContent>(RequestFluent request, TContent content, HttpVerb verb = HttpVerb.Post)
            where TContent : class
        {
            // set the verb
            request.Verb(verb);

            // send
            var response = request.SendAsJson(content);

            // if failed
            if (response.StatusHttp == HttpStatusCode.InternalServerError)
            {
                // retry
                response = request.SendAsJson(content);
            }

            return(response);
        }
        /// <summary>
        /// Create a request
        /// </summary>
        protected RequestReport CreateRequest(out RequestFluent request, string endpoint)
        {
            RequestReport result = null;

            request = null;

            // if we have a valid root uri
            if (UriRoot != null)
            {
                // if we have a given url
                if (!string.IsNullOrEmpty(endpoint))
                {
                    try
                    {
                        // combine the urls
                        endpoint = new Uri(UriRoot, new Uri(endpoint, UriKind.Relative)).ToString();

                        // if we got a provider
                        if (this._provider != null)
                        {
                            request = this._provider.CreateRequest(endpoint);
                        }
                        // if no provided
                        else
                        {
                            request = RequestFluent.Create(endpoint);
                        }
                    }
                    catch (Exception exc)
                    {
                        // error
                        result = new RequestReport
                        {
                            Code      = "Api.Client.CreateRequest.Exception",
                            Message   = "ProAbono client library internal error - " + exc.Message,
                            Exception = exc.ToString()
                        };
                    }
                }
                // if no url
                else
                {
                    // error
                    result = new RequestReport
                    {
                        Code    = "Api.Client.CreateRequest.NoEndpoint",
                        Message = "ProAbono client library internal error suspected - Endpoint is missing"
                    };
                }
            }
            // if no root URI
            else
            {
                // error
                result = new RequestReport
                {
                    Code    = "Api.Client.CreateRequest.NoRootUrl",
                    Message = "Configuration error suspected - ProAbono API root url not found"
                };
            }
            return(result);
        }