digitalis_server/
accept.rs1use 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}