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.rs22
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) => {