Skip to content

EventSteam! randomly seems to send line consisting of only ":" #2983

@Connor-Kelly

Description

@Connor-Kelly

Rocket Version

0.5.1

Operating System

Arch Linux x86_64 - Linux 6.17.9-arch1-1

Rust Toolchain Version

rustc 1.94.0-nightly (f57eac1bf 2026-01-10) and 1.91.0-nightly and 1.92-stable

What happened?

for the following code:

use rocket::{
    get, launch,
    response::stream::{Event, EventStream},
    routes,
};

#[get("/")]
fn hello() -> EventStream![Event] {
    EventStream! {
        for _ in 1..5 {
            yield Event::empty();
        }
    }
}

#[launch]
fn rocket() -> _ {
    rocket::build().mount("/", routes![hello])
}

mod test {
    #[test]
    fn hello() {
        let body = reqwest::blocking::get("http://localhost:8000")
            .unwrap()
            .text()
            .unwrap();
        dbg!(&body);
        assert!(!body.lines().any(|line| { line == ":" }));
    }
}

Hitting that running server with curl returns this

$ curl localhost:8000
data:

data:

data:
:         # <- This line should not appear.

data:

While testing, this appears to happen randomly about 1/4 requests and the line moves around in order.
Could this be some sort of race condition?
From the testing, I couldnt get the regular client to replicate / fail the behavior after upgrading from 1.91-nightly ->1.94-nightly, however, the test case is descriptive of what I am seeing.

Test Case

#[test]
    fn hello() {
        let body = reqwest::blocking::get("http://localhost:8000")
            .unwrap()
            .text()
            .unwrap();
        dbg!(&body);
        assert!(!body.lines().any(|line| { line == ":" }));
    }

Log Output

> ROCKET_LOG_LEVEL=debug cargo t
    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.10s
     Running unittests src/main.rs (target/debug/deps/RocketReport-8841bb1fb98f1283)

running 1 test
test test::hello ... FAILED

failures:

---- test::hello stdout ----
[src/main.rs:29:9] &body = "data:\n\ndata:\n:\n\ndata:\n\ndata:\n\n"

thread 'test::hello' (43235) panicked at src/main.rs:30:9:
assertion failed: !body.lines().any(|line| { line == ":" })
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    test::hello

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s

error: test failed, to rerun pass `--bin RocketReport`

Additional Context

This looks to me to be a race condition on the EventStream! that I was using to serve SSE with Datastar, this is breaking, so I made a quick helper on my end to serve with the TextStream!, which appears to fix the problem.

System Checks

  • My bug report relates to functionality.
  • I have tested against the latest Rocket release or a recent git commit.
  • I have tested against the latest stable rustc toolchain.
  • I was unable to find this issue previously reported.

Metadata

Metadata

Assignees

No one assigned

    Labels

    triageA bug report being investigated

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions