Skip to content

Commit c971091

Browse files
authored
feat(volo-http): add sse client support (#644)
* feat(volo-http): add sse client support * chore(volo-http): update version * chore(volo-http): update CLAUDE.md to include sse.rs
1 parent ff310f7 commit c971091

8 files changed

Lines changed: 674 additions & 2 deletions

File tree

Cargo.lock

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/Cargo.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,12 @@ required-features = ["__tls"]
123123
name = "http-tls-client"
124124
path = "src/http/http-tls-client.rs"
125125
required-features = ["__tls"]
126+
[[bin]]
127+
name = "http-sse-server"
128+
path = "src/http/sse/server.rs"
129+
[[bin]]
130+
name = "http-sse-client"
131+
path = "src/http/sse/client.rs"
126132

127133
# shmipc
128134
[[bin]]
@@ -146,6 +152,7 @@ http-body-util.workspace = true
146152
hyper.workspace = true
147153
hyper-util.workspace = true
148154
metainfo.workspace = true
155+
mime.workspace = true
149156
motore.workspace = true
150157
serde.workspace = true
151158
tokio = { workspace = true, features = ["full"] }

examples/src/http/sse/client.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use volo_http::{
2+
client::{Client, sse::SseExt},
3+
error::BoxError,
4+
};
5+
6+
#[volo::main]
7+
async fn main() -> Result<(), BoxError> {
8+
let client = Client::builder().build()?;
9+
10+
let mut reader = client
11+
.get("http://127.0.0.1:8080/sse")
12+
.header(http::header::ACCEPT, mime::TEXT_EVENT_STREAM.essence_str())
13+
.send()
14+
.await?
15+
.into_sse()?;
16+
17+
while let Some(event) = reader.read().await? {
18+
println!("event: {}", event.event());
19+
if let Some(data) = event.data() {
20+
println!("data: {}", data);
21+
}
22+
if let Some(id) = event.id() {
23+
println!("id: {}", id);
24+
}
25+
if let Some(retry) = event.retry() {
26+
println!("retry: {}", retry.as_millis());
27+
}
28+
println!();
29+
}
30+
31+
Ok(())
32+
}

examples/src/http/sse/server.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
use std::{convert::Infallible, net::SocketAddr};
2+
3+
use async_stream::stream;
4+
use futures::Stream;
5+
use tokio::time::Duration;
6+
use volo::net::Address;
7+
use volo_http::server::{
8+
Server,
9+
response::sse::{Event, Sse},
10+
route::{Router, get},
11+
};
12+
13+
async fn sse_handler() -> Sse<impl Stream<Item = Result<Event, Infallible>>> {
14+
let stream = stream! {
15+
loop {
16+
yield Ok(Event::new().event("ping").data("hello"));
17+
tokio::time::sleep(Duration::from_secs(1)).await;
18+
}
19+
};
20+
21+
Sse::new(stream)
22+
}
23+
24+
#[volo::main]
25+
async fn main() {
26+
let app = Router::new().route("/sse", get(sse_handler));
27+
28+
let addr: SocketAddr = "127.0.0.1:8080".parse().unwrap();
29+
let addr = Address::from(addr);
30+
31+
println!("Server running on {}", addr);
32+
33+
Server::new(app).run(addr).await.unwrap();
34+
}

volo-http/CLAUDE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ volo-http/src/
3737
├── cookie.rs # Cookie jar (feature: cookie)
3838
├── dns.rs # DNS resolver
3939
├── loadbalance.rs
40+
├── sse.rs # SseReader
4041
├── target.rs # Request target (address/host)
4142
├── layer/ # Timeout, Host, UserAgent, FailOnStatus, HttpProxy
4243
└── transport/ # Connector, HTTP1/2, connection pool, TLS

volo-http/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "volo-http"
3-
version = "0.5.3"
3+
version = "0.5.4"
44
edition.workspace = true
55
homepage.workspace = true
66
repository.workspace = true

volo-http/src/client/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ pub mod dns;
5959
pub mod layer;
6060
pub mod loadbalance;
6161
mod request_builder;
62+
pub mod sse;
6263
pub mod target;
6364
#[cfg(test)]
6465
pub mod test_helpers;

0 commit comments

Comments
 (0)