on master help sign in
fix: lsp: Terminate transport on EOF

If stdout/stderr is closed, read_line will return 0 indicating EOF.

commit41f1e8e4fb4b3b387f34ef5d2e913e7ebc7fd888 authorBlaž Hrastnik <blaz@mxxn.io> dateTue 31 Aug 2021, 14:27 (5 years ago) parentfe17b99
1 file changed+11−6
helix-lsp/src/transport.rs+11−6
helix-lsp/src/transport.rs+11−6
@@ -1,4 +1,4 @@
1−use crate::Result;
1+use crate::{Error, Result};
22use anyhow::Context;
33use jsonrpc_core as jsonrpc;
44use log::{debug, error, info, warn};
@@ -76,14 +76,17 @@ impl Transport {
7676 let mut content_length = None;
7777 loop {
7878 buffer.truncate(0);
79− reader.read_line(buffer).await?;
80− let header = buffer.trim();
79+ if reader.read_line(buffer).await? == 0 {
80+ return Err(Error::StreamClosed);
81+ };
82+
83+ // debug!("<- header {:?}", buffer);
8184
8285 if header.is_empty() {
8386 break;
8487 }
8588
86− debug!("<- header {}", header);
89+ let header = buffer.trim();
8790
8891 let parts = header.split_once(": ");
8992
@@ -121,8 +124,10 @@ impl Transport {
121124 buffer: &mut String,
122125 ) -> Result<()> {
123126 buffer.truncate(0);
124− err.read_line(buffer).await?;
125− error!("err <- {}", buffer);
127+ if err.read_line(buffer).await? == 0 {
128+ return Err(Error::StreamClosed);
129+ };
130+ error!("err <- {:?}", buffer);
126131
127132 Ok(())
128133 }