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