Expand description
Creates a Websocket Filter.
The yielded Ws is used to finish the websocket upgrade.
Note
This filter combines multiple filters internally, so you don’t need them:
- Method must be
GET - Header
connectionmust beupgrade - Header
upgrademust bewebsocket - Header
sec-websocket-versionmust be13 - Header
sec-websocket-keymust be set.
If the filters are met, yields a Ws. Calling Ws::on_upgrade will
return a reply with:
- Status of
101 Switching Protocols - Header
connection: upgrade - Header
upgrade: websocket - Header
sec-websocket-acceptwith the hash value of the received key.
Examples found in repository?
examples/websockets.rs (line 12)
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
async fn main() {
pretty_env_logger::init();
let routes = warp::path("echo")
// The `ws()` filter will prepare the Websocket handshake.
.and(warp::ws())
.map(|ws: warp::ws::Ws| {
// And then our closure will be called when it completes...
ws.on_upgrade(|websocket| {
// Just echo all messages back...
let (tx, rx) = websocket.split();
rx.forward(tx).map(|result| {
if let Err(e) = result {
eprintln!("websocket error: {:?}", e);
}
})
})
});
warp::serve(routes).run(([127, 0, 0, 1], 3030)).await;
}More examples
examples/websockets_chat.rs (line 36)
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
async fn main() {
pretty_env_logger::init();
// Keep track of all connected users, key is usize, value
// is a websocket sender.
let users = Users::default();
// Turn our "state" into a new Filter...
let users = warp::any().map(move || users.clone());
// GET /chat -> websocket upgrade
let chat = warp::path("chat")
// The `ws()` filter will prepare Websocket handshake...
.and(warp::ws())
.and(users)
.map(|ws: warp::ws::Ws, users| {
// This will call our function if the handshake succeeds.
ws.on_upgrade(move |socket| user_connected(socket, users))
});
// GET / -> index html
let index = warp::path::end().map(|| warp::reply::html(INDEX_HTML));
let routes = index.or(chat);
warp::serve(routes).run(([127, 0, 0, 1], 3030)).await;
}