use super::super::PathOrBlob;
use crate::{
blob::Blob,
config::setopt::{EasyHandle, SetOpt, SetOptError, SetOptProxy},
handler::BlobOptions,
};
use curl_sys::{CURLOPT_ISSUERCERT_BLOB, CURLOPT_PROXY_ISSUERCERT_BLOB};
use std::path::PathBuf;
#[derive(Clone, Debug)]
pub struct Issuer {
pem: PathOrBlob,
}
impl Issuer {
pub fn from_pem<B: AsRef<[u8]> + Send + Sync + 'static>(pem: B) -> Self {
Self {
pem: PathOrBlob::Blob(Blob::new(pem)),
}
}
pub fn copy_from_der<B: AsRef<[u8]>>(der: B) -> Self {
let pem =
pem_rfc7468::encode_string("CERTIFICATE", Default::default(), der.as_ref()).unwrap();
Self::from_pem(pem)
}
pub fn from_pem_file<P>(path: P) -> Self
where
P: Into<PathBuf>,
{
Self {
pem: PathOrBlob::Path(path.into()),
}
}
}
impl SetOpt for Issuer {
fn set_opt(&self, easy: &mut EasyHandle) -> Result<(), SetOptError> {
match &self.pem {
PathOrBlob::Path(path) => easy.issuer_cert(path)?,
PathOrBlob::Blob(blob) => unsafe {
easy.setopt_blob_nocopy(CURLOPT_ISSUERCERT_BLOB, blob)?;
},
}
Ok(())
}
}
impl SetOptProxy for Issuer {
fn set_opt_proxy(&self, easy: &mut EasyHandle) -> Result<(), SetOptError> {
match &self.pem {
PathOrBlob::Path(path) => easy.proxy_issuer_cert(path)?,
PathOrBlob::Blob(blob) => unsafe {
easy.setopt_blob_nocopy(CURLOPT_PROXY_ISSUERCERT_BLOB, blob)?;
},
}
Ok(())
}
}