use std::sync::atomic::{AtomicBool, Ordering};
use once_cell::sync::Lazy;
use openssl::{
ex_data::Index,
ssl::{Ssl, SslRef},
};
static MARKER: Lazy<Option<Index<Ssl, Handshake>>> = Lazy::new(|| Ssl::new_ex_index().ok());
#[derive(Default)]
struct Handshake {
completed: AtomicBool,
}
impl Drop for Handshake {
fn drop(&mut self) {
if !self.completed.load(Ordering::Relaxed) {
crate::metrics::tls_handshake_failed();
}
}
}
pub fn started(ssl: &mut SslRef) {
if let Some(index) = *MARKER {
ssl.set_ex_data(index, Handshake::default());
}
}
pub fn completed(ssl: &SslRef) {
if let Some(handshake) = MARKER.and_then(|index| ssl.ex_data(index)) {
handshake.completed.store(true, Ordering::Relaxed);
}
}