Skip to main content

leyline/core/session/builder/
bearer.rs

1use super::{AUTHORIZATION, SessionBuilder};
2
3#[derive(Clone)]
4pub(crate) struct BearerToken {
5    pub(crate) value: String,
6    pub(crate) slot: usize,
7}
8
9impl SessionBuilder {
10    pub fn bearer_auth(mut self, token: &str) -> Self {
11        let value = format!("Bearer {token}");
12        self.check_header(AUTHORIZATION, &value);
13        self.remove_default(AUTHORIZATION);
14        self.bearer = Some(BearerToken {
15            value,
16            slot: self.default_headers.len(),
17        });
18        self
19    }
20
21    pub(super) fn remove_default(&mut self, name: &str) {
22        if let Some(bearer) = self.bearer.as_mut() {
23            let removed = self.default_headers[..bearer.slot]
24                .iter()
25                .filter(|(k, _)| k.eq_ignore_ascii_case(name))
26                .count();
27            bearer.slot -= removed;
28        }
29        self.default_headers
30            .retain(|(k, _)| !k.eq_ignore_ascii_case(name));
31    }
32
33    pub(super) fn push_default(&mut self, name: String, value: String) {
34        match self
35            .bearer
36            .take_if(|_| name.eq_ignore_ascii_case(AUTHORIZATION))
37        {
38            Some(bearer) => self.default_headers.insert(bearer.slot, (name, value)),
39            None => self.default_headers.push((name, value)),
40        }
41    }
42}