Exemplo n.º 1
0
        public async Task <ESIQueryResult <string> > RefreshToken(string refreshToken, string clientId, string secret)
        {
            var result = new ESIQueryResult <string>();

            try
            {
                using (var ssoClient = new HttpClient())
                {
                    ssoClient.DefaultRequestHeaders.Add("User-Agent", SettingsManager.DefaultUserAgent);
                    ssoClient.DefaultRequestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes(clientId + ":" + secret))}");

                    var values = new Dictionary <string, string> {
                        { "grant_type", "refresh_token" }, { "refresh_token", $"{refreshToken}" }
                    };
                    var content = new FormUrlEncodedContent(values);
                    using (var responseMessage = await ssoClient.PostAsync("https://login.eveonline.com/oauth/token", content))
                    {
                        var raw = await responseMessage.Content.ReadAsStringAsync();

                        if (!responseMessage.IsSuccessStatusCode)
                        {
                            if (raw.StartsWith("{\"error\""))
                            {
                                await LogHelper.LogWarning($"[TOKEN] Request failure: {raw}", LogCat.ESI);

                                result.Data.ErrorCode = -99;
                                result.Data.Message   = "Valid ESI request error";
                            }
                            else
                            {
                                result.Data.ErrorCode = (int)responseMessage.StatusCode;
                                result.Data.Message   = responseMessage.StatusCode.ToString();
                            }
                            return(result);
                        }

                        result.Result = (string)JObject.Parse(raw)["access_token"];
                        return(result);
                    }
                }
            }
            catch (Exception ex)
            {
                await LogHelper.LogEx("RefreshToken", ex, LogCat.ESI);

                result.Data.ErrorCode = -1;
                result.Data.Message   = "Unexpected exception";
                return(result);
            }
        }
Exemplo n.º 2
0
        public static async Task <ESIQueryResult <T> > ESIRequestWrapper <T>(string request, string reason, string auth = null, string etag = null, bool noRetries = false, bool silent = false)
            where T : class
        {
            string raw      = null;
            var    retCount = SettingsManager.Settings.Config.RequestRetries;

            retCount = retCount == 0 || noRetries ? 1 : retCount;

            var result = new ESIQueryResult <T>();

            for (int i = 0; i < retCount; i++)
            {
                try
                {
                    await WaitReq.WaitIfNeeded(i);

                    var handler = new HttpClientHandler {
                        AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
                    };
                    using (var httpClient = new HttpClient(handler))
                    {
                        httpClient.DefaultRequestHeaders.Clear();
                        httpClient.DefaultRequestHeaders.Add("User-Agent", SettingsManager.DefaultUserAgent);
                        httpClient.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate, br");
                        httpClient.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
                        if (!string.IsNullOrEmpty(auth))
                        {
                            httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", auth);
                        }
                        if (!string.IsNullOrEmpty(etag))
                        {
                            httpClient.DefaultRequestHeaders.TryAddWithoutValidation("if-none-match", etag);
                        }

                        using (var responseMessage = await httpClient.GetAsync(request))
                        {
                            result.Data.ETag = responseMessage.Headers.FirstOrDefault(a => a.Key == "ETag").Value?.FirstOrDefault().Trim('"');

                            raw = await responseMessage.Content.ReadAsStringAsync();

                            if (!responseMessage.IsSuccessStatusCode)
                            {
                                result.Data.ErrorCode = (int)responseMessage.StatusCode;
                                result.Data.Message   = raw;
                                if (responseMessage.StatusCode != HttpStatusCode.NotModified && responseMessage.StatusCode != HttpStatusCode.NotFound && responseMessage.StatusCode != HttpStatusCode.Forbidden &&
                                    (responseMessage.StatusCode != HttpStatusCode.BadGateway && responseMessage.StatusCode != HttpStatusCode.GatewayTimeout) && !silent)
                                {
                                    await LogHelper.LogError($"[try: {i}][{reason}] Potential {responseMessage.StatusCode} request failure: {request}", LogCat.ESI, false);
                                }
                                if (responseMessage.StatusCode == HttpStatusCode.NotModified)
                                {
                                    return(result);
                                }

                                var errParsed = JsonConvert.DeserializeObject <JsonClasses.ESIError>(raw);
                                if (errParsed != null)
                                {
                                    if (errParsed.timeout > 0)
                                    {
                                        WaitReq.Update(errParsed.timeout);
                                    }
                                    if (SettingsManager.Settings.Config.ExtendedESILogging)
                                    {
                                        await LogHelper.LogError($"[{reason}][CODE:{result.Data.ErrorCode}] Request failure: {request}\nMessage: {errParsed.error}", LogCat.ESI, false);
                                    }
                                    return(result);
                                }
                                continue;
                            }

                            if (typeof(T) == typeof(string))
                            {
                                result.Result = (T)(object)raw;
                                return(result);
                            }

                            if (!typeof(T).IsClass)
                            {
                                result.Data.Message = "Is not a class T!";
                                return(result);
                            }

                            var data = JsonConvert.DeserializeObject <T>(raw);
                            if (data == null)
                            {
                                result.Data.Message   = "Failed to deserialize!";
                                result.Data.ErrorCode = -100;
                                await LogHelper.LogError($"[try: {i}][{reason}] Deserialized to null!{Environment.NewLine}Request: {request}", LogCat.ESI, false);
                            }
                            else
                            {
                                result.Result = data;
                                return(result);
                            }
                        }
                    }
                }
                catch (TaskCanceledException)
                {
                    //skip, probably due to timeout
                    result.Data.Message   = "Task has been cancelled";
                    result.Data.ErrorCode = 1;
                    return(result);
                }
                catch (Exception ex)
                {
                    if (TickManager.IsNoConnection && request.StartsWith(SettingsManager.Settings.Config.ESIAddress))
                    {
                        result.Data.Message        = "No connection";
                        result.Data.IsNoConnection = true;
                        return(result);
                    }

                    if (!silent)
                    {
                        await LogHelper.LogEx(request, ex, LogCat.ESI);

                        await LogHelper.LogInfo($"[try: {i}][{reason}]{Environment.NewLine}REQUEST: {request}{Environment.NewLine}RESPONSE: {raw}", LogCat.ESI);
                    }
                }
            }

            return(result);
        }