Docs.rs CI

hyper-tungstenite

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 [upgrade_requested] 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.

Example

```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, Box> { // Check if the request is a websocket upgrade request. if hypertungstenite::upgraderequested(&request) { let (response, websocket) = hypertungstenite::upgrade(request, None)?;

    // 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> { let mut websocket = websocket.await?; while let Some(message) = websocket.next().await { let message = message?;

    // Do something with the message.
    foo(&message);

    // Send a reply.
    websocket.send(Message::text("Thank you, come again.")).await?;
}

Ok(())

} ```