protected bool HandleMessage(Message message) { lock (Sync) switch (message.Opcode) { case 1: OnString?.Invoke(Encoding.UTF8.GetString(message.Payload)); return(true); case 2: OnBinary?.Invoke(message.Payload); return(true); case 8: if (message.Length < 2) { FinishClose(); return(true); } ushort code = (ushort)(message.Payload[0] * 256 + message.Payload[1]); string reason = Encoding.UTF8.GetString(PrimitiveBuffer.Slice(message.Payload, 2, message.Length)); if (RecvClose && message.Length > 2) { return(false); } if (message.Length > 2) { return(FinishClose(code, reason)); } return(FinishClose(code)); case 9: OnPing?.Invoke(message.Payload); return(true); case 10: OnPong?.Invoke(message.Payload); return(true); default: return(false); } }
private void OnIncomingMessage(Message message) { if (State == TcpSocketState.Closed) { return; } switch (message.Opcode) { case 1: string str; try { str = Encoding.UTF8.GetString(message.Data); } catch (ArgumentException) { ForciblyClose(); return; } OnString?.Invoke(str); break; case 2: OnBinary?.Invoke(message.Data); break; case 8: ushort code = (ushort)(message.Data.Length == 0 ? 0 : message.Data[0] * 256u + message.Data[1]); string reason = message.Data.Length >= 2 ? Encoding.UTF8.GetString(message.Data, 2, message.Data.Length - 2) : null; OnClose?.Invoke(code, reason); AnswerClose(code, reason); break; case 9: OnPing?.Invoke(message.Data); AnswerPing(message.Data); break; case 10: OnPong?.Invoke(message.Data); break; default: ForciblyClose(); break; } }