ReadStreamer panics when the stream ends mid-line
Los mantenedores suelen responder en 2 días
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 85/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- rust
- Área
- networking
Línea de trabajo
Comienza por src/io.rs:86, donde ReadStreamer::_enqueue_from_buf extrae el último byte del búfer, y rastrea cómo se propaga el resultado a los bucles de lectura bloqueantes y asíncronos. El cambio debe devolver un error UnexpectedEof cuando se produzca EOF sin un salto de línea final, preservando las lecturas normales terminadas en salto de línea. Añade o ejecuta una prueba de regresión con la entrada proporcionada de EOF a mitad de línea y verifica que el cliente produce un error y finaliza el flujo en lugar de entrar en pánico.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
ReadStreamer::_enqueue_from_buf (src/io.rs:86) asserts that the buffer ends with \n:
match self.buf.pop() {
Some(b) => assert_eq!(b, b'\n'),
None => return false,
}
read_until(b'\n', ..) only guarantees a trailing \n if one was found. At EOF it returns whatever partial bytes were read. So if the server closes the connection (or the stream is cut) partway through a line, the client panics instead of returning an error. This affects both the blocking Iterator impl and the async Stream impl, so it reaches BlockingClient/AsyncClient read loops too.
Repro
use electrum_streaming_client::io::ReadStreamer;
fn main() {
// Server closes connection mid-line (no trailing '\n').
let data: &[u8] = br#"{"jsonrpc":"2.0","id":0,"result":nul"#;
for msg in ReadStreamer::new(std::io::BufReader::new(data)) {
println!("{msg:?}");
}
}
thread 'main' panicked at src/io.rs:86:24:
assertion `left == right` failed
left: 108
right: 10
Expected
Yield Err(std::io::ErrorKind::UnexpectedEof) (then end the stream), instead of panicking on input from the network.
Suggested fix
Replace the assert with an error, e.g.:
match self.buf.pop() {
Some(b'\n') => {}
Some(_) => {
self.err = Some(std::io::ErrorKind::UnexpectedEof.into());
return false;
}
None => return false,
}
- Lenguaje dominante
- Rust
- Estrellas
- 10
- Forks
- 8
- Merge medio
- 11 d 12 h
- PR fusionados (30 d)
- 1
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de bitcoindevkit/electrum_streaming_client
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
bitcoindevkit/electrum_streaming_client#57 ·
Los mantenedores suelen responder en 2 días
-
GetTx documentationAbiertodocumentation
Dificultad 1/5 1-3 horas Aptitud para principiantes 78/100
bitcoindevkit/electrum_streaming_client#29 ·
Los mantenedores suelen responder en 2 días
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 18/100
bitcoindevkit/electrum_streaming_client#55 ·
Los mantenedores suelen responder en 2 días
-
RUSTSEC-2026-0221: `event-listener` allows `!Send` tags to cross thread boundaries via `StackSlot`Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 51/100
bitcoindevkit/electrum_streaming_client#54 ·
Los mantenedores suelen responder en 2 días
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 1/100
bitcoindevkit/electrum_streaming_client#53 ·
Los mantenedores suelen responder en 2 días
Todos los issues de bitcoindevkit/electrum_streaming_client
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
farion1231/cc-switch#8829 ·
Los mantenedores suelen responder en 1 día
-
bug ci good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 92/100
longbridge/gpui-kit#3677 ·
Los mantenedores suelen responder en 1 día
-
E-pr-welcome
Dificultad 2/5 1-3 horas Aptitud para principiantes 77/100
seanmonstar/reqwest#3121 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 68/100
ilya-zlobintsev/LACT#1235 ·
Los mantenedores suelen responder en 1 día