public async Task <IConnectionResponse> SendAsync(Stream body = null)
        {
            handlerHook(handler, settings);

            if (body != null)
            {
                messageHook = (messageRequest, s) =>
                {
                    messageRequest.Content = new StreamContent(body);
                    messageRequest.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType);
                } +messageHook;
            }

            HttpRequestMessage msg = new HttpRequestMessage();

            messageHook(msg, settings);


            clientHook(httpClient, settings);
            var httpResponse = await httpClient.SendAsync(msg);

            responseHook(httpResponse, settings);
            var response = new PrivateResponse(httpResponse);

            if ((successCondition != null && successCondition((int)httpResponse.StatusCode)) || (successCondition == null && httpResponse.IsSuccessStatusCode))
            {
                return(response);
            }
            else
            {
                throw new ConnectionResponseException(response, "Success conditions not met");
            }
        }
        internal PrivateConnection(IServerSettings settings, Func <HttpClientHandler> handlerFactory, ILogger logger)
        {
            this.settings = settings;
            this.logger   = logger;

            handler      = handlerFactory();
            httpClient   = new HttpClient(handler);
            messageHook  = DefaultMessageHook;
            clientHook   = DefaultClientHook;
            handlerHook  = DefaultHandlerHook;
            responseHook = DefaultResponseHook;
        }
 internal PrivateConnection(ServerSettings settings, Func <CookieContainer> cookieFactory)
 {
     this.settings = settings;
     handler       = new HttpClientHandler {
         CookieContainer = cookieFactory()
     };
     httpClient   = new HttpClient(handler);
     messageHook  = DefaultMessageHook;
     clientHook   = DefaultClientHook;
     handlerHook  = DefaultHandlerHook;
     responseHook = DefaultResponseHook;
 }
        public async Task <IConnectionResponse> SendAsync(Stream body = null)
        {
            logger.LogTrace("Sending HTTP Request");
            handlerHook(handler, settings);

            if (body != null)
            {
                messageHook = (messageRequest, s) =>
                {
                    messageRequest.Content = new StreamContent(body);
                    messageRequest.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType)
                    {
                        CharSet = "utf-8"
                    };
                } +messageHook;
            }

            HttpRequestMessage msg = new HttpRequestMessage();

            messageHook(msg, settings);

            clientHook(httpClient, settings);

            logger.LogDebug("Uri: {0} {1}", msg.RequestUri, msg.Method);
            logger.LogTrace("Request Cookies State: {0}", handler.CookieContainer.GetCookies(settings.ServerUrl).AllToString());

            var httpResponse = await httpClient.SendAsync(msg);

            logger.LogDebug("Response Cookies State: {0}", handler.CookieContainer.GetCookies(settings.ServerUrl).AllToString());
            responseHook(httpResponse, settings);
            var response = new PrivateResponse(httpResponse, logger);

            if ((successCondition != null && successCondition((int)httpResponse.StatusCode)) || (successCondition == null && httpResponse.IsSuccessStatusCode))
            {
                // log location header
                if (httpResponse.Headers.Location != null)
                {
                    logger.LogDebug("Status code: {0}, Location: {1}", httpResponse.StatusCode, httpResponse.Headers.Location);
                }
                return(response);
            }
            else
            {
                logger.LogInformation($"Condition not met, failing. HTTP Response code: {response.Code}");
                throw new ConnectionResponseException(response, "Success conditions not met");
            }
        }
 public PrivateConnection AppendHook(HttpRequestMessageHook hook)
 {
     messageHook += hook;
     return(this);
 }