use std::fmt; use actix_web::error::ParseError; use actix_web::http::header::{Header, HeaderName, HeaderValue, IntoHeaderValue, AUTHORIZATION}; use actix_web::HttpMessage; use crate::headers::authorization::scheme::Scheme; /// `Authorization` header, defined in [RFC 7235](https://tools.ietf.org/html/rfc7235#section-4.2) /// /// The "Authorization" header field allows a user agent to authenticate /// itself with an origin server -- usually, but not necessarily, after /// receiving a 401 (Unauthorized) response. Its value consists of /// credentials containing the authentication information of the user /// agent for the realm of the resource being requested. /// /// `Authorization` header is generic over [authentication /// scheme](./trait.Scheme.html). /// /// # Example /// /// ``` /// # use actix_web::http::header::Header; /// # use actix_web::{HttpRequest, Result}; /// # use actix_web_httpauth::headers::authorization::{Authorization, Basic}; /// fn handler(req: HttpRequest) -> Result { /// let auth = Authorization::::parse(&req)?; /// /// Ok(format!("Hello, {}!", auth.as_ref().user_id())) /// } /// ``` #[derive(Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, Clone)] pub struct Authorization(S); impl Authorization where S: Scheme, { /// Consumes `Authorization` header and returns inner [`Scheme`] /// implementation. /// /// [`Scheme`]: ./trait.Scheme.html pub fn into_scheme(self) -> S { self.0 } } impl From for Authorization where S: Scheme, { fn from(scheme: S) -> Authorization { Authorization(scheme) } } impl AsRef for Authorization where S: Scheme, { fn as_ref(&self) -> &S { &self.0 } } impl AsMut for Authorization where S: Scheme, { fn as_mut(&mut self) -> &mut S { &mut self.0 } } impl Header for Authorization { #[inline] fn name() -> HeaderName { AUTHORIZATION } fn parse(msg: &T) -> Result { let header = msg.headers().get(AUTHORIZATION).ok_or(ParseError::Header)?; let scheme = S::parse(header).map_err(|_| ParseError::Header)?; Ok(Authorization(scheme)) } } impl IntoHeaderValue for Authorization { type Error = ::Error; fn try_into_value(self) -> Result { self.0.try_into_value() } } impl fmt::Display for Authorization { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Display::fmt(&self.0, f) } }