Skip to content

Commit d6b48af

Browse files
committed
fix: refactoring
1 parent 8ed4eb0 commit d6b48af

File tree

1 file changed

+25
-22
lines changed

1 file changed

+25
-22
lines changed

src/api.rs

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ use parking_lot::RwLock;
77
use rustls::internal::pemfile::{certs, pkcs8_private_keys};
88
use rustls::{NoClientAuth, ServerConfig};
99
use sqlx::PgPool;
10-
use std::io::Cursor;
11-
use std::ops::Deref;
1210
use std::sync::Arc;
1311
use tokio::io::{AsyncRead, AsyncWrite};
1412
use tokio::net::{TcpListener, ToSocketAddrs};
@@ -33,21 +31,20 @@ impl Acceptor {
3331
})
3432
}
3533

36-
fn create_server_config(db_cert: &mut Cert) -> Result<Arc<ServerConfig>> {
37-
let (private, cert) = match (&mut db_cert.private, &mut db_cert.cert) {
38-
(Some(ref mut private), Some(ref mut cert)) => (private, cert),
34+
fn create_server_config(db_cert: &Cert) -> Result<Arc<ServerConfig>> {
35+
let (private, cert) = match (&db_cert.private, &db_cert.cert) {
36+
(Some(ref private), Some(ref cert)) => (private, cert),
3937
_ => return Err(anyhow!("Cert has no Cert or Private")),
4038
};
4139

42-
let mut private = Cursor::new(private);
43-
let mut privates = pkcs8_private_keys(&mut private)
40+
let mut privates = pkcs8_private_keys(&mut private.as_bytes())
4441
.map_err(|_| anyhow!("Private is invalid {:?}", private))?;
4542
let private = privates
4643
.pop()
4744
.ok_or_else(|| anyhow!("Private Vec is empty {:?}", privates))?;
4845

49-
let mut cert = Cursor::new(cert);
50-
let cert = certs(&mut cert).map_err(|_| anyhow!("Cert is invalid {:?}", cert))?;
46+
let cert =
47+
certs(&mut cert.as_bytes()).map_err(|_| anyhow!("Cert is invalid {:?}", cert))?;
5148

5249
let mut config = ServerConfig::new(NoClientAuth::new());
5350
config.set_single_cert(cert, private)?;
@@ -57,18 +54,22 @@ impl Acceptor {
5754
}
5855

5956
async fn load_cert(&self) -> Result<TlsAcceptor> {
60-
let new_cert = CertFacade::first_cert(&self.pool).await?;
57+
let new_cert = CertFacade::first_cert(&self.pool).await;
6158

62-
// could probably be improved
63-
let mut db_cert = match (new_cert, self.config.read().deref()) {
64-
(Some(new_cert), (Some(cert), server_config)) if &new_cert == cert => {
65-
return Ok(TlsAcceptor::from(Arc::clone(server_config)))
66-
}
67-
(Some(new_cert), _) => new_cert,
59+
let db_cert = match (new_cert, &*self.config.read()) {
60+
(Ok(Some(new_cert)), (cert, _)) if Some(&new_cert) != cert.as_ref() => new_cert,
6861
(_, (_, server_config)) => return Ok(TlsAcceptor::from(Arc::clone(server_config))),
6962
};
7063

71-
let server_config = Acceptor::create_server_config(&mut db_cert)?;
64+
let server_config = match Acceptor::create_server_config(&db_cert) {
65+
Ok(server_config) => server_config,
66+
Err(e) => {
67+
log::error!("{:?}", e);
68+
let (_, server_config) = &*self.config.read();
69+
return Ok(TlsAcceptor::from(Arc::clone(server_config)));
70+
}
71+
};
72+
7273
*self.config.write() = (Some(db_cert), Arc::clone(&server_config));
7374
Ok(TlsAcceptor::from(server_config))
7475
}
@@ -83,12 +84,14 @@ fn stream(
8384

8485
listener
8586
.zip(repeat(acceptor))
86-
.map(|(stream, acceptor)| async move {
87-
let acceptor = acceptor.load_cert().await?;
88-
Ok(acceptor.accept(stream?).await?)
87+
.map(|(conn, acceptor)| conn.map(|c| (c, acceptor)))
88+
.err_into()
89+
.map_ok(|(conn, acceptor)| async move {
90+
let tls = acceptor.load_cert().await?;
91+
Ok(tls.accept(conn).await?)
8992
})
90-
.buffer_unordered(100)
91-
.inspect_err(|err| log::error!("Stream error: {}", err))
93+
.try_buffer_unordered(100)
94+
.inspect_err(|err| log::error!("Stream error: {:?}", err))
9295
.filter(|stream| futures_util::future::ready(stream.is_ok()))
9396
}
9497

0 commit comments

Comments
 (0)