/// <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 })); }