Exemplo n.º 1
0
        public async Task <HttpWebResponse> GetResponse(HttpRequest options, bool sendFailureResponse = false)
        {
            options.CancellationToken.ThrowIfCancellationRequested();

            var httpWebRequest = _requestFactory.Create(options);

            ApplyHeaders(options.RequestHeaders, httpWebRequest);

            if (options.RequestStream != null)
            {
                httpWebRequest.ContentType = options.RequestContentType;
                _requestFactory.SetContentLength(httpWebRequest, options.RequestStream.Length);

                using (var requestStream = await _requestFactory.GetRequestStreamAsync(httpWebRequest).ConfigureAwait(false))
                {
                    await options.RequestStream.CopyToAsync(requestStream).ConfigureAwait(false);
                }
            }
            else if (!string.IsNullOrEmpty(options.RequestContent) ||
                     string.Equals(options.Method, "post", StringComparison.OrdinalIgnoreCase))
            {
                var bytes = Encoding.UTF8.GetBytes(options.RequestContent ?? string.Empty);

                httpWebRequest.ContentType = options.RequestContentType ?? "application/x-www-form-urlencoded";
                _requestFactory.SetContentLength(httpWebRequest, bytes.Length);

                using (var requestStream = await _requestFactory.GetRequestStreamAsync(httpWebRequest).ConfigureAwait(false))
                {
                    await requestStream.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false);
                }
            }

            Logger.LogDebug(options.Method + " {0}", options.Url);

            var requestTime = DateTime.Now;

            try
            {
                options.CancellationToken.ThrowIfCancellationRequested();

                var response = await _requestFactory.GetResponseAsync(httpWebRequest, options.Timeout).ConfigureAwait(false);

                var httpResponse = (HttpWebResponse)response;

                OnResponseReceived(options.Url, options.Method, httpResponse, requestTime);

                EnsureSuccessStatusCode(httpResponse);

                options.CancellationToken.ThrowIfCancellationRequested();

                return(httpResponse);
            }
            catch (OperationCanceledException ex)
            {
                var exception = GetCancellationException(options.Url, options.CancellationToken, ex);

                throw exception;
            }
            catch (Exception ex)
            {
                if (sendFailureResponse)
                {
                    var webException = ex as WebException ?? ex.InnerException as WebException;
                    if (webException != null)
                    {
                        if (webException.Response is HttpWebResponse response)
                        {
                            return(response);
                        }
                    }
                }

                throw GetExceptionToThrow(ex, options, requestTime);
            }
        }