Exemple #1
0
        /// <summary>
        /// Executes multiple requests. Returns the status of the request to the api.
        /// The responses to the individual requests can be found in the respective request objects.
        /// </summary>
        /// <param name="feature">Special feature for the client to execute for the passed in requests.</param>
        public async Task <GameJoltResponse> ExecuteRequestsAsync(IEnumerable <IGameJoltRequest> requests, GameJoltApiRequestFeature feature = GameJoltApiRequestFeature.None)
        {
            var startTime = DateTime.Now;

            try
            {
                var data = await GetRequestData(requests, feature);

                var model   = RootResponseModel.FromString(data);
                var endTime = DateTime.Now;

                if (model.BatchResponse.Success)
                {
                    for (int i = 0; i < model.BatchResponse.Responses.Length; i++)
                    {
                        requests.ElementAt(i).SetResponse(model.BatchResponse.Responses[i]);
                        requests.ElementAt(i).SetTimingResult(startTime, endTime);
                    }
                }
                else
                {
                    int startIndex = 0;
                    if (model.BatchResponse != null && model.BatchResponse.Responses != null)
                    {
                        startIndex = model.BatchResponse.Responses.Length;
                        for (int i = 0; i < model.BatchResponse.Responses.Length; i++)
                        {
                            requests.ElementAt(i).SetResponse(model.BatchResponse.Responses[i]);
                            requests.ElementAt(i).SetTimingResult(startTime, endTime);
                        }
                    }

                    for (int i = startIndex; i < requests.Count(); i++)
                    {
                        requests.ElementAt(i).SetResponse(GetSubRequestErrorModel(feature == GameJoltApiRequestFeature.BreakOnError));
                        requests.ElementAt(i).SetTimingResult(startTime, endTime);
                    }
                }

                return(new GameJoltResponse(model));
            }
            catch (Exception ex)
            {
                var endTime = DateTime.Now;

                for (int i = 0; i < requests.Count(); i++)
                {
                    requests.ElementAt(i).SetResponse(GetSubRequestErrorModel(false));
                    requests.ElementAt(i).SetTimingResult(startTime, endTime);
                }

                return(new GameJoltResponse(ex.Message));
            }
        }
Exemple #2
0
        private async Task <string> GetRequestData(IEnumerable <IGameJoltRequest> requests, GameJoltApiRequestFeature feature)
        {
            if (requests == null || requests.Count() == 0)
            {
                return(string.Empty);
            }

            // build url from parameters:
            string url = string.Format(FORMAT_REQUEST_URL, HOST, VERSION, GameId, FORMAT_JSON);

            if (feature == GameJoltApiRequestFeature.ParallelProcessing)
            {
                url += "&parallel=true";
            }
            if (feature == GameJoltApiRequestFeature.BreakOnError)
            {
                url += "&break_on_error=true";
            }

            // add signature to url:
            var urlSignature = CreateSignature(url);

            url += "&signature=" + urlSignature;

            // the request will be a POST request, and all actual api requests will be stored in the post data:
            StringBuilder postDataBuilder = new StringBuilder("data=");

            foreach (var gameJoltRequest in requests)
            {
                var requestUrl          = gameJoltRequest.ComposeUrl(this);
                var requestUrlSignature = CreateSignature(requestUrl);
                requestUrl += "&signature=" + requestUrlSignature;

                postDataBuilder.Append("&requests[]=" + UrlEncoder.Encode(requestUrl));
            }

            string postData = postDataBuilder.ToString();

            var request = ComposeRequest(url, postData);

            using (var sw = new StreamWriter(await request.GetRequestStreamAsync()))
            {
                // write post data to stream:
                await sw.WriteAsync(postData);

                sw.Close();

                // get request response, read from stream:
                var response = await request.GetResponseAsync();

                using (var sr = new StreamReader(response.GetResponseStream()))
                {
                    return(await sr.ReadToEndAsync());
                }
            }
        }