コード例 #1
0
        /// <summary>
        /// Passes the request JSON an appropriate handler.
        /// </summary>
        /// <param name="request">The request JSON to pass to the handler.</param>
        /// <returns>A response JSON built by the handler.</returns>
        protected JObject ParseRequest(JObject request)
        {
            request.TryGetValue("requestType", out JToken requestName);
            request.TryGetValue("requestData", out JToken requestData);

            if (requestName == null)
            {
                Log.Fine("Skipped malformed request with no requestType.");
                return(Templates.MalformedRequest("requestType expected but not found"));
            }
            if (requestData == null)
            {
                Log.Fine("Skipped malformed request with no requestData.");
                return(Templates.MalformedRequest("requestData expected but not found"));
            }

            // Get method to handle the incoming request
            var handler = typeof(RequestHandler).GetMethod(requestName.ToString());

            if (handler == null)
            {
                Log.Fine($"Skipped request with unknown type '{requestName}'");
                return(Templates.InvalidRequestType(requestName.ToString()));
            }

            // Begin preparations for handler invocation
            JObject response;

            CurrentUser = null;
            Log.Info($"Processing request '{requestName}'");

            // Get handler attributes
            var attributes        = handler.GetCustomAttributes <RequestAttribute>();
            var ignoreTokenAttrib = (IgnoreUserToken)attributes.FirstOrDefault(x => x is IgnoreUserToken);
            var permissionAttrib  = (RequiresPermissionLevel)attributes.FirstOrDefault(x => x is RequiresPermissionLevel);

            // Return alternative response if verifications fail
            if (ignoreTokenAttrib == null)
            {
                if (!VerifyToken(request, out response))
                {
                    return(response);
                }
            }

            if (permissionAttrib != null)
            {
                if (!VerifyPermission(request, permissionAttrib.Permission, out response))
                {
                    return(response);
                }
            }

            // Invoke handler and return response
            return((JObject)handler.Invoke(this, new object[] { requestData }));
        }