예제 #1
0
        /// <summary>
        /// This method is used to get a commit author's full name via the github rest api.
        /// Reference: https://docs.github.com/en/rest
        /// For an example response: https://api.github.com/repos/Azure/iotedge/commits/704250b
        /// </summary>
        /// <param name="commit">Commit for which to get the author's full name.</param>
        /// <returns>Full name of author.</returns>
        public async Task <string> GetAuthorFullNameFromCommitAsync(string commit)
        {
            string requestPath = string.Format(UserPathSegmentFormat, commit);

            IFlurlRequest workItemQueryRequest = ((Url)requestPath)
                                                 .WithHeader("Content-Type", "application/json")
                                                 .WithHeader("User-Agent", "Azure/iotedge");

            JObject result;

            try
            {
                IFlurlResponse response = await workItemQueryRequest.GetAsync();

                result = await response.GetJsonAsync <JObject>();

                string fullName = result["commit"]["author"]["name"].ToString();
                return(fullName);
            }
            catch (FlurlHttpException e)
            {
                string message = $"Failed making call to commit api: {e.Message}";
                Console.WriteLine(message);
                Console.WriteLine(e.Call.RequestBody);
                Console.WriteLine(e.Call.Response.StatusCode);
                Console.WriteLine(e.Call.Response.ResponseMessage);

                throw new Exception(message);
            }
        }
예제 #2
0
        public static async Task <ASMessageResponse> ToAngleSharpResponse(
            this IFlurlRequest flurlRequest,
            Func <IFlurlRequest, Task <HttpResponseMessage> > executionPredicate,
            CancellationToken cancellationToken = default
            )
        {
            // conversion from *flurl's* custom URL to *anglesharp's* custom URL
            // apparently .NET's URI just sucks that much
            var uri = flurlRequest.Url.ToUri();
            var url = Url.Convert(uri);


            if (executionPredicate == null)
            {
                Task <IFlurlResponse> flurlResponseMessageTask = flurlRequest.GetAsync(cancellationToken);

                var flurlResponseMessage = await flurlResponseMessageTask.ConfigureAwait(false);

                var content = await flurlResponseMessage.ResponseMessage.Content.ReadAsStreamAsync().ConfigureAwait(false);

                return(new ASMessageResponse(url, flurlResponseMessage.ResponseMessage, content));
            }
            else
            {
                Task <HttpResponseMessage> httpResponseMessageTask = executionPredicate(flurlRequest);

                var httpResponseMessage = await httpResponseMessageTask.ConfigureAwait(false);

                var content = await httpResponseMessage.Content.ReadAsStreamAsync().ConfigureAwait(false);

                return(new ASMessageResponse(url, httpResponseMessage, content));
            }
        }
예제 #3
0
        private static async Task <HttpResponseMessage> SendSimpleAsync(IFlurlRequest flurlRequest, WebRequestContext requestContext)
        {
            HttpResponseMessage result = default;

            try
            {
                requestContext.AttemptCnt++;
                if (requestContext.MethodType == WebMethodType.GET)
                {
                    result = await flurlRequest.GetAsync();
                }
                else if (requestContext.MethodType == WebMethodType.POST)
                {
                    result = await flurlRequest.PostJsonAsync((string)requestContext);
                }
            }
            catch (FlurlHttpException flurlException)
            {
                if (flurlException.Call.Response != null &&
                    requestContext.AttemptCnt < WebConfig.ReTryCount)
                {
                    result = await SendSimpleAsync(flurlRequest, requestContext);
                }
            }
            catch (Exception)
            {
            }

            return(result);
        }
        public IEnumerable <TResponse> Enumerate(IFlurlRequest request)
        {
            request.AllowHttpStatus(HttpStatusCode.NotFound);
            var more = true;

            while (more)
            {
                // Need headers & result so capture task first: https://stackoverflow.com/a/53514668/129269
                var task = request.GetAsync();

                var response = task.ConfigureAwait(false).GetAwaiter().GetResult();
                if (response.StatusCode == HttpStatusCode.NotFound)
                {
                    throw new NotFoundException(request.Url.ToString());
                }
                var data = task.ReceiveJson <Multiple <TResponse> >().ConfigureAwait(false).GetAwaiter().GetResult();

                foreach (var item in data.Value)
                {
                    yield return(item);
                }

                more = response.Headers.TryGetValues("x-ms-continuationtoken", out var tokens);
                request.SetQueryParam("continuationToken", tokens?.First());
            }
        }
예제 #5
0
        public static async Task <dynamic> GetRequest(string[] PathSegments)
        {
            IFlurlRequest request = TrackIt_2019.API.BaseUri.AppendPathSegments(PathSegments).WithOAuthBearerToken((string)TrackIt_2019.API.Authentication.Token.access_token);
            dynamic       result  = await request.GetAsync().ReceiveJson();

            return(result);
        }
예제 #6
0
        public static Task <T> GetJsonAsync <T>(this IFlurlRequest request, ReadToken <T> readToken) where T : class
        {
            // Will never return null because no null status codes are provided
#pragma warning disable CS8619 // Nullability of reference types in value doesn't match target type.
            return(request.SendJsonAsync(request => request.GetAsync(), readToken, false));

#pragma warning restore CS8619 // Nullability of reference types in value doesn't match target type.
        }
        public async Task <APIServiceResult <T> > GetById <T>(int id, string pathToAppend = "", bool eagerLoaded = false)
        {
            try
            {
                if (!string.IsNullOrWhiteSpace(pathToAppend))
                {
                    request.Url.AppendPathSegment(pathToAppend);
                }

                if (eagerLoaded)
                {
                    request.SetQueryParam("eagerLoaded", "true");
                }

                HttpResponseMessage response = null;
                request.Url.AppendPathSegment(id.ToString());

                response = await request.GetAsync();

                RevertToBaseRequest();

                if (response.StatusCode != HttpStatusCode.OK)
                {
                    if (response.StatusCode == HttpStatusCode.Forbidden)
                    {
                    }

                    if (response.StatusCode == HttpStatusCode.BadRequest)
                    {
                        if (response.Content != null)
                        {
                            var errorMessage = await response.Content.ReadAsStringAsync();

                            return(APIServiceResult <T> .BadRequest(errorMessage));
                        }
                    }

                    return(APIServiceResult <T> .WithStatusCode(response.StatusCode));
                }

                var result = await response.Content.ReadAsAsync <T>();

                return(APIServiceResult <T> .OK(result));
            }
            catch (FlurlHttpTimeoutException ex)
            {
                return(APIServiceResult <T> .Exception());
            }
            catch (FlurlHttpException ex)
            {
                return(APIServiceResult <T> .Exception());
            }
            catch (Exception ex)
            {
                return(APIServiceResult <T> .Exception());
            }
        }
예제 #8
0
        public Task <T> GetAsync <T>(CancellationToken token, string uri)
        {
            IFlurlRequest request = _flurlClient.Request(uri)
                                    .WithTimeout(_timeOut)
                                    .WithHeaders(_headers);

            if (!string.IsNullOrEmpty(AllowHttpStatus))
            {
                request.AllowHttpStatus(AllowHttpStatus);
            }

            return(request.GetAsync().ReceiveJson <T>());
        }
예제 #9
0
        public async Task <Result <DigitalOceanGetDomainRecordsResponse> > GetDNSRecordsAsync(DigitalOceanDomain domain, string token, CancellationToken cancellation)
        {
            string         path        = string.Format(_getDNSRecordsFormat, domain.Name);
            IFlurlRequest  httpRequest = BuildRequest(token, path);
            IFlurlResponse response    = await httpRequest.GetAsync(cancellation);

            HttpResponseMessage message = response.ResponseMessage;

            if (message.IsSuccessStatusCode)
            {
                string content = await message.Content.ReadAsStringAsync();

                DigitalOceanGetDomainRecordsResponse records = JsonConvert.DeserializeObject <DigitalOceanGetDomainRecordsResponse>(content);
                return(Result.Ok(records).WithSuccess(string.Format(_getDNSRecordsSuccessMessageTemplate, records.DomainRecords.Count(), domain.Name)));
            }
            return(Result.Fail(string.Format(_getDNSRecordsFailureMessageTemplate, domain.Name)));
        }
예제 #10
0
        public async Task <Result <GoDaddyGetDNSRecordsResponse> > GetDNSRecordsAsync(GoDaddyGetDNSRecordsRequest request, CancellationToken cancellation)
        {
            string         path        = string.Format(_getDNSRecordsFormat, request.DomainName, request.DNSRecordType.Value);
            IFlurlRequest  httpRequest = BuildRequest(request.ApiKey, request.ApiSecret, path);
            IFlurlResponse response    = await httpRequest.GetAsync(cancellation);

            HttpResponseMessage message = response.ResponseMessage;

            if (message.StatusCode == HttpStatusCode.OK)
            {
                string content = await message.Content.ReadAsStringAsync();

                IEnumerable <GoDaddyGetDNSRecordResponse> records = JsonConvert.DeserializeObject <List <GoDaddyGetDNSRecordResponse> >(content);
                string resultMessage = string.Format(_getDNSRecordsSuccessMessageTemplate, records.Count(), request.DomainName);
                return(Result.Ok(new GoDaddyGetDNSRecordsResponse(records)).WithSuccess(resultMessage));
            }
            return(Result.Fail(string.Format(_getDNSRecordsFailureMessageTemplate, request.DomainName)));
        }
예제 #11
0
        public async Task <FnsResult> LoginAsync(string phone, string password)
        {
            if (string.IsNullOrEmpty(phone))
            {
                throw new ArgumentNullException(nameof(phone));
            }
            if (string.IsNullOrEmpty(password))
            {
                throw new ArgumentNullException(nameof(password));
            }

            IFlurlRequest request = Urls.Login.WithClient(_client);

            request = AddAuthorizationHeaders(request, phone, password);

            var response = await request.GetAsync();

            return(await GetResultAsync(response));
        }
예제 #12
0
        /// <summary>
        ///     Получить перечисление высших школ
        /// </summary>
        /// <returns>Перечисление с высшими школами</returns>
        /// <exception cref="FlurlHttpException">Выбрасывается, если сайт не вернул положительный Http код</exception>
        public async Task <IEnumerable <School> > GetSchools()
        {
            var response = await _client.GetAsync();

            var doc = new HtmlDocument();

            doc.Load(await response.Content.ReadAsStreamAsync());

            var schools = doc.DocumentNode
                          .SelectNodes("//div[@id='classic']/div[contains(@class, 'institution_button')]/a")
                          .Select(x => new School
            {
                Id   = int.Parse(x.Attributes["href"].Value.Split('=')[1]),
                Url  = $"{Constants.EndPoint}/{x.Attributes["href"].Value.Replace("&amp;", "&")}",
                Name = x.InnerText.Trim()
            })
                          .Distinct();

            return(schools);
        }
예제 #13
0
        /// <summary>
        /// This method is used to retrieve all the team members for the larger iotedge team.
        /// Reference: https://docs.microsoft.com/en-us/rest/api/azure/devops/graph/users/list?view=azure-devops-rest-6.0
        /// </summary>
        /// <returns>List of users. Each containing full name and email.</returns>
        public async Task <IList <VstsUser> > ListUsersAsync()
        {
            string requestPath = string.Format(UserPathSegmentFormat, DevOpsAccessSetting.UserManagementBaseUrl, DevOpsAccessSetting.IotedgeOrganization);

            IFlurlRequest workItemQueryRequest = ((Url)requestPath)
                                                 .WithBasicAuth(string.Empty, this.accessSetting.IotedgePAT)
                                                 .WithHeader("Content-Type", "application/json")
                                                 .SetQueryParam("api-version", "6.0-preview.1");

            JObject result;

            try
            {
                IFlurlResponse response = await workItemQueryRequest.GetAsync();

                result = await response.GetJsonAsync <JObject>();
            }
            catch (FlurlHttpException e)
            {
                string message = $"Failed making call to list user api: {e.Message}";
                Console.WriteLine(message);
                Console.WriteLine(e.Call.RequestBody);
                Console.WriteLine(e.Call.Response.StatusCode);
                Console.WriteLine(e.Call.Response.ResponseMessage);

                throw new Exception(message);
            }

            if (!result.ContainsKey("count") || (int)result["count"] <= 0)
            {
                return(new VstsUser[0]);
            }

            IList <VstsUser> users = JsonConvert.DeserializeObject <VstsUser[]>(result["value"].ToString());

            return(users);
        }
예제 #14
0
        public static async Task <PagedResponse <T> > GetPagedJsonAsync <T>(this IFlurlRequest request, CancellationToken cancellationToken = default(CancellationToken))
        {
            var task = request.GetAsync(cancellationToken);
            var r    = await task.ConfigureAwait(false);

            var data = await task.ReceiveJson <List <T> >().ConfigureAwait(false);

            var p = new PagedResponse <T>
            {
                Data = data
            };

            if (long.TryParse(r.GetHeaderValue(HeaderNames.Before), out var before))
            {
                p.Before = before;
            }

            if (long.TryParse(r.GetHeaderValue(HeaderNames.After), out var after))
            {
                p.After = after;
            }

            return(p);
        }
        public static async Task <PagedResponse <T> > GetPagedJsonAsync <T>(this IFlurlRequest request, CancellationToken cancellationToken = default(CancellationToken))
        {
            var task = request.GetAsync(cancellationToken);
            var r    = await task.ConfigureAwait(false);

            var data = await task.ReceiveJson <List <T> >().ConfigureAwait(false);

            var p = new PagedResponse <T>
            {
                Data = data
            };

            if (r.Headers.TryGetFirst(HeaderNames.Before, out var beforeString))
            {
                p.Before = beforeString;
            }

            if (r.Headers.TryGetFirst(HeaderNames.After, out var afterString))
            {
                p.After = afterString;
            }

            return(p);
        }
예제 #16
0
 public static Task <T?> GetJsonAsync <T>(this IFlurlRequest request, ReadToken <T> readToken, bool defaultIfNotJson, params HttpStatusCode[] defaultStatusCodes) where T : class
 {
     return(request.SendJsonAsync(request => request.GetAsync(), readToken, defaultIfNotJson, defaultStatusCodes));
 }
예제 #17
0
        public async Task <FnsReceiptDetailInfo> GetReceiptAsync(ReceiptMainInfo receiptInfo, string phone, string password)
        {
            if (!await ReceiptExistsAsync(receiptInfo))
            {
                return(null);
            }

            // Формируем запрос.
            IFlurlRequest request = Urls.GetReceiveUrl(receiptInfo.FiscalNumber, receiptInfo.FiscalDocument, receiptInfo.FiscalSign).WithClient(_client);

            request = AddRequiredHeaders(request);
            request = AddAuthorizationHeaders(request, phone, password);

            // Запрашиваем данные из ФНС.
            HttpResponseMessage response = null;
            const int           retires  = 4;

            for (int i = 0; i < retires; i++)
            {
                try
                {
                    response = await request.GetAsync();

                    if (response.StatusCode != HttpStatusCode.Accepted)
                    {
                        break;
                    }

                    await Task.Delay(TimeSpan.FromMilliseconds(500));
                }
                catch (Exception ex)
                {
                    _logger.Error($"Во время выполнения запроса информации о чеке (попытка №{i}) произошло исключение", ex);
                }
            }

            if (response == null || response.StatusCode != HttpStatusCode.OK)
            {
                return(null);
            }

            var result = new ReceiptFnsResult
            {
                IsSuccess  = response.IsSuccessStatusCode,
                StatusCode = response.StatusCode,
            };

            // Десериализуем ответ.
            try
            {
                string json = await response.Content.ReadAsStringAsync();

                if (!string.IsNullOrEmpty(json))
                {
                    result.Document = JsonConvert.DeserializeObject <RootObject>(json).Document;
                }
            }
            catch (Exception ex)
            {
                _logger.Error($"Во время десериализации информации о чеке произошло исключение", ex);
            }

            if (result.Document?.ReceiptInfo == null)
            {
                return(null);
            }

            return(result.Document?.ReceiptInfo);
        }
예제 #18
0
파일: GetTests.cs 프로젝트: yika-aixi/Flurl
 protected override Task <HttpResponseMessage> CallOnFlurlRequest(IFlurlRequest req) => req.GetAsync();
예제 #19
0
        private async Task <ServiceResult <TResult> > ResolveHttpResponseAsync <TResult>(DoType type, int retryCount, IFlurlRequest webApiObject, object bodyObject = null, int secondsTimeout = 30, string callerMemberName = null)
        {
            var                 _retMessage = "";
            ReturnMessage       _message;
            HttpResponseMessage _exec           = null;
            HttpStatusCode      _HttpStatusCode = HttpStatusCode.BadRequest;

            var _policyResult = await Policy
                                .Handle <FlurlHttpTimeoutException>().Or <FlurlHttpException>().Or <Exception>()
                                .RetryAsync(retryCount, (exception, retryNumber) =>
            {
                System.Diagnostics.Debug.WriteLine($"==================================================================");
                System.Diagnostics.Debug.WriteLine($"Method: {callerMemberName} -> Retry: number#{retryNumber} -> exception:{exception.Message}");
                System.Diagnostics.Debug.WriteLine($"==================================================================");
            })
                                .ExecuteAndCaptureAsync(new Func <Task <ServiceResult <TResult> > >(async() =>
            {
                var _token   = this.GetCancelationToken(secondsTimeout).Token;
                var _content = "";

#if DEBUG
                var _json = JsonConvert.SerializeObject(bodyObject);
#endif
                switch (type)
                {
                case DoType.Get:
                    _exec = await webApiObject.GetAsync(_token);
                    break;

                case DoType.Post:
                    _exec = await webApiObject.PostJsonAsync(bodyObject, _token);
                    break;

                case DoType.Put:
                    _exec = await webApiObject.PutJsonAsync(bodyObject, _token);
                    break;

                case DoType.Delete:
                    _exec = bodyObject == null ? await webApiObject.DeleteAsync(_token) : await webApiObject.SendJsonAsync(HttpMethod.Delete, bodyObject, _token);
                    break;
                }

                switch (_exec.StatusCode)
                {
                case HttpStatusCode.OK:
                    switch (type)
                    {
                    case DoType.Get:
                    case DoType.Post:
                    case DoType.Put:
                        // lê o retorno do serviço
                        var _stringContent = await _exec.Content.ReadAsStringAsync();

                        // checa se está nulo, se estiver manda uma string vazia
                        _stringContent = string.IsNullOrEmpty(_stringContent) ? "" : _stringContent;

                        // vê se o conteúdo é um json, se não for, formatamos para que seja
                        TResult _result = default(TResult);

                        if (this.IsValidJson(_stringContent))
                        {
                            _result = JsonConvert.DeserializeObject <TResult>(_stringContent);
                        }
                        else
                        {
                            _result = (TResult)Convert.ChangeType(_stringContent, typeof(TResult), CultureInfo.CurrentCulture);
                        }

                        // retornamos o resultado deserializando no formato informado
                        return(new ServiceResult <TResult>(_result, true, _exec.StatusCode));

                    case DoType.Delete:
                        object _RetBool = true;
                        return(new ServiceResult <TResult>((TResult)_RetBool, true, _exec.StatusCode));
                    }
                    break;

                case HttpStatusCode.Unauthorized:
                    _retMessage = $"Você não está autorizado a executar essa rotina: {callerMemberName}!\r\nPor favor contacte o suporte.";
                    break;

                case HttpStatusCode.InternalServerError:
                case HttpStatusCode.BadRequest:
                    _content = await _exec.Content.ReadAsStringAsync();
                    try
                    {
                        _message    = JsonConvert.DeserializeObject <ReturnMessage>(_content);
                        _retMessage = _message.Message;
                    }
                    catch (Exception)
                    {
                        _retMessage = _content;
                    }

                    break;

                case HttpStatusCode.NoContent:
                    return(new ServiceResult <TResult>(default(TResult), false, _exec.StatusCode));

                case HttpStatusCode.NotFound:
                    return(new ServiceResult <TResult>(default(TResult), false, _exec.StatusCode));

                default:
                    _content    = await _exec.Content.ReadAsStringAsync();
                    _message    = JsonConvert.DeserializeObject <ReturnMessage>(_content);
                    _retMessage = $"Ocorreu um erro ao executar operação na rotina {callerMemberName}!\r\nPor favor contacte o suporte:\r\n\r\n{_message.Message}";
                    break;
                }
                _HttpStatusCode = _exec.StatusCode;
                return(new ServiceResult <TResult>(default(TResult), false, _HttpStatusCode, _retMessage));
            }));

            if (_policyResult.Outcome == OutcomeType.Successful)
            {
                return(_policyResult.Result);
            }
            else
            {
                switch (_policyResult.FinalException)
                {
                case FlurlHttpTimeoutException fhtex:
                    _HttpStatusCode = HttpStatusCode.GatewayTimeout;
                    _retMessage     = $"O tempo para execução desta tarefa expirou!Rotina{callerMemberName}\r\nTente novamente em alguns segundos.";
                    break;

                case FlurlHttpException fhex:
                    string _retString = fhex.Message;
                    if (fhex.Call.HttpStatus.HasValue)
                    {
                        _HttpStatusCode = fhex.Call.HttpStatus.Value;
                        switch (fhex.Call.HttpStatus.Value)
                        {
                        case HttpStatusCode.InternalServerError:
                        case HttpStatusCode.BadRequest:
                            _retMessage = fhex.Call.Response.Content.ReadAsStringAsync().Result;
                            break;
                        }
                    }
                    else
                    {
                        //_retMessage = $"Ocorreu um erro ao executar a operação na rotina {callerMemberName}!\r\nPor favor contacte o suporte:\r\n\r\n{_retString}";
                        _retMessage = $"Não foi possível executar a sua solicitação. Verifique a sua conexão com a Internet e tente novamente.";
                    }
                    break;

                case Exception ex:
                    _retMessage = this.GetInnerExceptionMessages(ex);
                    break;

                default:
                    _retMessage = this.GetInnerExceptionMessages(_policyResult.FinalException);
                    break;
                }
                return(new ServiceResult <TResult>(default(TResult), false, _HttpStatusCode, _retMessage));
            }
        }
예제 #20
0
        private async Task <Response> ProxyRequest(NancyContext context, CancellationToken cancellationToken)
        {
            string path   = Strings.Encode(context.Request.Path);
            string method = Strings.Encode(context.Request.Method.ToUpperInvariant());

            if (!path.StartsWith("/nfsw/Engine.svc"))
            {
                Log.Error("PROXY HANDLER: Invalid Request: " + path);
                return("SBRW Launcher Version: " + Theming.PrivacyRPCBuild + "\nBuild Date: " + InsiderInfo.BuildNumberOnly());
            }
            else
            {
                path = path.Substring("/nfsw/Engine.svc".Length);

                UrlFlurl resolvedUrl = new UrlFlurl(ServerProxy.Instance.GetServerUrl()).AppendPathSegment(path, false);

                foreach (var queryParamName in context.Request.Query)
                {
                    resolvedUrl = resolvedUrl.SetQueryParam(queryParamName, context.Request.Query[queryParamName],
                                                            NullValueHandling.Ignore);
                }

                IFlurlRequest request = resolvedUrl.AllowAnyHttpStatus();

                foreach (var header in context.Request.Headers)
                {
                    /* Don't send Content-Length for GET requests - HeyItsLeo */
                    if (method == "GET" && header.Key.ToLowerInvariant() == "content-length")
                    {
                        continue;
                    }

                    request = request.WithHeader
                                  (header.Key, (header.Key == "Host") ? resolvedUrl.ToUri().Host : ((header.Value != null) ? header.Value.First() : string.Empty));
                }

                string requestBody = (method != "GET") ? context.Request.Body.AsString(UTF8) : string.Empty;

                CommunicationLog.RecordEntry(ServerProxy.Instance.GetServerName(), "SERVER", CommunicationLogEntryType.Request,
                                             new CommunicationLogRequest(requestBody, resolvedUrl.ToString(), method));

                IFlurlResponse responseMessage;

                if (path == "/event/arbitration" && !string.IsNullOrWhiteSpace(requestBody))
                {
                    requestBody = Strings.Encode(
                        requestBody.Replace("</TopSpeed>", "</TopSpeed><Konami>" + AntiCheat.Get_Cheat_Status() + "</Konami>"));
                    foreach (var header in context.Request.Headers)
                    {
                        if (header.Key.ToLowerInvariant() == "content-length")
                        {
                            int KonamiCode = Convert.ToInt32(header.Value.First()) +
                                             ("<Konami>" + AntiCheat.Get_Cheat_Status() + "</Konami>").Length;
                            request = request.WithHeader(header.Key, KonamiCode);
                        }
                    }
                }

                switch (method)
                {
                case "GET":
                    responseMessage = await request.GetAsync(cancellationToken);

                    break;

                case "POST":
                    responseMessage = await request.PostAsync(new CapturedStringContent(requestBody),
                                                              cancellationToken);

                    break;

                case "PUT":
                    responseMessage = await request.PutAsync(new CapturedStringContent(requestBody),
                                                             cancellationToken);

                    break;

                case "DELETE":
                    responseMessage = await request.DeleteAsync(cancellationToken);

                    break;

                default:
                    Log.Error("PROXY HANDLER: Cannot handle Request Method " + method);
                    responseMessage = null;
                    break;
                }

                string responseBody = Strings.Encode(await responseMessage.GetStringAsync());

                int statusCode = responseMessage.StatusCode;

                DiscordGamePresence.HandleGameState(path, responseBody, context.Request.Query);

                TextResponse Response = new TextResponse(responseBody,
                                                         responseMessage.ResponseMessage.Content.Headers.ContentType?.MediaType ?? "application/xml;charset=UTF-8")
                {
                    StatusCode = (HttpStatusCode)statusCode
                };

                CommunicationLog.RecordEntry(ServerProxy.Instance.GetServerName(), "SERVER", CommunicationLogEntryType.Response,
                                             new CommunicationLogResponse(responseBody, resolvedUrl.ToString(), method));

                return(Response);
            }
        }
예제 #21
0
        public async Task <APIServiceResult <T> > GetAsSingle <T>(string pathToAppend = "", Dictionary <string, string> queryStringCollection = null)
        {
            try
            {
                if (queryStringCollection != null)
                {
                    foreach (var queryString in queryStringCollection)
                    {
                        request.Url.QueryParams.Add(queryString.Key, queryString.Value);
                    }
                }

                if (!string.IsNullOrWhiteSpace(pathToAppend))
                {
                    request.Url.AppendPathSegment(pathToAppend);
                }

                var response = await request.GetAsync();

                RevertToBaseRequest();

                if (response.StatusCode != HttpStatusCode.OK)
                {
                    if (response.StatusCode == HttpStatusCode.Forbidden)
                    {
                        dlgError.ShowDialog(Resources.AccessDenied);
                    }

                    if (response.StatusCode == HttpStatusCode.BadRequest)
                    {
                        var msg = string.Empty;
                        if (response.Content != null)
                        {
                            msg = await response.Content.ReadAsStringAsync();
                        }
                        dlgError.ShowDialog(msg);
                    }

                    return(APIServiceResult <T> .WithStatusCode(response.StatusCode));
                }

                object result;

                if (typeof(T) == typeof(DateTime))
                {
                    var textPlain = await response.Content.ReadAsStringAsync();

                    var dateTimeResult =
                        DateTime.Parse(textPlain, CultureInfo.InvariantCulture);;
                    result = dateTimeResult;
                }
                else
                {
                    result = await response.Content.ReadAsAsync <T>();
                }

                if (response.StatusCode == HttpStatusCode.OK && result == null)
                {
                    return(APIServiceResult <T> .OK());
                }

                return(new APIServiceResult <T>
                {
                    Data = (T)result,
                    HasData = result != null
                });
            }
            catch (Exception ex)
            {
                logger.Error(ex);
                dlgError.ShowDialog(Resources.TemporarilyUnvailable);
                return(APIServiceResult <T> .Exception());
            }
        }
예제 #22
0
        private async Task <Response> ProxyRequest(NancyContext context, CancellationToken cancellationToken)
        {
            string path   = context.Request.Path;
            string method = context.Request.Method.ToUpperInvariant();

            if (!path.StartsWith("/nfsw/Engine.svc"))
            {
                throw new ProxyException("Invalid request path: " + path);
            }

            path = path.Substring("/nfsw/Engine.svc".Length);

            Url resolvedUrl = new Url(ServerProxy.Instance.GetServerUrl()).AppendPathSegment(path);

            foreach (var queryParamName in context.Request.Query)
            {
                resolvedUrl = resolvedUrl.SetQueryParam(queryParamName, context.Request.Query[queryParamName],
                                                        NullValueHandling.Ignore);
            }

            IFlurlRequest request = resolvedUrl.AllowAnyHttpStatus();

            foreach (var header in context.Request.Headers)
            {
                request = request.WithHeader(header.Key,
                                             header.Key == "Host" ? resolvedUrl.ToUri().Host : header.Value.First());
            }

            var requestBody = context.Request.Method != "GET" ? context.Request.Body.AsString(Encoding.UTF8) : "";

            CommunicationLog.RecordEntry(ServerProxy.Instance.GetServerName(), "SERVER",
                                         CommunicationLogEntryType.Request,
                                         new CommunicationLogRequest(requestBody, resolvedUrl.ToString(), method));

            HttpResponseMessage responseMessage;

            var POSTContent = String.Empty;

            var queryParams = new Dictionary <string, object>();

            foreach (var param in context.Request.Query)
            {
                var value = context.Request.Query[param];
                queryParams[param] = value;
            }

            var GETContent = string.Join(";", queryParams.Select(x => x.Key + "=" + x.Value).ToArray());

            // ReSharper disable once LocalizableElement
            //Console.WriteLine($"[LOG] [{method}] ProxyHandler: {path}");

            switch (method)
            {
            case "GET":
                responseMessage = await request.GetAsync(cancellationToken);

                break;

            case "POST":
                responseMessage = await request.PostAsync(new CapturedStringContent(requestBody, Encoding.UTF8),
                                                          cancellationToken);

                POSTContent = context.Request.Body.AsString();
                break;

            case "PUT":
                responseMessage = await request.PutAsync(new CapturedStringContent(requestBody, Encoding.UTF8),
                                                         cancellationToken);

                break;

            case "DELETE":
                responseMessage = await request.DeleteAsync(cancellationToken);

                break;

            default:
                throw new ProxyException("Cannot handle request method: " + method);
            }

            var responseBody = await responseMessage.Content.ReadAsStringAsync();

            if (path == "/User/GetPermanentSession")
            {
                responseBody = Self.CleanFromUnknownChars(responseBody);
            }

            int statusCode = (int)responseMessage.StatusCode;

            try
            {
                DiscordGamePresence.HandleGameState(path, responseBody, POSTContent, GETContent);
            }
            catch (Exception e)
            {
                Log.Error($"DISCORD RPC ERROR [handling {context.Request.Path}]");
                Log.Error($"\tMESSAGE: {e.Message}");
                Log.Error($"\t{e.StackTrace}");
                await Self.SubmitError(e);
            }

            TextResponse textResponse = new TextResponse(responseBody,
                                                         responseMessage.Content.Headers.ContentType?.MediaType ?? "application/xml;charset=UTF-8")
            {
                StatusCode = (HttpStatusCode)statusCode
            };

            queryParams.Clear();

            CommunicationLog.RecordEntry(ServerProxy.Instance.GetServerName(), "SERVER",
                                         CommunicationLogEntryType.Response, new CommunicationLogResponse(
                                             responseBody, resolvedUrl.ToString(), method));

            return(textResponse);
        }
예제 #23
0
        private async Task <Response> ProxyRequest(NancyContext ctx, CancellationToken ct)
        {
            Debug.WriteLine("{0} - {1}", ctx.Request.Method, ctx.Request.Path);

            foreach (var requestHeader in ctx.Request.Headers)
            {
                Debug.WriteLine("\t{0}: {1}", requestHeader.Key, string.Join(" ; ", requestHeader.Value));
            }

            // Build new request
            var url = new Flurl.Url(ServerProxy.Instance.GetCurrentServer().ServerAddress)
                      .AppendPathSegment(ctx.Request.Path.Replace("/nfsw/Engine.svc", ""));

            foreach (var key in ctx.Request.Query)
            {
                url = url.SetQueryParam(key, ctx.Request.Query[key], NullValueHandling.Ignore);
            }

            IFlurlRequest request = url.WithTimeout(TimeSpan.FromSeconds(30));

            foreach (var requestHeader in ctx.Request.Headers)
            {
                request = request.WithHeader(requestHeader.Key, requestHeader.Value.First());
            }

            HttpResponseMessage responseMessage;

            switch (ctx.Request.Method)
            {
            case "GET":
                responseMessage = await request.GetAsync(ct);

                break;

            case "POST":
                responseMessage =
                    await request.PostAsync(new CapturedStringContent(ctx.Request.Body.AsString(Encoding.UTF8)), ct);

                break;

            case "PUT":
                responseMessage =
                    await request.PutAsync(new CapturedStringContent(ctx.Request.Body.AsString(Encoding.UTF8)), ct);

                break;

            case "DELETE":
                responseMessage =
                    await request.DeleteAsync(ct);

                break;

            default:
                throw new ServerProxyException("Cannot handle request method: " + ctx.Request.Method);
            }

            return(new TextResponse(await responseMessage.Content.ReadAsStringAsync(),
                                    responseMessage.Content.Headers.ContentType?.MediaType ?? "application/xml;charset=UTF-8")
            {
                StatusCode = (HttpStatusCode)(int)responseMessage.StatusCode
            });
        }