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
connection
must beupgrade
- Header
upgrade
must bewebsocket
- Header
sec-websocket-version
must be13
- Header
sec-websocket-key
must 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-accept
with 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;
}