mirror of
https://github.com/actix/actix-website
synced 2025-01-23 00:25:55 +01:00
45 lines
1.2 KiB
Rust
45 lines
1.2 KiB
Rust
// <websockets>
|
|
use actix::{Actor, StreamHandler};
|
|
use actix_web::{web, App, Error, HttpRequest, HttpResponse, HttpServer};
|
|
use actix_web_actors::ws;
|
|
|
|
/// Define HTTP actor
|
|
struct MyWs;
|
|
|
|
impl Actor for MyWs {
|
|
type Context = ws::WebsocketContext<Self>;
|
|
}
|
|
|
|
/// Handler for ws::Message message
|
|
impl StreamHandler<Result<ws::Message, ws::ProtocolError>> for MyWs {
|
|
fn handle(&mut self, msg: Result<ws::Message, ws::ProtocolError>, ctx: &mut Self::Context) {
|
|
match msg {
|
|
Ok(ws::Message::Ping(msg)) => ctx.pong(&msg),
|
|
Ok(ws::Message::Text(text)) => ctx.text(text),
|
|
Ok(ws::Message::Binary(bin)) => ctx.binary(bin),
|
|
_ => (),
|
|
}
|
|
}
|
|
}
|
|
|
|
async fn index(req: HttpRequest, stream: web::Payload) -> Result<HttpResponse, Error> {
|
|
let resp = ws::start(MyWs {}, &req, stream);
|
|
println!("{:?}", resp);
|
|
resp
|
|
}
|
|
|
|
#[actix_web::main]
|
|
async fn main() -> std::io::Result<()> {
|
|
HttpServer::new(|| App::new().route("/ws/", web::get().to(index)))
|
|
.bind(("127.0.0.1", 8080))?
|
|
.run()
|
|
.await
|
|
}
|
|
// </websockets>
|
|
|
|
// testing requires specific headers:
|
|
// Upgrade: websocket
|
|
// Connection: Upgrade
|
|
// Sec-WebSocket-Key: SOME_KEY
|
|
// Sec-WebSocket-Version: 13
|