File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -123,6 +123,12 @@ required-features = ["__tls"]
123123name = " http-tls-client"
124124path = " src/http/http-tls-client.rs"
125125required-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
146152hyper.workspace = true
147153hyper-util.workspace = true
148154metainfo.workspace = true
155+ mime.workspace = true
149156motore.workspace = true
150157serde.workspace = true
151158tokio = { workspace = true , features = [" full" ] }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change @@ -59,6 +59,7 @@ pub mod dns;
5959pub mod layer;
6060pub mod loadbalance;
6161mod request_builder;
62+ pub mod sse;
6263pub mod target;
6364#[ cfg( test) ]
6465pub mod test_helpers;
You can’t perform that action at this time.
0 commit comments