server.rs 31.9 KiB
Newer Older
	server: &mut SokettoServer<'_, BufReader<BufWriter<Compat<TcpStream>>>>,
	cfg: &Settings,
) -> Result<(WebSocketKey, HeaderMap), Error> {
	let req = server.receive_request().await?;

	tracing::trace!("Connection request: {:?}", req);

	let host = std::str::from_utf8(req.headers().host).map_err(|e| Error::HttpHeaderRejected("Host", e.to_string()))?;

	let origin = req.headers().origin.and_then(|h| {
		let res = std::str::from_utf8(h).ok();
		if res.is_none() {
			tracing::warn!("Origin header invalid UTF-8; treated as no Origin header");
		}
		res
	});

	let host_check = cfg.access_control.verify_host(host);
	let origin_check = cfg.access_control.verify_origin(origin, host);

	let mut headers = HeaderMap::new();

	host_check.and(origin_check).map(|()| {
		let key = req.key();

		if let Ok(val) = HeaderValue::from_str(host) {
			headers.insert(HOST, val);
		}

		if let Some(Ok(val)) = origin.map(HeaderValue::from_str) {
			headers.insert(ORIGIN, val);
		}

		(key, headers)
	})
}