use std::time::{SystemTime, UNIX_EPOCH};
use http::{Method, Request};
use http_uri::{HttpUri, InvalidHttpUri};
use super::payload::{jkt::Jkt, nonce::Nonce};
pub struct DPoPProofContext {
pub req_method: Method,
pub req_uri: HttpUri,
pub req_time: i64,
pub active_nonce: Option<Nonce>,
pub nonce_timestamp: Option<i64>,
pub time_leeway: u16,
pub key_bound_access_token: Option<KeyBoundAccessToken>,
}
#[derive(Debug, Clone)]
pub struct KeyBoundAccessToken {
pub access_token: String,
pub bound_key_jkt: Jkt,
}
const DEFAULT_TIME_LEEWAY: u16 = 240;
impl DPoPProofContext {
pub fn glean<B>(
req: &Request<B>,
key_bound_access_token: Option<KeyBoundAccessToken>,
) -> Result<Self, DPoPProofContextGleanError> {
Ok(Self {
req_method: req.method().clone(),
req_uri: HttpUri::try_from(req.uri().to_string().as_str())?,
req_time: SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs() as i64,
active_nonce: None,
nonce_timestamp: None,
time_leeway: DEFAULT_TIME_LEEWAY,
key_bound_access_token,
})
}
}
#[derive(Debug, thiserror::Error)]
pub enum DPoPProofContextGleanError {
#[error("Invalid request uri.\n{0}")]
InvalidRequestUri(#[from] InvalidHttpUri),
}