Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-dap/src/transport.rs')
| -rw-r--r-- | helix-dap/src/transport.rs | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/helix-dap/src/transport.rs b/helix-dap/src/transport.rs index c1e15b3f..6911e4e7 100644 --- a/helix-dap/src/transport.rs +++ b/helix-dap/src/transport.rs @@ -85,10 +85,11 @@ impl Transport { async fn recv_server_message( reader: &mut Box<dyn AsyncBufRead + Unpin + Send>, buffer: &mut String, + content: &mut Vec<u8>, ) -> Result<Payload> { let mut content_length = None; loop { - buffer.truncate(0); + buffer.clear(); if reader.read_line(buffer).await? == 0 { return Err(Error::StreamClosed); }; @@ -117,17 +118,17 @@ impl Transport { } let content_length = content_length.context("missing content length")?; - - //TODO: reuse vector - let mut content = vec![0; content_length]; - reader.read_exact(&mut content).await?; - let msg = std::str::from_utf8(&content).context("invalid utf8 from server")?; + content.resize(content_length, 0); + reader.read_exact(content).await?; + let msg = std::str::from_utf8(content).context("invalid utf8 from server")?; info!("<- DAP {}", msg); // try parsing as output (server response) or call (server request) let output: serde_json::Result<Payload> = serde_json::from_str(msg); + content.clear(); + Ok(output?) } @@ -242,8 +243,15 @@ impl Transport { client_tx: UnboundedSender<Payload>, ) { let mut recv_buffer = String::new(); + let mut content_buffer = Vec::new(); loop { - match Self::recv_server_message(&mut server_stdout, &mut recv_buffer).await { + match Self::recv_server_message( + &mut server_stdout, + &mut recv_buffer, + &mut content_buffer, + ) + .await + { Ok(msg) => match transport.process_server_message(&client_tx, msg).await { Ok(_) => (), Err(err) => { |