Example #1
0
        private async void InvokeDelegate(RPCPacket packet)
        {
            var path = packet.Url.SubRightWith('/', out string action);

            if (mDelegateHandlers.TryGetValue(action, out DelegateHandler handler))
            {
                try
                {
                    packet.LoadParameters(handler.Parameters);
                    object result = handler.Delegate.DynamicInvoke(packet.Data);
                    if (!handler.IsVoid)
                    {
                        await(Task) result;
                        if (handler.TargetReturnType != null)
                        {
                            var data = handler.GetValue(result);
                            packet.Reply(data);
                        }
                        else
                        {
                            packet.ReplySuccess();
                        }
                    }
                }
                catch (Exception e_)
                {
                    if (!handler.IsVoid)
                    {
                        packet.ReplyError((short)StatusCode.INNER_ERROR, $"{action} delegate invoke error {e_.Message}!");
                    }
                    if (EnableLog(LogType.Error))
                    {
                        Log(LogType.Error, $"{action} delegate invoke error {e_.Message}@{e_.StackTrace}");
                    }
                }
            }
            else
            {
                if (packet.NeedReply)
                {
                    packet.ReplyError((short)StatusCode.ACTION_NOT_FOUND, $"{action} delegate not found!");
                }
            }
        }
Example #2
0
        private void OnRequestProcess(RPCPacket e)
        {
            RPCPacket response = e;

            try
            {
                var evt = OnProcessing(e);
                if (evt != null && evt.Cancel)
                {
                    return;
                }
                if (this.Security)
                {
                    if (e.Session.Authentication < AuthenticationType.User && e.Url != Clients.XRPCClient.LOGIN_TAG)
                    {
                        e.ReplyError((short)StatusCode.INNER_ERROR, "No permission operation in secure mode!");
                        return;
                    }
                }
                EventNext.EventActionHandler handler = EventCenter.GetActionHandler(e.Url);
                if (handler != null)
                {
                    BindRequestParameter(e, handler);
                    OnEventNext(e);
                }
                else
                {
                    if (e.Url == "/__System/Ping")
                    {
                        response = new RPCPacket();
                        if (EnableLog(LogType.Debug))
                        {
                            Log(LogType.Debug, $"[{e.ID}]{e.Session.RemoteEndPoint} request {e.Url}");
                        }
                        response.Status = (short)StatusCode.SUCCESS;
                        OnResponse(e, response);
                    }
                    else if (e.Url == Clients.XRPCClient.LOGIN_TAG)
                    {
                        EventLoginArgs login = new EventLoginArgs(this, e.Session);
                        e.LoadParameters <string, string>();
                        login.UserName = (string)e.Data[0];
                        login.Password = (string)e.Data[1];
                        Login?.Invoke(this, login);
                        if (login.Success)
                        {
                            e.Session[NAME_PROPERTY_TAG] = login.UserName;
                            e.ReplySuccess();
                        }
                        else
                        {
                            string error = login.Message;
                            if (string.IsNullOrEmpty(error))
                            {
                                error = "Invalid username or password!";
                            }
                            e.ReplyError(error);
                        }
                    }
                    else
                    {
                        var awaitItem = AwaiterFactory.GetItem(response.ID);
                        if (awaitItem != null)
                        {
                            response.ResultType = awaitItem.ResultType;
                            try
                            {
                                if (response.ResultType != null)
                                {
                                    response.LoadParameters(response.ResultType);
                                }
                            }
                            catch (Exception e_)
                            {
                                response.Status = (short)StatusCode.INNER_ERROR;
                                response.Data   = new object[] { $"{e_.Message}@{e_.StackTrace}" };
                            }
                            AwaiterFactory.Completed(awaitItem, response);
                        }
                        else
                        {
                            if (response.Url.IndexOf(XRPCClient.DELEGATE_TAG, StringComparison.OrdinalIgnoreCase) == 0)
                            {
                                InvokeDelegate(response);
                                return;
                            }
                            if (response.Url.IndexOf(XRPCClient.SUBSCRIBE_TAG, StringComparison.OrdinalIgnoreCase) == 0)
                            {
                                OnSubscribe(response);
                                return;
                            }
                            if (NotFound == null)
                            {
                                if (EnableLog(LogType.Debug))
                                {
                                    Log(LogType.Debug, $"[{e.ID}]{e.Session.RemoteEndPoint} request {e.Url} not found!");
                                }
                                response        = new RPCPacket();
                                response.Status = (short)StatusCode.ACTION_NOT_FOUND;
                                response.Data   = new object[] { $"request {e.Url} not found!" };
                                OnResponse(e, response);
                            }
                            else
                            {
                                NotFound.Invoke(this, new Events.EventPacketArgs(this, e));
                            }
                        }
                    }
                }
            }
            catch (Exception e_)
            {
                if (EnableLog(LogType.Error))
                {
                    Log(LogType.Error, $"[{e.ID}]{e.Session.RemoteEndPoint} process {e.Url} error {e_.Message}@{e_.StackTrace}!");
                }
            }
        }