/// <summary> /// Reads the message. /// </summary> /// <returns>A message.</returns> public CompressedMessage ReadMessage() { var reader = CreateBinaryReader(); var stream = reader.BsonStream; var messageStartPosition = stream.Position; var messageLength = stream.ReadInt32(); EnsureMessageLengthIsValid(messageLength); var requestId = stream.ReadInt32(); var responseTo = stream.ReadInt32(); var opcode = (Opcode)stream.ReadInt32(); EnsureOpcodeIsValid(opcode); var originalOpcode = (Opcode)stream.ReadInt32(); var uncompressedSize = stream.ReadInt32(); var compressorType = (CompressorType)stream.ReadByte(); var compressor = _compressorSource.Get(compressorType); using (var uncompressedBuffer = new MultiChunkBuffer(new OutputBufferChunkSource(BsonChunkPool.Default))) using (var uncompressedStream = new ByteBufferStream(uncompressedBuffer, ownsBuffer: false)) { uncompressedStream.WriteInt32(uncompressedSize + MessageHeaderLength); uncompressedStream.WriteInt32(requestId); uncompressedStream.WriteInt32(responseTo); uncompressedStream.WriteInt32((int)originalOpcode); compressor.Decompress(stream, uncompressedStream); uncompressedStream.Position = 0; uncompressedBuffer.MakeReadOnly(); var originalMessageEncoderFactory = new BinaryMessageEncoderFactory(uncompressedStream, _encoderSettings, _compressorSource); var originalMessageEncoder = _originalEncoderSelector.GetEncoder(originalMessageEncoderFactory); var originalMessage = originalMessageEncoder.ReadMessage(); return(new CompressedMessage(originalMessage, null, compressorType)); } }