#![allow(dead_code)]
use std::sync::Arc;
use deepgram::Deepgram;
use tokio::net::TcpListener;
use tokio_rustls::TlsAcceptor;
use tokio_tungstenite::tungstenite;
pub const FAKE_REQUEST_ID: &str = "550e8400-e29b-41d4-a716-446655440000";
pub struct SelfSigned {
pub cert_der: Vec<u8>,
pub key_der: Vec<u8>,
pub cert_pem: String,
}
pub fn self_signed() -> SelfSigned {
let cert =
rcgen::generate_simple_self_signed(vec!["localhost".to_string()]).expect("generate cert");
SelfSigned {
cert_der: cert.cert.der().to_vec(),
key_der: cert.key_pair.serialize_der(),
cert_pem: cert.cert.pem(),
}
}
pub async fn spawn_tls_server(cert_der: Vec<u8>, key_der: Vec<u8>) -> u16 {
let cert_der = tokio_rustls::rustls::pki_types::CertificateDer::from(cert_der);
let key_der = tokio_rustls::rustls::pki_types::PrivateKeyDer::Pkcs8(key_der.into());
let server_config = tokio_rustls::rustls::ServerConfig::builder()
.with_no_client_auth()
.with_single_cert(vec![cert_der], key_der)
.expect("server config");
let acceptor = TlsAcceptor::from(Arc::new(server_config));
let listener = TcpListener::bind("127.0.0.1:0").await.expect("bind");
let port = listener.local_addr().expect("local addr").port();
tokio::spawn(async move {
while let Ok((stream, _)) = listener.accept().await {
let acceptor = acceptor.clone();
tokio::spawn(async move {
let Ok(tls_stream) = acceptor.accept(stream).await else {
return;
};
#[allow(clippy::result_large_err)]
let callback =
|_req: &tungstenite::handshake::server::Request,
mut resp: tungstenite::handshake::server::Response| {
resp.headers_mut()
.insert("dg-request-id", FAKE_REQUEST_ID.parse().unwrap());
Ok(resp)
};
let Ok(mut ws) = tokio_tungstenite::accept_hdr_async(tls_stream, callback).await
else {
return;
};
let _ = futures::StreamExt::next(&mut ws).await;
let _ = futures::SinkExt::close(&mut ws).await;
});
}
});
port
}
pub fn client(port: u16) -> Deepgram {
Deepgram::with_base_url_and_api_key(format!("https://localhost:{port}").as_str(), "fake-key")
.expect("client")
}
pub fn config_trusting(cert_der: &[u8]) -> deepgram::rustls::ClientConfig {
let mut roots = deepgram::rustls::RootCertStore::empty();
roots
.add(deepgram::rustls::pki_types::CertificateDer::from(
cert_der.to_vec(),
))
.expect("add root");
deepgram::rustls::ClientConfig::builder()
.with_root_certificates(roots)
.with_no_client_auth()
}
pub fn self_signed_named(common_name: &str) -> SelfSigned {
let key_pair = rcgen::KeyPair::generate().expect("key pair");
let mut params = rcgen::CertificateParams::new(vec!["localhost".to_string()]).expect("params");
params
.distinguished_name
.push(rcgen::DnType::CommonName, common_name);
let cert = params.self_signed(&key_pair).expect("self-sign");
SelfSigned {
cert_der: cert.der().to_vec(),
key_der: key_pair.serialize_der(),
cert_pem: cert.pem(),
}
}