pub extern crate native_tls;
use std::borrow::Cow;
use std::io;
use std::io::BufWriter;
use std::net::TcpStream;
use std::net::ToSocketAddrs;
use native_tls::TlsConnector;
use native_tls::TlsConnectorBuilder;
use native_tls::TlsStream;
use crate::format::SyslogContext;
use crate::sender::internal::impl_syslog_sender_common;
use crate::sender::internal::impl_syslog_stream_send_formatted;
pub fn native_tls_well_known<S: AsRef<str>>(domain: S) -> io::Result<NativeTlsSender> {
let domain = domain.as_ref();
native_tls(format!("{domain}:6514"), domain)
}
pub fn native_tls<A: ToSocketAddrs, S: AsRef<str>>(
addr: A,
domain: S,
) -> io::Result<NativeTlsSender> {
native_tls_with(addr, domain, TlsConnector::builder())
}
pub fn native_tls_with<A: ToSocketAddrs, S: AsRef<str>>(
addr: A,
domain: S,
builder: TlsConnectorBuilder,
) -> io::Result<NativeTlsSender> {
NativeTlsSender::connect(addr, domain, builder)
}
#[derive(Debug)]
pub struct NativeTlsSender {
writer: BufWriter<TlsStream<TcpStream>>,
context: SyslogContext,
postfix: Cow<'static, str>,
}
impl NativeTlsSender {
pub fn connect<A: ToSocketAddrs, S: AsRef<str>>(
addr: A,
domain: S,
builder: TlsConnectorBuilder,
) -> io::Result<Self> {
let domain = domain.as_ref();
let stream = TcpStream::connect(addr)?;
let connector = builder.build().map_err(io::Error::other)?;
let stream = connector
.connect(domain, stream)
.map_err(io::Error::other)?;
Ok(Self {
writer: BufWriter::new(stream),
context: SyslogContext::default(),
postfix: Cow::Borrowed("\r\n"),
})
}
pub fn set_postfix(&mut self, postfix: impl Into<Cow<'static, str>>) {
self.postfix = postfix.into();
}
pub fn set_context(mut self, context: SyslogContext) {
self.context = context;
}
pub fn mut_context(&mut self) -> &mut SyslogContext {
&mut self.context
}
}
impl_syslog_sender_common!(NativeTlsSender);
impl_syslog_stream_send_formatted!(NativeTlsSender);