X-Git-Url: https://piware.de/gitweb/?p=learn-rust.git;a=blobdiff_plain;f=actix-server%2Fsrc%2Fmain.rs;h=44ed45cc60bc055feedb1b3d8cb2ddb872bd1171;hp=58756de28179a96d7d046bff156d2c5231f49662;hb=121e3e9e83ec2bba3f0;hpb=883c4d01f6138070672c08118e2be9facdcd2e15 diff --git a/actix-server/src/main.rs b/actix-server/src/main.rs index 58756de..44ed45c 100644 --- a/actix-server/src/main.rs +++ b/actix-server/src/main.rs @@ -66,16 +66,58 @@ async fn ws_echo(req: HttpRequest, stream: web::Payload) -> Result std::io::Result<()> { - env_logger::init_from_env(env_logger::Env::default().default_filter_or("info")); +struct WsRev; - HttpServer::new(|| { +impl Actor for WsRev { + type Context = ws::WebsocketContext; +} + +impl StreamHandler> for WsRev { + fn handle(&mut self, msg: Result, ctx: &mut Self::Context) { + log::info!("WsRev got message {:?}", msg); + match msg { + Ok(ws::Message::Ping(msg)) => ctx.pong(&msg), + Ok(ws::Message::Text(text)) => { + let rev = text.chars().rev().collect::(); + ctx.text(rev); + }, + Ok(ws::Message::Binary(bin)) => { + let mut rev = bin.to_vec(); + rev.reverse(); + ctx.binary(rev); + } + Ok(ws::Message::Close(reason)) => { + ctx.close(reason); + ctx.stop(); + }, + _ => ctx.stop(), + } + } +} + +#[get("/ws-rev")] +async fn ws_rev(req: HttpRequest, stream: web::Payload) -> Result { + ws::start(WsRev {}, &req, stream) +} + +// App is a template soup, too hard as a proper function +macro_rules! get_app { + () => { App::new() .service(hello) .service(static_file) .service(Files::new("/dir", "../static")) .service(ws_echo) + .service(ws_rev) + } +} + +#[actix_web::main] +async fn main() -> std::io::Result<()> { + env_logger::init_from_env(env_logger::Env::default().default_filter_or("info")); + + HttpServer::new(|| { + get_app!() .wrap(Logger::default()) }) .bind(("127.0.0.1", 3030))? @@ -88,16 +130,16 @@ mod tests { use actix_web::{App, body, test, web}; use actix_web::http::{header, StatusCode}; use actix_web_actors::ws; + use actix_files::Files; use futures_util::sink::SinkExt; use futures_util::StreamExt; - use super::{hello, static_file, ws_echo}; + use super::{hello, static_file, ws_echo, ws_rev}; #[actix_web::test] async fn test_hello() { - // FIXME: duplicating the .service() call from main() here is super ugly, but it's hard to move that into a fn - let app = test::init_service(App::new().service(hello)).await; + let app = test::init_service(get_app!()).await; // no user-agent let req = test::TestRequest::get().uri("/hello/rust").to_request(); @@ -119,8 +161,7 @@ mod tests { #[actix_web::test] async fn test_static_dir() { - // FIXME: duplicating the .service() call from main() here is super ugly, but it's hard to move that into a fn - let app = test::init_service(App::new().service(actix_files::Files::new("/dir", "../static"))).await; + let app = test::init_service(get_app!()).await; let req = test::TestRequest::get().uri("/dir/plain.txt").to_request(); let res = test::call_service(&app, req).await; @@ -144,8 +185,7 @@ mod tests { #[actix_web::test] async fn test_static_file() { - // FIXME: duplicating the .service() call from main() here is super ugly, but it's hard to move that into a fn - let app = test::init_service(App::new().service(static_file)).await; + let app = test::init_service(get_app!()).await; // uncompressed let req = test::TestRequest::get().uri("/file/dir1/optzip.txt").to_request(); @@ -169,8 +209,7 @@ mod tests { #[actix_web::test] async fn test_ws_echo() { - // FIXME: duplicating the .service() call from main() here is super ugly, but it's hard to move that into a fn - let mut srv = actix_test::start(|| App::new().service(ws_echo)); + let mut srv = actix_test::start(|| get_app!()); let mut client = srv.ws_at("/ws-echo").await.unwrap(); // text echo @@ -183,4 +222,20 @@ mod tests { let received = client.next().await.unwrap().unwrap(); assert_eq!(received, ws::Frame::Binary(web::Bytes::from_static(&[42, 99]))); } + + #[actix_web::test] + async fn test_ws_rev() { + let mut srv = actix_test::start(|| get_app!()); + let mut client = srv.ws_at("/ws-rev").await.unwrap(); + + // text reversed + client.send(ws::Message::Text("hello".into())).await.unwrap(); + let received = client.next().await.unwrap().unwrap(); + assert_eq!(received, ws::Frame::Text("olleh".into())); + + // binary reversed + client.send(ws::Message::Binary(web::Bytes::from_static(&[42, 99]))).await.unwrap(); + let received = client.next().await.unwrap().unwrap(); + assert_eq!(received, ws::Frame::Binary(web::Bytes::from_static(&[99, 42]))); + } }