This crate allows hyper
servers to accept websocket connections, backed by tungstenite
.
The [upgrade
] function allows you to upgrade a HTTP connection to a websocket connection.
It returns a HTTP response to send to the client, and a future that resolves to a [WebSocketStream
].
The response must be sent to the client for the future to be resolved.
In practise this means that you must spawn the future in a different task.
Note that the [upgrade
] function itself does not check if the request is actually an upgrade request.
For simple cases, you can check this using the [is_upgrade_request
] function before calling [upgrade
].
For more complicated cases where the server should support multiple upgrade protocols,
you can manually inspect the Connection
and Upgrade
headers.
```rust use futures::{sink::SinkExt, stream::StreamExt}; use hyper::{Body, Request, Response}; use hyper_tungstenite::{tungstenite, HyperWebsocket}; use tungstenite::Message;
/// Handle a HTTP or WebSocket request.
async fn handlerequest(request: Request) -> Result
// Spawn a task to handle the websocket connection.
tokio::spawn(async move {
if let Err(e) = serve_websocket(websocket).await {
eprintln!("Error in websocket connection: {}", e);
}
});
// Return the response so the spawned future can continue.
Ok(response)
} else {
// Handle regular HTTP requests here.
Ok(Response::new(Body::from("Hello HTTP!")))
}
}
/// Handle a websocket connection.
async fn serve_websocket(websocket: HyperWebsocket) -> Result<(), Box
// Do something with the message.
foo(&message);
// Send a reply.
websocket.send(Message::text("Thank you, come again.")).await?;
}
Ok(())
} ```