private static List <RequestMessage> TranslateBytesToRequests(byte[] bytes) { var requests = new List <RequestMessage>(); using (var stream = new MemoryStream(bytes)) { int bytesRead = 0; while (stream.Length > bytesRead) { int startPosition = bytesRead; var streamReader = new BsonStreamReader(stream, Utf8Helper.StrictUtf8Encoding); var length = streamReader.ReadInt32(); var requestId = streamReader.ReadInt32(); var responseTo = streamReader.ReadInt32(); var opCode = (Opcode)streamReader.ReadInt32(); bytesRead += length; stream.Position = startPosition; var encoderFactory = new BinaryMessageEncoderFactory(stream, null); switch (opCode) { case Opcode.Query: requests.Add(encoderFactory.GetQueryMessageEncoder().ReadMessage()); break; default: throw new InvalidOperationException("Unsupported request type."); } } } return(requests); }
internal override void ReadHeaderFrom(BsonStreamReader streamReader) { base.ReadHeaderFrom(streamReader); _responseFlags = (ResponseFlags)streamReader.ReadInt32(); _cursorId = streamReader.ReadInt64(); _startingFrom = streamReader.ReadInt32(); _numberReturned = streamReader.ReadInt32(); if ((_responseFlags & ResponseFlags.CursorNotFound) != 0) { throw new MongoQueryException("Cursor not found."); } if ((_responseFlags & ResponseFlags.QueryFailure) != 0) { BsonDocument document; using (BsonReader bsonReader = new BsonBinaryReader(streamReader.BaseStream, _readerSettings)) { var context = BsonDeserializationContext.CreateRoot <BsonDocument>(bsonReader, b => b.AllowDuplicateElementNames = true); document = BsonDocumentSerializer.Instance.Deserialize(context); } var mappedException = ExceptionMapper.Map(document); if (mappedException != null) { throw mappedException; } var err = document.GetValue("$err", "Unknown error."); var message = string.Format("QueryFailure flag was {0} (response was {1}).", err, document.ToJson()); throw new MongoQueryException(message, document); } }
// internal methods internal virtual void ReadHeaderFrom(BsonStreamReader streamReader) { _messageLength = streamReader.ReadInt32(); _requestId = streamReader.ReadInt32(); _responseTo = streamReader.ReadInt32(); if ((MessageOpcode)streamReader.ReadInt32() != _opcode) { throw new FileFormatException("Message header opcode is not the expected one."); } }