/// <summary>
        /// Send the request, given content is serialized in JSON into the request body
        /// </summary>
        public ResponseEx SendAsJson <TContent>(TContent content = null, int?timeout = null)
            where TContent : class
        {
            ResponseEx result = null;

            // prepare the request and force JSON
            string errorMessage;
            var    request = InnerPrepareRequest(new ContentType("application/json"), timeout, (content != null), out errorMessage);

            // if we have a request
            if ((request != null)
                // and no error message
                && string.IsNullOrEmpty(errorMessage))
            {
                // if we got a content
                if (content != null)
                {
                    // get the encoding
                    var encoding = (this._encoding ?? EncodingDefault);
                    // open the stream
                    using (var stream = request.GetRequestStream())
                    {
                        // serialize
                        if (!SerializerForJson.Serialize(stream, content, encoding))
                        {
                            // if serialization failed
                            errorMessage = "JSON serialization failed";
                        }
                    }
                }
            }

            // if we have a request
            if ((request != null)
                // and no error message
                && string.IsNullOrEmpty(errorMessage))
            {
                // then send the request and get the response
                result = ResponseEx.SendRequest(request);
            }
            // if we had an error at some point
            else
            {
                // then this is a failure
                result = ResponseEx.Failure(this._url, errorMessage);
            }
            return(result);
        }
        /// <summary>
        /// Send the request, get the result as a string
        /// </summary>
        public ResponseEx Send(string content = null, int?timeout = null)
        {
            ResponseEx result = null;

            // prepare the request
            string errorMessage;
            var    request = InnerPrepareRequest(null, timeout, !string.IsNullOrEmpty(content), out errorMessage);

            // if we have a request
            if ((request != null)
                // and no error message
                && string.IsNullOrEmpty(errorMessage))
            {
                // if we got a content
                if (!string.IsNullOrEmpty(content))
                {
                    // we really need an encoding here
                    var encoding = (this._encoding ?? EncodingDefault);
                    // convert content as a byte array
                    var buffer = encoding.GetBytes(content);
                    // set length
                    request.ContentLength = buffer.Length;
                    // open a stream
                    using (var stream = request.GetRequestStream())
                    {
                        // push the byte array
                        stream.Write(buffer, 0, buffer.Length);
                    }
                }
            }

            // if we have a request
            if ((request != null)
                // and no error message
                && string.IsNullOrEmpty(errorMessage))
            {
                // then send the request and get the response
                result = ResponseEx.SendRequest(request);
            }
            // if we had an error at some point
            else
            {
                // then this is a failure
                result = ResponseEx.Failure(this._url, errorMessage);
            }
            return(result);
        }