diff --git a/README-sse.md b/README-sse.md index 223dcc32..47607ea7 100644 --- a/README-sse.md +++ b/README-sse.md @@ -69,7 +69,7 @@ sse.on_error([](httplib::Error err) { }); #### Configuration ```cpp -// Set reconnect interval (default: 3000ms) +// Set reconnect interval (default: 3000ms, minimum: 100ms) sse.set_reconnect_interval(5000); // Set max reconnect attempts (default: 0 = unlimited) diff --git a/httplib.h b/httplib.h index e64dae0c..7622b740 100644 --- a/httplib.h +++ b/httplib.h @@ -5051,11 +5051,15 @@ inline bool SSEClient::should_reconnect(int count) const { } inline void SSEClient::wait_for_reconnect() { - // Use small increments to check running_ flag frequently + // Use small increments to check running_ flag frequently. + // Always wait at least one increment, so that a zero interval (e.g. + // "retry: 0" from the server) cannot cause a busy reconnect loop. + const auto step_ms = 100; + auto interval_ms = (std::max)(reconnect_interval_ms_, step_ms); auto waited = 0; - while (running_.load() && waited < reconnect_interval_ms_) { - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - waited += 100; + while (running_.load() && waited < interval_ms) { + std::this_thread::sleep_for(std::chrono::milliseconds(step_ms)); + waited += step_ms; } } diff --git a/test/test.cc b/test/test.cc index 62dddece..0cdeaa1b 100644 --- a/test/test.cc +++ b/test/test.cc @@ -22702,7 +22702,10 @@ TEST_F(SSEIntegrationTest, DigitRetryFieldApplied) { std::this_thread::sleep_for(std::chrono::milliseconds(500)); sse.stop(); + // The server-supplied interval is applied, but never below 100ms, so + // "retry: 0" does not cause a busy reconnect loop EXPECT_GE(connection_count.load(), 2); + EXPECT_LE(connection_count.load(), 10); } // Test: Last-Event-ID sent on reconnect