Skip to main content

tuwunel_api/client/rendezvous/
get.rs

1use axum::{
2	body::Body,
3	extract::{Path, State},
4	response::Response,
5};
6use http::{HeaderMap, StatusCode, header::IF_NONE_MATCH};
7use tuwunel_core::{Err, Result};
8use tuwunel_service::rendezvous::Get;
9
10use super::{TEXT_PLAIN, ensure_enabled, session_response};
11
12#[tracing::instrument(level = "debug", skip_all)]
13pub(crate) async fn get_rendezvous_route(
14	State(services): State<crate::State>,
15	Path(id): Path<String>,
16	headers: HeaderMap,
17) -> Result<Response> {
18	ensure_enabled(&services)?;
19
20	let if_none_match = headers
21		.get(IF_NONE_MATCH)
22		.and_then(|value| value.to_str().ok());
23
24	match services.rendezvous.get(&id, if_none_match) {
25		| Get::NotFound => Err!(Request(NotFound("Rendezvous session not found"))),
26		| Get::NotModified(meta) =>
27			session_response(StatusCode::NOT_MODIFIED, Body::empty(), None, &meta),
28		| Get::Data { data, meta } =>
29			session_response(StatusCode::OK, Body::from(data), Some(TEXT_PLAIN), &meta),
30	}
31}