public void Parse_Throws_MessageReadException_On_Missing_Data() { var msg = new MessageBuilder() .WriteCode(MessageCode.Server.Login) .Build(); var ex = Record.Exception(() => LoginResponse.Parse(msg)); Assert.NotNull(ex); Assert.IsType <MessageReadException>(ex); }
public void Parse_Throws_MessageException_On_Code_Mismatch() { var msg = new MessageBuilder() .WriteCode(MessageCode.Peer.BrowseRequest) .Build(); var ex = Record.Exception(() => LoginResponse.Parse(msg)); Assert.NotNull(ex); Assert.IsType <MessageException>(ex); }
public void Parse_Returns_Expected_Data_On_Failure() { var str = RandomGuid; var msg = new MessageBuilder() .WriteCode(MessageCode.Server.Login) .WriteByte(0) .WriteString(str) .Build(); var response = LoginResponse.Parse(msg); Assert.False(response.Succeeded); Assert.Equal(str, response.Message); }
public void Parse_Returns_Expected_Data_On_Success() { var ip = new IPAddress(Random.Next(1024)); var ipBytes = ip.GetAddressBytes(); Array.Reverse(ipBytes); var msg = new MessageBuilder() .WriteCode(MessageCode.Server.Login) .WriteByte(1) .WriteString(string.Empty) .WriteBytes(ipBytes) .Build(); var response = LoginResponse.Parse(msg); Assert.True(response.Succeeded); Assert.Equal(string.Empty, response.Message); Assert.Equal(ip, response.IPAddress); }
private static ResponseBase ReadResponse(BinaryReader reader) { int responseSize = reader.ReadInt32(); byte[] bytes = reader.ReadBytes(responseSize); ResponseType responseType = (ResponseType)BitConverter.ToInt32(bytes, 0); switch (responseType) { case ResponseType.RegistrationResult: return(RegistrationResponse.Parse(bytes)); case ResponseType.LoginResult: return(LoginResponse.Parse(bytes)); case ResponseType.AddContact: return(AddContactResponse.Parse(bytes)); case ResponseType.GetContacts: return(GetContactsResponse.Parse(bytes)); case ResponseType.SendMessage: return(SendMessageResponse.Parse(bytes)); case ResponseType.ReceiveMessages: return(ReceiveMessagesResponse.Parse(bytes)); case ResponseType.Ok: case ResponseType.InvalidAuthToken: throw new NotImplementedException(); case ResponseType.ServerError: throw new ServerErrorException(ServerErrorResponse.Parse(bytes).ErrorMessage); default: throw new InvalidOperationException("Invalid type of response"); } }
public LoginResponse Login(string email, string password) { var result = new LoginResponse(); var request = Core.CoreRequest.Create(LoginServer, LoginServerPort, "login"); request.Params.Add("e", email); request.Params.Add("p", password); request.Params.Add("protoversion", "8.2"); request.Params.Add("client", ClientID); request.Params.Add("h", Host); request.Params.Add("build", Build); result.RequestTime = DateTime.Now; var response = request.GetResponse(); result.ResponseTime = DateTime.Now; result.Parse(response); this.SessionID = result.Session; this.Server = result.RedirectIP; this.Port = result.RedirectPort; return result; }
public async void HandleMessage(object sender, byte[] message) { var code = new MessageReader <MessageCode.Server>(message).ReadCode(); Diagnostic.Debug($"Server message received: {code}"); try { switch (code) { case MessageCode.Server.ParentMinSpeed: case MessageCode.Server.ParentSpeedRatio: case MessageCode.Server.WishlistInterval: SoulseekClient.Waiter.Complete(new WaitKey(code), IntegerResponse.Parse <MessageCode.Server>(message)); break; case MessageCode.Server.Login: SoulseekClient.Waiter.Complete(new WaitKey(code), LoginResponse.Parse(message)); break; case MessageCode.Server.RoomList: SoulseekClient.Waiter.Complete(new WaitKey(code), RoomList.Parse(message)); break; case MessageCode.Server.PrivilegedUsers: SoulseekClient.Waiter.Complete(new WaitKey(code), PrivilegedUserList.Parse(message)); break; case MessageCode.Server.NetInfo: var netInfo = NetInfo.Parse(message); foreach (var peer in netInfo.Parents) { Console.WriteLine($"{peer.Username} {peer.IPAddress} {peer.Port}"); } break; case MessageCode.Server.ConnectToPeer: var connectToPeerResponse = ConnectToPeerResponse.Parse(message); if (connectToPeerResponse.Type == Constants.ConnectionType.Tranfer) { // ensure that we are expecting at least one file from this user before we connect. the response // doesn't contain any other identifying information about the file. if (!SoulseekClient.Downloads.IsEmpty && SoulseekClient.Downloads.Values.Any(d => d.Username == connectToPeerResponse.Username)) { var(connection, remoteToken) = await SoulseekClient.PeerConnectionManager.GetTransferConnectionAsync(connectToPeerResponse).ConfigureAwait(false); var download = SoulseekClient.Downloads.Values.FirstOrDefault(v => v.RemoteToken == remoteToken && v.Username == connectToPeerResponse.Username); if (download != default(Transfer)) { SoulseekClient.Waiter.Complete(new WaitKey(Constants.WaitKey.IndirectTransfer, download.Username, download.Filename, download.RemoteToken), connection); } } else { throw new SoulseekClientException($"Unexpected transfer request from {connectToPeerResponse.Username} ({connectToPeerResponse.IPAddress}:{connectToPeerResponse.Port}); Ignored."); } } else { await SoulseekClient.PeerConnectionManager.GetOrAddMessageConnectionAsync(connectToPeerResponse).ConfigureAwait(false); } break; case MessageCode.Server.AddUser: var addUserResponse = AddUserResponse.Parse(message); SoulseekClient.Waiter.Complete(new WaitKey(code, addUserResponse.Username), addUserResponse); break; case MessageCode.Server.GetStatus: var statsResponse = GetStatusResponse.Parse(message); SoulseekClient.Waiter.Complete(new WaitKey(code, statsResponse.Username), statsResponse); UserStatusChanged?.Invoke(this, new UserStatusChangedEventArgs(statsResponse)); break; case MessageCode.Server.PrivateMessage: var pm = PrivateMessage.Parse(message); PrivateMessageReceived?.Invoke(this, pm); if (SoulseekClient.Options.AutoAcknowledgePrivateMessages) { await SoulseekClient.AcknowledgePrivateMessageAsync(pm.Id, CancellationToken.None).ConfigureAwait(false); } break; case MessageCode.Server.GetPeerAddress: var peerAddressResponse = GetPeerAddressResponse.Parse(message); SoulseekClient.Waiter.Complete(new WaitKey(code, peerAddressResponse.Username), peerAddressResponse); break; default: Diagnostic.Debug($"Unhandled server message: {code}; {message.Length} bytes"); break; } } catch (Exception ex) { Diagnostic.Warning($"Error handling server message: {code}; {ex.Message}", ex); } }
public static NetworkMessageBase Decode(string messageString) { if (string.IsNullOrWhiteSpace(messageString)) { return(null); } var type = (NetworkMessageType)Enum.Parse(typeof(NetworkMessageType), GetTypeFromMsg(messageString)); var msg = GetMsgContent(messageString); switch (type) { case NetworkMessageType.ErrorResponse: return(ErrorResponse.Parse(msg)); case NetworkMessageType.HeartbeatRequest: return(HeartbeatRequest.Parse(msg)); case NetworkMessageType.HeartbeatResponse: return(HeartbeatResponse.Parse(msg)); case NetworkMessageType.BeginConnectionRequest: return(BeginConnectionRequest.Parse(msg)); case NetworkMessageType.BeginConnectionResponse: return(BeginConnectionResponse.Parse(msg)); case NetworkMessageType.BeginDebugConnectionRequest: return(BeginDebugConnectionRequest.Parse(msg)); case NetworkMessageType.BeginDebugConnectionResponse: return(BeginDebugConnectionResponse.Parse(msg)); case NetworkMessageType.EndConnectionRequest: return(EndConnectionRequest.Parse(msg)); case NetworkMessageType.EndConnectionResponse: return(EndConnectionResponse.Parse(msg)); case NetworkMessageType.GetUserListRequest: return(GetUserListRequest.Parse(msg)); case NetworkMessageType.GetUserListResponse: return(GetUserListResponse.Parse(msg)); case NetworkMessageType.LoginRequest: return(LoginRequest.Parse(msg)); case NetworkMessageType.LoginResponse: return(LoginResponse.Parse(msg)); case NetworkMessageType.LogoutRequest: return(LogoutRequest.Parse(msg)); case NetworkMessageType.LogoutResponse: return(LogoutResponse.Parse(msg)); case NetworkMessageType.GetAppointmentsOfADayRequest: return(GetAppointmentsOfADayRequest.Parse(msg)); case NetworkMessageType.GetAppointmentsOfADayResponse: return(GetAppointmentsOfADayResponse.Parse(msg)); case NetworkMessageType.GetAppointmentsOfAPatientRequest: return(GetAppointmentsOfAPatientRequest.Parse(msg)); case NetworkMessageType.GetAppointmentsOfAPatientResponse: return(GetAppointmentsOfAPatientResponse.Parse(msg)); case NetworkMessageType.GetPatientListRequest: return(GetPatientListRequest.Parse(msg)); case NetworkMessageType.GetPatientListResponse: return(GetPatientListResponse.Parse(msg)); case NetworkMessageType.GetMedicalPracticeRequest: return(GetMedicalPracticeRequest.Parse(msg)); case NetworkMessageType.GetMedicalPracticeResponse: return(GetMedicalPracticeResponse.Parse(msg)); case NetworkMessageType.GetTherapyPlacesTypeListRequest: return(GetTherapyPlacesTypeListRequest.Parse(msg)); case NetworkMessageType.GetTherapyPlacesTypeListResponse: return(GetTherapyPlacesTypeListResponse.Parse(msg)); case NetworkMessageType.GetPracticeVersionInfoRequest: return(GetPracticeVersionInfoRequest.Parse(msg)); case NetworkMessageType.GetPracticeVersionInfoResponse: return(GetPracticeVersionInfoResponse.Parse(msg)); case NetworkMessageType.TryToAddNewEventsRequest: return(TryToAddNewEventsRequest.Parse(msg)); case NetworkMessageType.TryToAddNewEventsResponse: return(TryToAddNewEventsResponse.Parse(msg)); case NetworkMessageType.GetLockRequest: return(GetLockRequest.Parse(msg)); case NetworkMessageType.GetLockResponse: return(GetLockResponse.Parse(msg)); case NetworkMessageType.ReleaseLockRequest: return(ReleaseLockRequest.Parse(msg)); case NetworkMessageType.ReleaseLockResponse: return(ReleaseLockResponse.Parse(msg)); case NetworkMessageType.GetLabelListRequest: return(GetLabelListRequest.Parse(msg)); case NetworkMessageType.GetLabelListResponse: return(GetLabelListResponse.Parse(msg)); case NetworkMessageType.EventBusNotification: return(EventBusNotification.Parse(msg)); case NetworkMessageType.PatientAddedNotification: return(PatientAddedNotification.Parse(msg)); case NetworkMessageType.PatientUpdatedNotification: return(PatientUpdatedNotification.Parse(msg)); case NetworkMessageType.TherapyPlaceTypeAddedNotification: return(TherapyPlaceTypeAddedNotification.Parse(msg)); case NetworkMessageType.TherapyPlaceTypeUpdatedNotification: return(TherapyPlaceTypeUpdatedNotification.Parse(msg)); default: throw new ArgumentException(); } }