digitalis-server 0.0.0

Base server module for Foxflove
Documentation
use tokio_tungstenite::tungstenite::{handshake::server, Result};

const SEC_WEBSOCKET_PROTOCOL: &str = "Sec-WebSocket-Protocol";
const PROTOCOL: &str = "foxglove.websocket.v1";

#[derive(Debug, Clone, Copy)]
pub struct Accept;

impl server::Callback for Accept {
    fn on_request(
        self,
        request: &server::Request,
        response: server::Response,
    ) -> Result<server::Response, server::ErrorResponse> {
        if let Some(header) = request.headers().get(SEC_WEBSOCKET_PROTOCOL) {
            if header.to_str().unwrap().split(',').any(|v| v == PROTOCOL) {
                let mut response = response;
                response
                    .headers_mut()
                    .append(SEC_WEBSOCKET_PROTOCOL, PROTOCOL.parse().unwrap());

                log::info!("Accepting connection");
                return Ok(response);
            }
        }

        log::info!("Bad request: protocol mismatch");
        Err(server::Response::builder()
            .status(400)
            .body(Some("Bad Request".into()))
            .unwrap())
    }
}