Exemplo n.º 1
0
        private static void AddBody(RequestOption request, HttpRequestMessage requestMessage)
        {
            if (!string.IsNullOrWhiteSpace(request.Body))
            {
                requestMessage.Content = new StringContent(request.Body);

                AddContentHeaders(request, requestMessage);
            }
        }
Exemplo n.º 2
0
        public Task <IActionResult> Post([FromBody] RequestOption request)
        {
            if (request is null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            return(this.HandlePostRequest(request));
        }
Exemplo n.º 3
0
        /// <summary>
        /// Post data to service.
        /// </summary>
        /// <param name="request">The request data.</param>
        /// <returns><see cref="HttpResponseMessage"/> class.</returns>
        public Task <HttpResponseMessage> SendAsync(RequestOption request)
        {
            if (request is null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            return(this.ExecuteAsync(request));
        }
Exemplo n.º 4
0
 private static void AddHeaders(RequestOption request, HttpRequestMessage requestMessage)
 {
     if (request.Headers != null && request.Headers.Count > 0)
     {
         var headers = request.Headers;
         foreach (var header in headers)
         {
             requestMessage.Headers.Add(header.Key, header.Value);
         }
     }
 }
Exemplo n.º 5
0
        private static HttpRequestMessage CreateRequestMessage(RequestOption request)
        {
            var requestMessage = new HttpRequestMessage
            {
                RequestUri = request.RequestUri,
                Method     = new HttpMethod(request.Method),
            };

            AddHeaders(request, requestMessage);
            AddBody(request, requestMessage);

            return(requestMessage);
        }
Exemplo n.º 6
0
        private async Task <IActionResult> HandlePostRequest(RequestOption request)
        {
            Console.WriteLine($"Request {request.Id} received");

            await Semaphore.WaitAsync().ConfigureAwait(false);

            // Critical code to ensure only single request goes in asynchrously.
            try
            {
                int numberOfRequestAllowed = this.cache.Get <int>(RequestAllowedKey);
                if (numberOfRequestAllowed == 0)
                {
                    var res = new ObjectResult(new Response()
                    {
                        Id = request.Id
                    })
                    {
                        StatusCode = 429,
                    };

                    this.HttpContext.Response.Headers.Add("Retry-After", new StringValues(TimeSpan.FromSeconds(5).ToString()));
                    Console.WriteLine($"Request {request.Id} rejected with 429");

                    return(res);
                }
                else
                {
                    this.cache.Set(RequestAllowedKey, numberOfRequestAllowed - 1);
                }
            }
            finally
            {
                Semaphore.Release();
            }

            await Task.Delay(TimeSpan.FromSeconds(1)).ConfigureAwait(false);

            this.cache.Set(RequestAllowedKey, this.cache.Get <int>(RequestAllowedKey) + 1);

            Console.WriteLine($"Request {request.Id} completed with 200");

            return(new OkObjectResult(new Response()
            {
                Id = request.Id
            }));
        }
Exemplo n.º 7
0
        public async Task <ResponseContext <TResponse> > PostAsync <TRequest, TResponse>(string url, RequestContext <TRequest> requestContext, RequestOption option = null)
            where TRequest : IRequestData
            where TResponse : IResponseData
        {
            var req = new RestRequest(CallTo(url));

            if (option == null)
            {
                req.Method = Method.POST;
            }
            else
            {
                switch (option.Method)
                {
                case RequestMethod.Delete:
                    req.Method = Method.DELETE;
                    break;

                case RequestMethod.Patch:
                    req.Method = Method.PATCH;
                    break;

                case RequestMethod.Put:
                    req.Method = Method.PUT;
                    break;

                default:
                    req.Method = Method.POST;
                    break;
                }
            }

            req.AddParameter("application/json; charset=utf-8", JsonConvert.SerializeObject(requestContext), ParameterType.RequestBody);

            if (!option?.SkipAuth ?? false)
            {
                AddAuthenticationToken(requestContext.AuthToken);
            }

            var res = await Client.ExecuteTaskAsync <ResponseContext <TResponse> >(req);

            return(ProcessResult(res));
        }
Exemplo n.º 8
0
        public async Task <ResponseContext <TResponse> > GetAsync <TResponse>(string url, RequestOption option = null)
            where TResponse : IResponseData
        {
            var req = new RestRequest(CallTo(url));

            if (option?.RequestParams?.Keys?.Count > 0)
            {
                foreach (var pair in option.RequestParams)
                {
                    req.AddQueryParameter(pair.Key, pair.Value.ToString(), true);
                }
            }

            var res = await Client.ExecuteTaskAsync <ResponseContext <TResponse> >(req);

            return(ProcessResult(res));
        }
Exemplo n.º 9
0
        private Task <HttpResponseMessage> ExecuteAsync(RequestOption request)
        {
            var requestMessage = CreateRequestMessage(request);

            return(this.client.SendAsync(requestMessage));
        }
Exemplo n.º 10
0
 public RequestOptionAbility(RequestOption requestOption, IAbility ability)
 {
     RequestOption = requestOption;
     Ability       = ability;
 }