dioxus_fullstack/payloads/
header.rs

1use super::*;
2
3pub use headers::Cookie;
4pub use headers::SetCookie;
5
6#[derive(Clone, Debug)]
7pub struct SetHeader<Data> {
8    data: Option<Data>,
9}
10
11impl<T: Header> SetHeader<T> {
12    pub fn new(
13        value: impl TryInto<HeaderValue, Error = InvalidHeaderValue>,
14    ) -> Result<Self, headers::Error> {
15        let values = value.try_into().map_err(|_| headers::Error::invalid())?;
16
17        let res = T::decode(&mut std::iter::once(&values))?;
18
19        Ok(Self { data: Some(res) })
20    }
21}
22
23impl<T: Header> IntoResponseParts for SetHeader<T> {
24    type Error = ();
25
26    fn into_response_parts(self, res: ResponseParts) -> Result<ResponseParts, Self::Error> {
27        let data = self.data.expect("SetHeader must have data to set");
28
29        let mut headers = vec![];
30        data.encode(&mut headers);
31
32        Ok(axum::response::AppendHeaders(
33            headers.into_iter().map(|value| (T::name().clone(), value)),
34        )
35        .into_response_parts(res)
36        .unwrap())
37    }
38}
39
40impl<T: Header> FromResponseParts for SetHeader<T> {
41    fn from_response_parts(parts: &mut axum::http::response::Parts) -> Result<Self, ServerFnError> {
42        let Some(header) = parts.headers.remove(T::name()) else {
43            return Ok(SetHeader { data: None });
44        };
45
46        let data = T::decode(&mut std::iter::once(&header))
47            .map_err(|_| ServerFnError::Deserialization("Failed to decode header".into()))?;
48
49        Ok(SetHeader { data: Some(data) })
50    }
51}
52
53impl<T: Header> IntoResponse for SetHeader<T> {
54    fn into_response(self) -> axum::response::Response {
55        let mut values = vec![];
56        self.data.unwrap().encode(&mut values);
57
58        let mut response = axum::response::Response::builder();
59
60        for value in values {
61            response = response.header(T::name(), value);
62        }
63
64        response.body(axum_core::body::Body::empty()).unwrap()
65    }
66}