leyline/core/session/builder/
bearer.rs1use 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}