digitalis_server/
accept.rs

1use tokio_tungstenite::tungstenite::{handshake::server, Result};
2
3const SEC_WEBSOCKET_PROTOCOL: &str = "Sec-WebSocket-Protocol";
4const PROTOCOL: &str = "foxglove.websocket.v1";
5
6#[derive(Debug, Clone, Copy)]
7pub struct Accept;
8
9impl server::Callback for Accept {
10    fn on_request(
11        self,
12        request: &server::Request,
13        response: server::Response,
14    ) -> Result<server::Response, server::ErrorResponse> {
15        if let Some(header) = request.headers().get(SEC_WEBSOCKET_PROTOCOL) {
16            if header.to_str().unwrap().split(',').any(|v| v == PROTOCOL) {
17                let mut response = response;
18                response
19                    .headers_mut()
20                    .append(SEC_WEBSOCKET_PROTOCOL, PROTOCOL.parse().unwrap());
21
22                log::info!("Accepting connection");
23                return Ok(response);
24            }
25        }
26
27        log::info!("Bad request: protocol mismatch");
28        Err(server::Response::builder()
29            .status(400)
30            .body(Some("Bad Request".into()))
31            .unwrap())
32    }
33}