Example #1
0
        private async Task <string> RequestAsync(HttpMethod method, BinanceHttpRequest request, CancellationToken token = default)
        {
            Throw.IfNull(request, nameof(request));

            token.ThrowIfCancellationRequested();

            var requestMessage = request.CreateMessage(method);

            Logger?.LogDebug($"{nameof(BinanceHttpClient)}.{nameof(RequestAsync)}: [{method.Method}] \"{requestMessage.RequestUri}\"");

            using (var response = await _httpClient.SendAsync(requestMessage, token).ConfigureAwait(false))
            {
                if (response.IsSuccessStatusCode)
                {
                    var json = await response.Content.ReadAsStringAsync()
                               .ConfigureAwait(false);

                    OnMessage(json, requestMessage.RequestUri.AbsoluteUri);

                    return(json);
                }

                if (response.StatusCode == HttpStatusCode.GatewayTimeout)
                {
                    throw new BinanceUnknownStatusException();
                }

                var error = await response.Content.ReadAsStringAsync()
                            .ConfigureAwait(false);

                var    errorCode    = 0;
                string errorMessage = null;

                // ReSharper disable once InvertIf
                if (!string.IsNullOrWhiteSpace(error) && error.IsJsonObject())
                {
                    try // to parse server error response.
                    {
                        var jObject = JObject.Parse(error);

                        errorCode    = jObject["code"]?.Value <int>() ?? 0;
                        errorMessage = jObject["msg"]?.Value <string>();
                    }
                    catch (Exception e)
                    {
                        Logger?.LogError(e, $"{nameof(BinanceHttpClient)}.{nameof(RequestAsync)} failed to parse server error response: \"{error}\"");
                    }
                }

                OnMessage(error, requestMessage.RequestUri.AbsoluteUri);

                // ReSharper disable once SwitchStatementMissingSomeCases
                switch (response.StatusCode)
                {
                case (HttpStatusCode)429:
                    throw new BinanceRequestRateLimitExceededException(response.ReasonPhrase, errorCode, errorMessage);

                case (HttpStatusCode)418:
                    throw new BinanceRequestRateLimitIpBanException(response.ReasonPhrase, errorCode, errorMessage);

                default:
                    throw new BinanceHttpException(response.StatusCode, response.ReasonPhrase, errorCode, errorMessage);
                }
            }
        }