Skip to main content

camel_component_http/
auth.rs

1use camel_component_api::CamelError;
2
3pub fn extract_bearer_token(headers: &http::HeaderMap) -> Result<Option<String>, CamelError> {
4    let auth_header = headers
5        .get(http::header::AUTHORIZATION)
6        .and_then(|v| v.to_str().ok())
7        .unwrap_or("");
8
9    camel_auth::extract_bearer_token(auth_header)
10}
11
12#[cfg(test)]
13mod tests {
14    use super::*;
15
16    fn make_headers(auth: Option<&str>) -> http::HeaderMap {
17        let mut headers = http::HeaderMap::new();
18        if let Some(val) = auth {
19            headers.insert(http::header::AUTHORIZATION, val.parse().unwrap());
20        }
21        headers
22    }
23
24    #[test]
25    fn test_extract_bearer_token_valid() {
26        let headers = make_headers(Some("Bearer abc123"));
27        let result = extract_bearer_token(&headers).unwrap();
28        assert_eq!(result, Some("abc123".to_string()));
29    }
30
31    #[test]
32    fn test_extract_bearer_token_missing() {
33        let headers = make_headers(None);
34        let result = extract_bearer_token(&headers).unwrap();
35        assert!(result.is_none());
36    }
37
38    #[test]
39    fn test_extract_bearer_token_empty_bearer() {
40        let headers = make_headers(Some("Bearer "));
41        let result = extract_bearer_token(&headers);
42        assert!(matches!(result, Err(CamelError::Unauthenticated(_))));
43    }
44
45    #[test]
46    fn test_extract_bearer_token_wrong_scheme() {
47        let headers = make_headers(Some("Basic abc123"));
48        let result = extract_bearer_token(&headers);
49        assert!(matches!(result, Err(CamelError::Unauthenticated(_))));
50    }
51
52    #[test]
53    fn test_extract_bearer_token_case_insensitive() {
54        let headers = make_headers(Some("bearer abc123"));
55        let result = extract_bearer_token(&headers).unwrap();
56        assert_eq!(result, Some("abc123".to_string()));
57    }
58
59    #[test]
60    fn test_extract_bearer_token_uppercase_bearer() {
61        let headers = make_headers(Some("BEARER xyz789"));
62        let result = extract_bearer_token(&headers).unwrap();
63        assert_eq!(result, Some("xyz789".to_string()));
64    }
65
66    #[test]
67    fn test_extract_bearer_token_trims_whitespace() {
68        let headers = make_headers(Some("Bearer  token-with-spaces  "));
69        let result = extract_bearer_token(&headers).unwrap();
70        assert_eq!(result, Some("token-with-spaces".to_string()));
71    }
72
73    #[test]
74    fn test_extract_bearer_token_error_messages() {
75        // "Bearer " trims to "Bearer" (6 chars) < prefix (7 chars) → "expected Bearer scheme"
76        let headers = make_headers(Some("Bearer "));
77        let err = extract_bearer_token(&headers).unwrap_err();
78        match err {
79            CamelError::Unauthenticated(msg) => assert!(msg.contains("expected Bearer")),
80            _ => panic!("expected Unauthenticated"),
81        }
82
83        let headers = make_headers(Some("Digest abc"));
84        let err = extract_bearer_token(&headers).unwrap_err();
85        match err {
86            CamelError::Unauthenticated(msg) => assert!(msg.contains("expected Bearer")),
87            _ => panic!("expected Unauthenticated"),
88        }
89    }
90}