/// <summary> /// parse /// </summary> /// <param name="connection"></param> /// <param name="buffer"></param> /// <param name="maxMessageSize"></param> /// <param name="recvivedMessageInfo"></param> /// <param name="readlength"></param> /// <returns></returns> /// <exception cref="BadProtocolException">bad thrift protocol</exception> public bool TryParse(IConnection connection, ArraySegment <byte> buffer, int maxMessageSize, out IRecvivedMessageInfo <TThriftMessage> recvivedMessageInfo, out int readlength) { recvivedMessageInfo = null; readlength = 0; if (buffer.Count < 4) { return(false); } //获取message length var messageLength = Utils.NetworkBitConverter.ToInt32(buffer.Array, buffer.Offset); if (messageLength < 10) { throw new BadProtocolException("bad thrift protocol"); } if (messageLength > maxMessageSize) { throw new BadProtocolException("message is too long"); } readlength = messageLength + 4; if (buffer.Count < readlength) { readlength = 0; return(false); } bool isSync = BitConverter.ToBoolean(buffer.Array, buffer.Offset + 4); int seqId = Utils.NetworkBitConverter.ToInt32(buffer.Array, buffer.Offset + 5); var payload = new byte[messageLength - 6]; Buffer.BlockCopy(buffer.Array, buffer.Offset + 10, payload, 0, payload.Length); var message = CreateThriftMessage(payload); recvivedMessageInfo = new RecvivedMessageInfo <TThriftMessage>(message, isSync, seqId); return(true); }
/// <summary> /// parse /// </summary> /// <param name="connection"></param> /// <param name="buffer"></param> /// <param name="maxMessageSize"></param> /// <param name="recvMessageInfo"></param> /// <param name="readlength"></param> /// <returns></returns> /// <exception cref="BadProtocolException">bad command line protocol</exception> public bool TryParse(IConnection connection, ArraySegment <byte> buffer, int maxMessageSize, out IRecvivedMessageInfo <CommandLineMessage> recvMessageInfo, out int readlength) { recvMessageInfo = null; readlength = 0; if (buffer.Count < 2) { return(false); } //查找\r\n标记符 for (int i = buffer.Offset, len = buffer.Offset + buffer.Count; i < len; i++) { if (buffer.Array[i] == 13 && i + 1 < len && buffer.Array[i + 1] == 10) { readlength = i + 2 - buffer.Offset; if (readlength == 2) { recvMessageInfo = new RecvivedMessageInfo <CommandLineMessage>(new CommandLineMessage(string.Empty), false); return(true); } if (readlength > maxMessageSize) { throw new BadProtocolException("message is too long"); } string text = Encoding.UTF8.GetString(buffer.Array, buffer.Offset, readlength - 2); var array = text.Split(SPLITER, StringSplitOptions.RemoveEmptyEntries); var queue = new Queue <string>(array); recvMessageInfo = new RecvivedMessageInfo <CommandLineMessage>(ParseMessageText(queue, out var isSync, out int seqId), isSync, seqId); return(true); } } readlength = 0; return(false); }