Skip to content

Commit

Permalink
Port over parsing improvements from the LSP
Browse files Browse the repository at this point in the history
We need to terminate if we ever read 0 bytes which indicates closed
stream.
  • Loading branch information
archseer committed Oct 17, 2021
1 parent 0a6b600 commit ea59f77
Showing 1 changed file with 19 additions and 14 deletions.
33 changes: 19 additions & 14 deletions helix-dap/src/transport.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,26 +82,29 @@ impl Transport {
let mut content_length = None;
loop {
buffer.truncate(0);
reader.read_line(buffer).await?;
let header = buffer.trim();
if reader.read_line(buffer).await? == 0 {
return Err(Error::StreamClosed);
};

if header.is_empty() {
if buffer == "\r\n" {
// look for an empty CRLF line
break;
}

let mut parts = header.split(": ");
let header = buffer.trim();
let parts = header.split_once(": ");

match (parts.next(), parts.next(), parts.next()) {
(Some("Content-Length"), Some(value), None) => {
match parts {
Some(("Content-Length", value)) => {
content_length = Some(value.parse().context("invalid content length")?);
}
(Some(_), Some(_), None) => {}
_ => {
return Err(std::io::Error::new(
std::io::ErrorKind::Other,
"Failed to parse header",
)
.into());
Some((_, _)) => {}
None => {
// Workaround: Some non-conformant language servers will output logging and other garbage
// into the same stream as JSON-RPC messages. This can also happen from shell scripts that spawn
// the server. Skip such lines and log a warning.

// warn!("Failed to parse header: {:?}", header);
}
}
}
Expand All @@ -126,7 +129,9 @@ impl Transport {
buffer: &mut String,
) -> Result<()> {
buffer.truncate(0);
err.read_line(buffer).await?;
if err.read_line(buffer).await? == 0 {
return Err(Error::StreamClosed);
};
error!("err <- {}", buffer);

Ok(())
Expand Down

0 comments on commit ea59f77

Please sign in to comment.