diff --git a/content/docs/websockets.md b/content/docs/websockets.md index 664a8ee..d7e0f20 100644 --- a/content/docs/websockets.md +++ b/content/docs/websockets.md @@ -4,10 +4,10 @@ menu: docs_proto weight: 240 --- -Actix supports WebSockets out-of-the-box. It is possible to convert a request's `Payload` -to a stream of [*ws::Message*][message] with a [*ws::WsStream*][wsstream] and then use stream -combinators to handle actual messages, but it is simpler to handle websocket communications -with an http actor. +Actix-web supports WebSockets with the `actix-web-actors` crate. It is possible to convert a +request's `Payload` to a stream of [*ws::Message*][message] with a [*web::Payload*][payload] +and then use stream combinators to handle actual messages, but it is simpler to handle +websocket communications with an http actor. The following is an example of a simple websocket echo server: @@ -18,7 +18,7 @@ The following is an example of a simple websocket echo server: > An example chat server with the ability to chat over a websocket or tcp connection > is available in [websocket-chat directory][chat] -[message]: ../../actix-web/actix_web/ws/enum.Message.html -[wsstream]: ../../actix-web/actix_web/ws/struct.WsStream.html +[message]: https://docs.rs/actix-web-actors/1.0.0/actix_web_actors/ws/enum.Message.html +[payload]: https://docs.rs/actix-web/1.0.2/actix_web/web/struct.Payload.html [examples]: https://github.com/actix/examples/tree/master/websocket/ [chat]: https://github.com/actix/examples/tree/master/websocket-chat/ diff --git a/examples/websockets/Cargo.toml b/examples/websockets/Cargo.toml index fca0541..e8f5b50 100644 --- a/examples/websockets/Cargo.toml +++ b/examples/websockets/Cargo.toml @@ -1,8 +1,9 @@ [package] name = "websockets" -version = "0.7.0" +version = "1.0.0" edition = "2018" [dependencies] -actix = "0.7" +actix = "0.8" actix-web = "1.0" +actix-web-actors = "1.0" diff --git a/examples/websockets/src/main.rs b/examples/websockets/src/main.rs index 6cec49d..fd49c5c 100644 --- a/examples/websockets/src/main.rs +++ b/examples/websockets/src/main.rs @@ -1,29 +1,44 @@ // -// use actix::*; -// use actix_web::*; +use actix::{Actor, StreamHandler}; +use actix_web::{web, App, Error, HttpRequest, HttpResponse, HttpServer}; +use actix_web_actors::ws; -// /// Define http actor -// struct Ws; +/// Define http actor +struct MyWs; -// impl Actor for Ws { -// type Context = ws::WebsocketContext; -// } +impl Actor for MyWs { + type Context = ws::WebsocketContext; +} -// /// Handler for ws::Message message -// impl StreamHandler for Ws { -// fn handle(&mut self, msg: ws::Message, ctx: &mut Self::Context) { -// match msg { -// ws::Message::Ping(msg) => ctx.pong(&msg), -// ws::Message::Text(text) => ctx.text(text), -// ws::Message::Binary(bin) => ctx.binary(bin), -// _ => (), -// } -// } -// } +/// Handler for ws::Message message +impl StreamHandler for MyWs { + fn handle(&mut self, msg: ws::Message, ctx: &mut Self::Context) { + match msg { + ws::Message::Ping(msg) => ctx.pong(&msg), + ws::Message::Text(text) => ctx.text(text), + ws::Message::Binary(bin) => ctx.binary(bin), + _ => (), + } + } +} -// fn main() { -// App::new() -// .resource("/ws/", |r| r.f(|req| ws::start(req, Ws))) -// .finish(); -// } +fn index(req: HttpRequest, stream: web::Payload) -> Result { + let resp = ws::start(MyWs {}, &req, stream); + println!("{:?}", resp); + resp +} + +fn main() { + HttpServer::new(|| App::new().route("/ws/", web::get().to(index))) + .bind("127.0.0.1:8088") + .unwrap() + .run() + .unwrap(); +} // + +// testing requires specific headers: +// Upgrade: websocket +// Connection: Upgrade +// Sec-WebSocket-Key: SOME_KEY +// Sec-WebSocket-Version: 13