fix: Resolve SSE reading deadlocks in Stdio proxies

This commit is contained in:
Riz Ashraf committed 2026-09-09 08:27:56 +01:00
1 parent 0ecd862e89
commit 0de78e8fae
2 files changed
+26 -2

No files matched your search

+13 -1
View File
@@ -69,7 +69,14 @@ pub fn run_proxy(target_url: &str) -> Result<bool, Box<dyn std::error::Error + S
let mut is_message = false; let mut is_message = false;
let mut is_endpoint = false; let mut is_endpoint = false;
while let Ok(bytes) = reader.read_line(&mut line).await { loop {
tokio::select! {
_ = shutdown_rx.recv() => {
return Ok(false);
}
res = reader.read_line(&mut line) => {
match res {
Ok(bytes) => {
if bytes == 0 { break; } if bytes == 0 { break; }
let trimmed = line.trim(); let trimmed = line.trim();
if trimmed.starts_with("event: message") { if trimmed.starts_with("event: message") {
@@ -91,6 +98,11 @@ pub fn run_proxy(target_url: &str) -> Result<bool, Box<dyn std::error::Error + S
} }
line.clear(); line.clear();
} }
Err(_) => break,
}
}
}
}
*post_url.write().await = String::new(); *post_url.write().await = String::new();
return Ok(true); return Ok(true);
} }
+13 -1
View File
@@ -87,7 +87,14 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut is_message = false; let mut is_message = false;
let mut is_endpoint = false; let mut is_endpoint = false;
while let Ok(bytes) = reader.read_line(&mut line).await { loop {
tokio::select! {
_ = shutdown_rx.recv() => {
return Ok(()); // Stdin closed, exit entirely
}
res = reader.read_line(&mut line) => {
match res {
Ok(bytes) => {
if bytes == 0 { break; } if bytes == 0 { break; }
let trimmed = line.trim(); let trimmed = line.trim();
if trimmed.starts_with("event: message") { if trimmed.starts_with("event: message") {
@@ -109,6 +116,11 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
} }
line.clear(); line.clear();
} }
Err(_) => break,
}
}
}
}
*post_url.write().await = String::new(); *post_url.write().await = String::new();
tokio::time::sleep(tokio::time::Duration::from_millis(500)).await; tokio::time::sleep(tokio::time::Duration::from_millis(500)).await;
} }