diff --git a/src/net/channel.rs b/src/net/channel.rs index 707eb6a4b..8d01ed96d 100644 --- a/src/net/channel.rs +++ b/src/net/channel.rs @@ -217,7 +217,7 @@ impl Channel { } /// Sends an outbound Message by writing data to the given async stream. - async fn send_message(&self, message: &M) -> Result<()> { + async fn send_message(&self, payload: &M) -> Result<()> { let command = M::NAME.to_string(); assert!(!command.is_empty()); assert!(std::mem::size_of::() <= std::mem::size_of::()); @@ -234,27 +234,21 @@ impl Channel { trace!(target: "net::channel::send_message()", "Sending magic..."); written += MAGIC_BYTES.encode_async(stream).await?; - trace!(target: "net::channel::send_message()", "Sent magic"); - trace!(target: "net::channel::send_message()", "Sending command..."); - // First encode the command to an intermediate buffer. - M::NAME.to_string().encode_async(&mut buffer).await?; + trace!(target: "net::channel::send_message()", "Sending command..."); + written += M::NAME.to_string().encode_async(stream).await?; + trace!(target: "net::channel::send_message()", "Sent command: {}", M::NAME.to_string()); + + trace!(target: "net::channel::send_message()", "Sending payload..."); + // First encode the payload to an intermediate buffer. + payload.encode_async(&mut buffer).await?; // Then extract the length of the intermediate buffer as a VarInt - // and write to the stream. This is the length of the command message. - // Then encode the command itself to the stream. + // and write to the stream. This is the length of the payload. + // Then encode the payload itself to the stream. written += VarInt(buffer.len() as u64).encode_async(stream).await?; - written += M::NAME.to_string().encode_async(stream).await?; - - trace!(target: "net::channel::send_message()", "Sent command: {}", M::NAME.to_string()); - trace!(target: "net::channel::send_message()", "Sending payload..."); - - // Do the same proceedure for the Message payload. - message.encode_async(&mut buffer).await?; - - written += VarInt(buffer.len() as u64).encode_async(stream).await?; - written += message.encode_async(stream).await?; + written += payload.encode_async(stream).await?; trace!(target: "net::channel::send_message()", "Sent payload {} bytes, total bytes {}", buffer.len(), written); @@ -284,9 +278,15 @@ impl Channel { return Err(Error::MalformedPacket) } - let len = VarInt::decode_async(stream).await?.0; - let mut take = stream.take(len); - let command = String::decode_async(&mut take).await?; + let cmd_len = VarInt::decode_async(stream).await?.0; + let mut take = stream.take(cmd_len); + + let mut bytes = Vec::new(); + for _ in 0..cmd_len { + bytes.push(AsyncDecodable::decode_async(&mut take).await?); + } + + let command = String::from_utf8(bytes)?; Ok(command) }