Beispiel #1
0
        private void HandleRpcError(long messageReqMsgId, TRpcError error)
        {
            // rpc_error

            Log.Warn($"Recieve error from server: {error.ErrorMessage}");

            Exception exception;

            switch (error.ErrorMessage)
            {
            case var floodMessage when floodMessage.StartsWith("FLOOD_WAIT_"):
                var floodMessageTime = Regex.Match(floodMessage, @"\d+").Value;

                var seconds = int.Parse(floodMessageTime);
                exception = new FloodException(TimeSpan.FromSeconds(seconds));
                break;

            case var phoneMigrate when phoneMigrate.StartsWith("PHONE_MIGRATE_"):
                var phoneMigrateDcNumber = Regex.Match(phoneMigrate, @"\d+").Value;

                var phoneMigrateDcIdx = int.Parse(phoneMigrateDcNumber);
                exception = new PhoneMigrationException(phoneMigrateDcIdx);
                break;

            case var fileMigrate when fileMigrate.StartsWith("FILE_MIGRATE_"):
                var fileMigrateDcNumber = Regex.Match(fileMigrate, @"\d+").Value;

                var fileMigrateDcIdx = int.Parse(fileMigrateDcNumber);
                exception = new FileMigrationException(fileMigrateDcIdx);
                break;

            case var userMigrate when userMigrate.StartsWith("USER_MIGRATE_"):
                var userMigrateDcNumber = Regex.Match(userMigrate, @"\d+").Value;

                var userMigrateDcIdx = int.Parse(userMigrateDcNumber);
                exception = new UserMigrationException(userMigrateDcIdx);
                break;

            case "PHONE_CODE_INVALID":
                exception = new InvalidPhoneCodeException("The numeric code used to authenticate does not match the numeric code sent by SMS/Telegram");
                break;

            case "SESSION_PASSWORD_NEEDED":
                exception = new CloudPasswordNeededException("This Account has Cloud Password !");
                break;

            case "AUTH_RESTART":
                ResponseResultSetter.ReturnException(new AuthRestartException());
                return;

            default:
                exception = new InvalidOperationException(error.ErrorMessage);
                break;
            }

            ResponseResultSetter.ReturnException(messageReqMsgId, exception);
        }
Beispiel #2
0
        public async Task ReturnError_Migration(string errorMessage)
        {
            this.BuildClientSettingsProps();
            this.RegisterType <RpcResultHandler>();

            var mSettings = this.BuildClientSettingsProps();

            this.Resolve <Mock <ISessionWriter> >()
            .BuildSuccessSave();

            var dcOption = mSettings.Object.Config.DcOptions.First();

            var messageId = Fixture.Create <long>();

            var result = new TRpcError
            {
                ErrorMessage = errorMessage + dcOption.Id
            };

            var request = new TRpcResult
            {
                ReqMsgId = messageId,
                Result   = Serializer.Serialize(result).ToArray()
            };

            var requestEncoder = this.Resolve <RpcResultHandler>();

            var channel = new EmbeddedChannel(requestEncoder);

            // ---

            channel.WriteInbound(request);

            await Task.Delay(500).ConfigureAwait(false);

            // ---

            Assert.IsType <TMsgsAck>(channel.ReadOutbound <TMsgsAck>());

            Assert.False(channel.Open);

            Assert.Equal(dcOption.IpAddress, mSettings.Object.ClientSession.ServerAddress);
            Assert.Equal(dcOption.Port, mSettings.Object.ClientSession.Port);
            Assert.Null(mSettings.Object.ClientSession.AuthKey);
        }
Beispiel #3
0
        public void ReturnError_SimpleCases(string errorMessage, Type exceptionType)
        {
            this.BuildClientSettingsProps();

            this.RegisterType <RpcResultHandler>();

            var messageId = Fixture.Create <long>();

            var result = new TRpcError
            {
                ErrorMessage = errorMessage
            };

            var request = new TRpcResult
            {
                ReqMsgId = messageId,
                Result   = Serializer.Serialize(result).ToArray()
            };

            var mRequestService = this.Resolve <Mock <IRequestService> >()
                                  .BuildReturnException(messageId, exceptionType);

            var requestEncoder = this.Resolve <RpcResultHandler>();

            var channel = new EmbeddedChannel(requestEncoder);

            // ---

            channel.WriteInbound(request);

            // ---

            Assert.Null(channel.ReadOutbound <object>());

            channel.Flush();
            Assert.IsType <TMsgsAck>(channel.ReadOutbound <TMsgsAck>());

            mRequestService.Verify(service => service.ReturnException(messageId, It.Is <Exception>(ex => ex.GetType() == exceptionType)), Times.Once);
        }
        private void HandleRpcError(IChannelHandlerContext ctx, long messageReqMsgId, TRpcError error)
        {
            Log.Warn($"#{ClientSettings.ClientSession.SessionId}: Recieve error from server: {error.ErrorMessage}");
            if (Log.IsDebugEnabled)
            {
                var jMessages = JsonConvert.SerializeObject(error);
                Log.Debug(jMessages);
            }

            switch (error.ErrorMessage)
            {
            case "PHONE_CODE_INVALID":
                RequestService.ReturnException(messageReqMsgId, new PhoneCodeInvalidException());
                break;

            case "SESSION_PASSWORD_NEEDED":
                RequestService.ReturnException(messageReqMsgId, new CloudPasswordNeededException());
                break;

            case var phoneMigrate when phoneMigrate.StartsWith("PHONE_MIGRATE_"):
            case var userMigrate when userMigrate.StartsWith("USER_MIGRATE_"):
            case var netwokMigrate when netwokMigrate.StartsWith("NETWORK_MIGRATE_"):
                var dcNumber = int.Parse(Regex.Match(error.ErrorMessage, @"\d+").Value);

                var dcOption = ClientSettings.Config.DcOptions.First(option => option.Id == dcNumber);

                ClientSettings.ClientSession.AuthKey       = null;
                ClientSettings.ClientSession.ServerAddress = dcOption.IpAddress;
                ClientSettings.ClientSession.Port          = dcOption.Port;

                ctx.Flush();

                SessionWriter.Save(ClientSettings.ClientSession)
                .ContinueWith(_ => ctx.DisconnectAsync());
                break;

            case var fileMigrate when fileMigrate.StartsWith("FILE_MIGRATE_"):
                var fileMigrateDcNumber = Regex.Match(fileMigrate, @"\d+").Value;

                var fileMigrateDcIdx = int.Parse(fileMigrateDcNumber);

                RequestService.ReturnException(messageReqMsgId, new FileMigrationException(fileMigrateDcIdx));
                break;

            case var floodMessage when floodMessage.StartsWith("FLOOD_WAIT_"):
                var floodMessageTime = Regex.Match(floodMessage, @"\d+").Value;

                var seconds = int.Parse(floodMessageTime);

                RequestService.ReturnException(messageReqMsgId, new FloodWaitException(TimeSpan.FromSeconds(seconds)));
                break;

            case "AUTH_KEY_UNREGISTERED":
                ClientSettings.ClientSession.AuthKey = null;
                ClientSettings.ClientSession.UserId  = null;
                SessionWriter.Save(ClientSettings.ClientSession).ContinueWith(_ => RequestService.ReturnException(messageReqMsgId, new UserNotAuthorizeException()));
                break;

            default:
                RequestService.ReturnException(messageReqMsgId, new UnhandledException(error.ErrorMessage));
                break;
            }
        }