internal static WebSocketFrame ReadFrame(Stream stream, bool unmask) { WebSocketFrame webSocketFrames = WebSocketFrame.readHeader(stream); WebSocketFrame.readExtendedPayloadLength(stream, webSocketFrames); WebSocketFrame.readMaskingKey(stream, webSocketFrames); WebSocketFrame.readPayloadData(stream, webSocketFrames); if (unmask) { webSocketFrames.Unmask(); } return(webSocketFrames); }
private static WebSocketFrame read(byte[] header, Stream stream, bool unmask) { /* Header */ // FIN var fin = (header[0] & 0x80) == 0x80 ? Fin.Final : Fin.More; // RSV1 var rsv1 = (header[0] & 0x40) == 0x40 ? Rsv.On : Rsv.Off; // RSV2 var rsv2 = (header[0] & 0x20) == 0x20 ? Rsv.On : Rsv.Off; // RSV3 var rsv3 = (header[0] & 0x10) == 0x10 ? Rsv.On : Rsv.Off; // Opcode var opcode = (Opcode)(header[0] & 0x0f); // MASK var mask = (header[1] & 0x80) == 0x80 ? Mask.Mask : Mask.Unmask; // Payload Length var payloadLen = (byte)(header[1] & 0x7f); // Check if valid header var err = isControl(opcode) && payloadLen > 125 ? "A control frame has a payload data which is greater than the allowable max size." : isControl(opcode) && fin == Fin.More ? "A control frame is fragmented." : !isData(opcode) && rsv1 == Rsv.On ? "A non data frame is compressed." : null; if (err != null) { throw new WebSocketException(CloseStatusCode.ProtocolError, err); } var frame = new WebSocketFrame(); frame._fin = fin; frame._rsv1 = rsv1; frame._rsv2 = rsv2; frame._rsv3 = rsv3; frame._opcode = opcode; frame._mask = mask; frame._payloadLength = payloadLen; /* Extended Payload Length */ var size = payloadLen < 126 ? 0 : payloadLen == 126 ? 2 : 8; var extPayloadLen = size > 0 ? stream.ReadBytes(size) : new byte[0]; if (size > 0 && extPayloadLen.Length != size) { throw new WebSocketException( "The 'Extended Payload Length' of a frame cannot be read from the data source."); } frame._extPayloadLength = extPayloadLen; /* Masking Key */ var masked = mask == Mask.Mask; var maskingKey = masked ? stream.ReadBytes(4) : new byte[0]; if (masked && maskingKey.Length != 4) { throw new WebSocketException( "The 'Masking Key' of a frame cannot be read from the data source."); } frame._maskingKey = maskingKey; /* Payload Data */ ulong len = payloadLen < 126 ? payloadLen : payloadLen == 126 ? extPayloadLen.ToUInt16(ByteOrder.Big) : extPayloadLen.ToUInt64(ByteOrder.Big); byte[] data = null; if (len > 0) { // Check if allowable max length. if (payloadLen > 126 && len > PayloadData.MaxLength) { throw new WebSocketException( CloseStatusCode.TooBig, "The length of 'Payload Data' of a frame is greater than the allowable max length."); } data = payloadLen > 126 ? stream.ReadBytes((long)len, 1024) : stream.ReadBytes((int)len); if (data.LongLength != (long)len) { throw new WebSocketException( "The 'Payload Data' of a frame cannot be read from the data source."); } } else { data = new byte[0]; } frame._payloadData = new PayloadData(data, masked); if (unmask && masked) { frame.Unmask(); } return(frame); }
private static WebSocketFrame read(byte[] header, Stream stream, bool unmask) { Fin fin = (((header[0] & 0x80) == 128) ? Fin.Final : Fin.More); Rsv rsv = (((header[0] & 0x40) == 64) ? Rsv.On : Rsv.Off); Rsv rsv2 = (((header[0] & 0x20) == 32) ? Rsv.On : Rsv.Off); Rsv rsv3 = (((header[0] & 0x10) == 16) ? Rsv.On : Rsv.Off); Opcode opcode = (Opcode)(header[0] & 0xFu); Mask mask = (((header[1] & 0x80) == 128) ? Mask.Mask : Mask.Unmask); byte b = (byte)(header[1] & 0x7Fu); string text = ((isControl(opcode) && b > 125) ? "A control frame has a payload data which is greater than the allowable max size." : ((isControl(opcode) && fin == Fin.More) ? "A control frame is fragmented." : ((isData(opcode) || rsv != Rsv.On) ? null : "A non data frame is compressed."))); if (text != null) { throw new WebSocketException(CloseStatusCode.ProtocolError, text); } WebSocketFrame webSocketFrame = new WebSocketFrame(); webSocketFrame._fin = fin; webSocketFrame._rsv1 = rsv; webSocketFrame._rsv2 = rsv2; webSocketFrame._rsv3 = rsv3; webSocketFrame._opcode = opcode; webSocketFrame._mask = mask; webSocketFrame._payloadLength = b; int num = ((b >= 126) ? ((b != 126) ? 8 : 2) : 0); byte[] array = ((num <= 0) ? new byte[0] : stream.ReadBytes(num)); if (num > 0 && array.Length != num) { throw new WebSocketException("The 'Extended Payload Length' of a frame cannot be read from the data source."); } webSocketFrame._extPayloadLength = array; bool flag = mask == Mask.Mask; byte[] array2 = ((!flag) ? new byte[0] : stream.ReadBytes(4)); if (flag && array2.Length != 4) { throw new WebSocketException("The 'Masking Key' of a frame cannot be read from the data source."); } webSocketFrame._maskingKey = array2; ulong num2 = ((b < 126) ? b : ((b != 126) ? array.ToUInt64(ByteOrder.Big) : array.ToUInt16(ByteOrder.Big))); byte[] array3 = null; if (num2 != 0) { if (b > 126 && num2 > long.MaxValue) { throw new WebSocketException(CloseStatusCode.TooBig, "The length of 'Payload Data' of a frame is greater than the allowable max length."); } array3 = ((b <= 126) ? stream.ReadBytes((int)num2) : stream.ReadBytes((long)num2, 1024)); if (array3.LongLength != (long)num2) { throw new WebSocketException("The 'Payload Data' of a frame cannot be read from the data source."); } } else { array3 = new byte[0]; } webSocketFrame._payloadData = new PayloadData(array3, flag); if (unmask && flag) { webSocketFrame.Unmask(); } return(webSocketFrame); }