예제 #1
0
        public void TestHttpClientExtensions()
        {
            using var content = HttpClientExtensions.CreateJsonContent((byte) 0);
            Assert.IsNotNull(content);
            var mime = content.Headers.ContentType.ToString().YieldSplit(new List <string> {
                " "
            }).FirstOrDefault().YieldSplit(";", StringSplitOptions.RemoveEmptyEntries).FirstOrDefault();

            Assert.AreEqual(Web.WebFormat.JsonMIME, mime);

            var oauth = new OAuthClient("someone", "secret", null);

            oauth.Scope.Add("test");
            oauth.Scope.Add("another");
            Assert.AreEqual("test another", oauth.ScopeString);
            oauth.ScopeString = "query";
            var oneSec = TimeSpan.FromSeconds(1);

            oauth.Timeout = oneSec;
            Assert.AreEqual(1, oauth.Scope.Count);
            var client = oauth.Create <JsonModel>();

            Assert.AreEqual(oneSec, client.Timeout);
        }
예제 #2
0
        /// <summary>
        /// Sends an HTTP request and gets the result serialized by JSON.
        /// </summary>
        /// <param name="request">The HTTP request message.</param>
        /// <param name="callback">An optional callback raised on data received.</param>
        /// <param name="cancellationToken">The optional cancellation token.</param>
        /// <returns>A result serialized.</returns>
        /// <exception cref="ArgumentNullException">The request was null.</exception>
        /// <exception cref="FailedHttpException">HTTP response contains failure status code.</exception>
        /// <exception cref="HttpRequestException">The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout.</exception>
        /// <exception cref="InvalidOperationException">The task is cancelled.</exception>
        /// <exception cref="ObjectDisposedException">The inner HTTP web client instance has been disposed.</exception>
        public async Task <T> SendAsync(HttpRequestMessage request, Action <ReceivedEventArgs <T> > callback, CancellationToken cancellationToken = default)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request), "request should not be null.");
            }
            if (Client == null && !IsNewHttpClientByDefault)
            {
                Client = new HttpClient();
            }
            var client  = Client ?? new HttpClient();
            var timeout = Timeout;

            if (timeout.HasValue)
            {
                try
                {
                    client.Timeout = timeout.Value;
                }
                catch (ArgumentException)
                {
                }
            }

            var maxBufferSize = MaxResponseContentBufferSize;

            if (maxBufferSize.HasValue)
            {
                try
                {
                    client.MaxResponseContentBufferSize = maxBufferSize.Value;
                }
                catch (ArgumentException)
                {
                }
            }

            Sending?.Invoke(this, new SendingEventArgs(request));
            cancellationToken.ThrowIfCancellationRequested();
            OnSend(request);
            HttpResponseMessage resp = null;
            T valueResult;

            try
            {
                var result = await Tasks.RetryExtensions.ProcessAsync(RetryPolicy, async (CancellationToken cancellation) =>
                {
                    resp = await client.SendAsync(request, cancellationToken);
                    if (!SerializeEvenIfFailed && !resp.IsSuccessStatusCode)
                    {
                        throw FailedHttpException.Create(resp, "Failed to send JSON HTTP web request because of unsuccess status code.");
                    }
                    var obj = Deserializer != null
                        ? await HttpClientExtensions.DeserializeAsync(resp.Content, Deserializer)
                        : await HttpClientExtensions.DeserializeJsonAsync <T>(resp.Content);
                    return(obj);
                }, GetExceptionInternal, cancellationToken);

                valueResult = result.Result;
            }
            catch (HttpRequestException)
            {
                OnReceive(default, resp);