fix: Resolve SSE reading deadlocks in Stdio proxies
This commit is contained in:
1 parent
0ecd862e89
commit
0de78e8fae
2 files changed
+26
-2
No files matched your search
+13
-1
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user