/// <summary>Read response from the network stream.</summary> /// <remarks>If the response contains payload portion, i.e. files, they are <b>not</b> read from the stream. /// It's caller's responsibility to iterate through <see cref="payload" /> values and read all the data before reusing the connection for other requests.</remarks> public static async Task <Response> receive(Stream connection) { // Receive into array of bytes int length = BitConverter.ToInt32(await connection.read(4), 0); byte[] buffer = await connection.read(length); // Parse Hash firstHash = null; List <object> otherValues = null; List <Data> payloads = null; var parser = new ResponseParser(buffer); foreach (object obj in parser.parse()) { switch (obj) { case Hash h: if (null == firstHash) { firstHash = h; break; } goto default; case Data data: if (null == payloads) { payloads = new List <Data>(); } payloads.Add(data); break; default: if (null == otherValues) { otherValues = new List <object>(); } otherValues.Add(obj); break; } } return(new Response(firstHash, otherValues, payloads)); }