camel_component_http/
auth.rs1use 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 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}