Exemple #1
0
        protected override async Task <JToken> ExecuteController(JToken data)
        {
            var modelName = data.ParseField <string>("ModelName");

            if (modelName == null)
            {
                return(JStatus.RequestArgumentNotFound("ModelName"));
            }

            var modelType = Type.GetType($"SagaNetwork.Models.{modelName}");

            if (modelType == null)
            {
                return(JStatus.MetaNotFound);
            }

            dynamic model = Activator.CreateInstance(modelType);

            var metas = await model.RetrieveAllAsync();

            var response = JStatus.Ok.ToObject <JObject>();

            response.Add("Metas", JToken.FromObject(metas));

            return(response);
        }
        protected override async Task <JToken> ExecuteController(JToken data)
        {
            var jsonBlobId = data.ParseField <string>("Id");

            if (jsonBlobId == null)
            {
                return(JStatus.RequestArgumentNotFound("Id"));
            }

            var jsonBlob = await new JsonBlob(jsonBlobId).LoadAsync();

            if (jsonBlob == null)
            {
                return(JStatus.NotFound);
            }

            var blockBlob = CloudStorage.BlobContainer.GetBlockBlobReference(jsonBlob.BlobPath);

            if (!await blockBlob.ExistsAsync())
            {
                return(JStatus.NotFound);
            }

            var jsonText = await blockBlob.DownloadTextAsync();

            var response = JStatus.Ok.ToObject <JObject>();

            response.Add("JsonText", jsonText);

            return(response);
        }
Exemple #3
0
        public Tuple <JStatus, Request.ResponseInfo> GetStatus()
        {
            var uri = new Uri(URL.base_url + URL.status);

            HttpStatusCode status;
            int            requestsRemaining;
            var            raw_match = Request.DoRequest(uri, "", true, false, false);

            return(new Tuple <JStatus, Request.ResponseInfo>(JStatus.FromJson(raw_match.response), raw_match));
        }
Exemple #4
0
        /// <summary>
        /// Default handler to serve WebSocket pipeline.
        /// </summary>
        /// <param name="httpContext">HTTP context of the request.</param>
        /// <param name="next"></param>
        public static async Task HandleWebSoсketRequestAsync(HttpContext httpContext, Func <Task> next)
        {
            if (httpContext.WebSockets.IsWebSocketRequest)
            {
                var webSocket = await httpContext.WebSockets.AcceptWebSocketAsync();

                var isAuthed      = false;
                var buffer        = new ArraySegment <byte>(new byte[4096]);
                var requestString = string.Empty;

                if (webSocket != null && webSocket.State == WebSocketState.Open)
                {
                    while (webSocket.State == WebSocketState.Open)
                    {
                        var received = await webSocket.ReceiveAsync(buffer, CancellationToken.None);

                        requestString += Encoding.UTF8.GetString(buffer.Array, buffer.Offset, received.Count);
                        if (!received.EndOfMessage)
                        {
                            continue;
                        }

                        var requestToken = JParser.TryParse(requestString);
                        requestString = string.Empty;
                        if (requestToken == null)
                        {
                            continue;
                        }

                        JToken responseToken;

                        // Check auth only once per socket connection.
                        if (!isAuthed)
                        {
                            isAuthed = Authorization.CheckAuth(requestToken);
                        }

                        if (isAuthed)
                        {
                            var controllerName = requestToken.ParseField <string>("Controller");
                            if (controllerName == null)
                            {
                                responseToken = JStatus.RequestArgumentNotFound("Controller");
                            }
                            else
                            {
                                var controllerType = Type.GetType($"SagaNetwork.Controllers.{controllerName}Controller");
                                if (controllerType == null)
                                {
                                    responseToken = JStatus.ControllerNotFound;
                                }
                                else
                                {
                                    var controller = Activator.CreateInstance(controllerType) as BaseController;
                                    if (controller != null)
                                    {
                                        responseToken = await controller.HandleRequestAsync(requestToken, skipClientAuthCheck : true);
                                    }
                                    else
                                    {
                                        responseToken = JStatus.ControllerNotFound;
                                    }
                                }
                            }
                        }
                        else
                        {
                            responseToken = JStatus.AuthFail;
                        }

                        // Inject request ID.
                        var requestId = requestToken.ParseField <string>("RequestId");
                        if (requestId == null)
                        {
                            responseToken = JStatus.RequestArgumentNotFound("RequestId");
                        }
                        else
                        {
                            responseToken["RequestId"] = requestId;
                        }

                        var responseData = Encoding.UTF8.GetBytes(responseToken.ToString());
                        buffer = new ArraySegment <byte>(responseData);
                        await webSocket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
                    }
                }
            }
            else
            {
                await next();  // not a websocket request — pass downstream
            }
        }
Exemple #5
0
        /// <summary>
        /// Validates and parses request/response data, executes derived controller and handles OCC.
        /// </summary>
        private async Task <JToken> HandleRequestAsync(JToken data, bool skipClientAuthCheck = false)
        {
            if (data == null || !data.HasValues)
            {
                return(JStatus.WrongQuery);
            }

            var derivedType = this.GetType();

            // Handle server auth.
            if (derivedType.GetCustomAttributes <RequireServerAuthAttribute>(true).Any() &&
                !Authorization.CheckAuth(data, requireServerAuth: true))
            {
                return(JStatus.ServerAuthFail);
            }

            // Handle client auth.
            if (!skipClientAuthCheck && derivedType.GetCustomAttributes <RequireAuthAttribute>(true).Any() &&
                !Authorization.CheckAuth(data))
            {
                return(JStatus.AuthFail);
            }

            // Inject request arguments.
            var fields = derivedType.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance);

            foreach (var field in fields.Where(p => p.GetCustomAttributes <ApiRequestDataAttribute>(true).Any()))
            {
                var parsedField = data.ParseField(field.Name, field.FieldType);
                if (parsedField == null)
                {
                    return(JStatus.RequestArgumentNotFound(field.Name));
                }
                field.SetValue(this, Convert.ChangeType(parsedField, field.FieldType));
            }

            // Execute the derived controller logic.
            responseToken = await ExecuteController(data);

            // Handle OCC violations.
            if (OccFailFlag)
            {
                OccFailFlag = false;
                curOccRetry++;
                if (curOccRetry > OCC_RETRY_COUNT)
                {
                    return(JStatus.OccFail);
                }
                await HandleRequestAsync(data);
            }

            if (responseToken == null)
            {
                responseToken = JStatus.ControllerFail;
            }

            // Inject response data.
            foreach (var field in fields.Where(p => p.GetCustomAttributes <ApiResponseDataAttribute>(true).Any()))
            {
                if (field.GetValue(this) != null)
                {
                    responseToken[field.Name] = JToken.FromObject(field.GetValue(this));
                }
            }

            return(responseToken);
        }