Ejemplo n.º 1
0
        /// <summary>
        /// Asynchronously downloads a string from the specified url.
        /// </summary>
        /// <param name="url">The URL.</param>
        /// <param name="method">The method.</param>
        /// <param name="acceptEncoded">if set to <c>true</c> accept encoded response.</param>
        /// <param name="postdata">The post data.</param>
        /// <param name="dataCompression">The post data compression method.</param>
        public static async Task<DownloadResult<String>> DownloadStringAsync(Uri url, HttpMethod method = null, bool acceptEncoded = false,
            string postdata = null, DataCompression dataCompression = DataCompression.None)
        {
            string urlValidationError;
            if (!IsValidURL(url, out urlValidationError))
                throw new ArgumentException(urlValidationError);

            HttpPostData postData = String.IsNullOrWhiteSpace(postdata) ? null : new HttpPostData(postdata, dataCompression);
            HttpClientServiceRequest request = new HttpClientServiceRequest();
            try
            {
                HttpResponseMessage response =
                    await request.SendAsync(url, method, postData, dataCompression, acceptEncoded, StringAccept).ConfigureAwait(false);

                using (response)
                {
                    Stream stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);
                    return GetString(request.BaseUrl, stream);
                }
            }
            catch (HttpWebClientServiceException ex)
            {
                return new DownloadResult<String>(String.Empty, ex);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Asynchronously downloads a string from the specified url.
        /// </summary>
        /// <param name="url">The URL.</param>
        /// <param name="method">The method.</param>
        /// <param name="acceptEncoded">if set to <c>true</c> accept encoded response.</param>
        /// <param name="postdata">The post data.</param>
        /// <param name="dataCompression">The post data compression method.</param>
        /// <param name="token">The ESI token, or null if none is used.</param>
        public static async Task <DownloadResult <string> > DownloadStringAsync(Uri url,
                                                                                HttpMethod method = null, bool acceptEncoded = false, string postdata = null,
                                                                                DataCompression dataCompression = DataCompression.None, string token = null)
        {
            string urlValidationError;

            if (!IsValidURL(url, out urlValidationError))
            {
                throw new ArgumentException(urlValidationError);
            }

            HttpPostData             postData = string.IsNullOrWhiteSpace(postdata) ? null : new HttpPostData(postdata, dataCompression);
            HttpClientServiceRequest request  = new HttpClientServiceRequest();

            request.AuthToken       = token;
            request.AcceptEncoded   = acceptEncoded;
            request.DataCompression = dataCompression;
            try
            {
                HttpResponseMessage response = await request.SendAsync(url, method, postData,
                                                                       StringAccept).ConfigureAwait(false);

                using (response)
                {
                    Stream stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);

                    return(GetString(request.BaseUrl, stream, response));
                }
            }
            catch (HttpWebClientServiceException ex)
            {
                return(new DownloadResult <string>(string.Empty, ex));
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="HttpClientServiceRequest"/> class.
        /// </summary>
        public HttpClientServiceRequest()
        {
            m_redirectsRemaining = HttpWebClientServiceState.MaxRedirects;
            DataCompression      = DataCompression.None;
            m_acceptEncoded      = false;
            AuthToken            = null;

            // Pull the timeout from the settings
            TimeSpan timeoutSetting = TimeSpan.FromSeconds(Settings.Updates.HttpTimeout);

            s_timeout = timeoutSetting <TimeSpan.FromSeconds(1) || timeoutSetting> TimeSpan.FromMinutes(5)
                ? TimeSpan.FromSeconds(20)
                : timeoutSetting;
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Initializes a new instance of the <see cref="HttpPostData"/> class.
        /// </summary>
        /// <param name="data">The data.</param>
        /// <param name="dataCompression">The compression.</param>
        public HttpPostData(string data, DataCompression dataCompression = DataCompression.None)
        {
            m_data = data;

            byte[] encoded = Encoding.UTF8.GetBytes(data);
            switch (dataCompression)
            {
                case DataCompression.Gzip:
                    m_content = Util.GZipCompress(encoded);
                    break;
                case DataCompression.Deflate:
                    m_content = Util.DeflateCompress(encoded);
                    break;
                case DataCompression.None:
                    m_content = encoded;
                    break;
                default:
                    throw new NotImplementedException();
            }
        }
Ejemplo n.º 5
0
 /// <summary>
 /// Synchronously downloads a string from the specified url.
 /// </summary>
 /// <param name="url">The URL.</param>
 /// <param name="method">The method.</param>
 /// <param name="acceptEncoded">if set to <c>true</c> accept encoded response.</param>
 /// <param name="postdata">The post data.</param>
 /// <param name="dataCompression">The post data compression method.</param>
 /// <returns></returns>
 public static DownloadResult<String> DownloadString(Uri url, HttpMethod method = null, bool acceptEncoded = false,
     string postdata = null, DataCompression dataCompression = DataCompression.None)
     => DownloadStringAsync(url, method, acceptEncoded, postdata, dataCompression).Result;
Ejemplo n.º 6
0
        /// <summary>
        /// Asynchronously sends a request to the specified url.
        /// </summary>
        /// <param name="url">The URL.</param>
        /// <param name="method">The method.</param>
        /// <param name="postData">The post data.</param>
        /// <param name="dataCompression">The data compression.</param>
        /// <param name="acceptEncoded">if set to <c>true</c> accept encoded response.</param>
        /// <param name="accept">The accept.</param>
        /// <returns></returns>
        public async Task<HttpResponseMessage> SendAsync(Uri url, HttpMethod method, HttpPostData postData,
            DataCompression dataCompression,
            bool acceptEncoded, string accept)
        {
            while (true)
            {
                // Store params
                m_url = url;
                m_accept = accept;
                m_postData = postData;
                m_method = postData == null || method == null ? HttpMethod.Get : method;
                m_dataCompression = postData == null ? DataCompression.None : dataCompression;
                m_acceptEncoded = acceptEncoded;

                HttpResponseMessage response = null;
                try
                {
                    HttpClientHandler httpClientHandler = GetHttpClientHandler();
                    HttpRequestMessage request = GetHttpRequest();
                    response = await GetHttpResponseAsync(httpClientHandler, request).ConfigureAwait(false);

                    EnsureSuccessStatusCode(response);
                }
                catch (HttpWebClientServiceException)
                {
                    throw;
                }
                catch (HttpRequestException ex)
                {
                    if (ex.InnerException is WebException)
                        throw HttpWebClientServiceException.HttpWebClientException(url, ex.InnerException);

                    if (response == null)
                        throw HttpWebClientServiceException.Exception(url, ex);

                    if (response.StatusCode != HttpStatusCode.Redirect && response.StatusCode != HttpStatusCode.MovedPermanently)
                    {
                        throw HttpWebClientServiceException.HttpWebClientException(url, ex, response.StatusCode);
                    }
                }
                catch (WebException ex)
                {
                    // We should not get a WebException here but keep this as extra precaution
                    throw HttpWebClientServiceException.HttpWebClientException(url, ex);
                }
                catch (TaskCanceledException ex)
                {
                    // We throw a request timeout if the task gets cancelled due to the timeout setting
                    throw HttpWebClientServiceException.HttpWebClientException(url, new HttpRequestException(ex.Message),
                        HttpStatusCode.RequestTimeout);
                }
                catch (Exception ex)
                {
                    throw HttpWebClientServiceException.Exception(url, ex);
                }

                if (response.StatusCode != HttpStatusCode.Redirect && response.StatusCode != HttpStatusCode.MovedPermanently)
                {
                    return response;
                }

                // When the address has been redirected, connects to the redirection
                Uri target = response.Headers.Location;
                response.Dispose();

                if (m_redirectsRemaining-- <= 0)
                    throw HttpWebClientServiceException.RedirectsExceededException(m_url);

                m_referrer = m_url;
                m_url = new Uri(m_url, target);
                url = m_url;
            }
        }
Ejemplo n.º 7
0
 /// <summary>
 ///     Initializes a new instance of the <see cref="DataHead" /> class
 /// </summary>
 /// <param name="compression">Preferred compression</param>
 public DataHead(DataCompression compression)
 {
     Compression = compression;
     Size        = DataHeadSize;
 }
Ejemplo n.º 8
0
        /// <summary>
        /// Asynchronously downloads an xml file from the specified url.
        /// </summary>
        /// <param name="url">The URL.</param>
        /// <param name="method">The method.</param>
        /// <param name="acceptEncoded">if set to <c>true</c> accept encoded response.</param>
        /// <param name="postdata">The post data.</param>
        /// <param name="dataCompression">The post data compression method.</param>
        public static async Task <DownloadResult <IXPathNavigable> > DownloadXmlAsync(Uri url, HttpMethod method = null,
                                                                                      bool acceptEncoded         = false, string postdata = null, DataCompression dataCompression = DataCompression.None)
        {
            string urlValidationError;

            if (!IsValidURL(url, out urlValidationError))
            {
                throw new ArgumentException(urlValidationError);
            }

            HttpPostData             postData = String.IsNullOrWhiteSpace(postdata) ? null : new HttpPostData(postdata, dataCompression);
            HttpClientServiceRequest request  = new HttpClientServiceRequest();

            try
            {
                HttpResponseMessage response = await request
                                               .SendAsync(url, method, postData, dataCompression, acceptEncoded, XmlAccept)
                                               .ConfigureAwait(false);

                using (response)
                {
                    Stream stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);

                    return(GetXmlDocument(request.BaseUrl, stream));
                }
            }
            catch (HttpWebClientServiceException ex)
            {
                return(new DownloadResult <IXPathNavigable>(new XmlDocument(), ex));
            }
        }