public override bool TryReadMeaage(WSDataToken dataToken, byte[] buffer, out List <DataMessage> messageList) { messageList = new List <DataMessage>(); int offset = 0; do { //check close flag if (CheckCloseFlag(buffer, ref offset)) { messageList.Add(new DataMessage() { Data = buffer, Opcode = Opcode.Close }); dataToken.Reset(); return(true); } //receive buffer is complated if (!CheckPrefixHeadComplated(dataToken, buffer, ref offset) || !CheckDataComplated(dataToken, buffer, ref offset)) { return(false); } byte[] data = dataToken.ByteArrayForMessage; if (data != null) { messageList.Add(new DataMessage() { Data = data, Opcode = Opcode.Text }); } dataToken.Reset(); } while (offset < buffer.Length); return(true); }
public override bool TryReadMeaage(WSDataToken dataToken, byte[] buffer, out List <DataMessage> messageList) { if (CheckVersion((WebSocket)dataToken.Socket)) { return(base.TryReadMeaage(dataToken, buffer, out messageList)); } messageList = new List <DataMessage>(); int offset = 0; do { //receive buffer is complated if (!CheckPrefixHeadComplated(dataToken, buffer, ref offset) || !dataToken.HeadFrame.CheckRSV || !CheckPayloadHeadComplated(dataToken, buffer, ref offset) || !CheckPayloadDataComplated(dataToken, buffer, ref offset)) { return(false); } byte[] data = dataToken.HeadFrame.HasMask ? DecodeMask(dataToken.ByteArrayForMessage, dataToken.ByteArrayMask, 0, dataToken.MessageLength) : dataToken.ByteArrayForMessage; if (!dataToken.HeadFrame.FIN) { dataToken.DataFrames.Add(new DataSegmentFrame() { Head = dataToken.HeadFrame, Data = new ArraySegment <byte>(data) }); } else { //frame complated sbyte opCode; if (dataToken.DataFrames.Count > 0) { dataToken.DataFrames.Add(new DataSegmentFrame() { Head = dataToken.HeadFrame, Data = new ArraySegment <byte>(data) }); opCode = dataToken.DataFrames[0].Head.OpCode; data = CombineDataFrames(dataToken.DataFrames); } else { opCode = dataToken.HeadFrame.OpCode; } messageList.Add(new DataMessage() { Data = data, Opcode = opCode }); dataToken.DataFrames.Clear(); } dataToken.Reset(); } while (offset < buffer.Length); return(true); }