Use arc for server traits

This commit is contained in:
moznion
2020-11-23 11:58:27 +09:00
parent 1d8f3b5daf
commit 454eab6b4a
3 changed files with 14 additions and 12 deletions
+1 -1
View File
@@ -2,6 +2,6 @@ use tokio::net::UdpSocket;
use crate::request::Request; use crate::request::Request;
pub trait RequestHandler: Sync { pub trait RequestHandler: Sync + Send {
fn handle_radius_request(&self, conn: &UdpSocket, request: &Request); fn handle_radius_request(&self, conn: &UdpSocket, request: &Request);
} }
+1 -1
View File
@@ -8,6 +8,6 @@ pub enum SecretProviderError {
FailedFetching(String) FailedFetching(String)
} }
pub trait SecretProvider: Sync { pub trait SecretProvider: Sync + Send {
fn fetch_secret(&self, remote_addr: SocketAddr) -> Result<Vec<u8>, SecretProviderError>; fn fetch_secret(&self, remote_addr: SocketAddr) -> Result<Vec<u8>, SecretProviderError>;
} }
+12 -10
View File
@@ -11,22 +11,22 @@ use crate::request::Request;
use crate::request_handler::RequestHandler; use crate::request_handler::RequestHandler;
use crate::secret_provider::SecretProvider; use crate::secret_provider::SecretProvider;
pub struct Server<T: 'static + RequestHandler, U: 'static + SecretProvider> { pub struct Server<T: RequestHandler, U: SecretProvider> {
address: String, address: String,
buf_size: u8, buf_size: u8,
skip_authenticity_validation: bool, skip_authenticity_validation: bool,
request_handler: &'static T, request_handler_arc: Arc<T>,
secret_provider: &'static U, secret_provider_arc: Arc<U>,
} }
impl<T: RequestHandler, U: SecretProvider> Server<T, U> { impl<T: RequestHandler, U: SecretProvider> Server<T, U> {
pub fn new(host: &str, port: u16, buf_size: u8, skip_authenticity_validation: bool, request_handler: &'static T, secret_provider: &'static U) -> Self { pub fn new(host: &str, port: u16, buf_size: u8, skip_authenticity_validation: bool, request_handler: T, secret_provider: U) -> Self {
Self { Self {
address: format!("{}:{}", host, port), address: format!("{}:{}", host, port),
buf_size, buf_size,
skip_authenticity_validation, skip_authenticity_validation,
request_handler, request_handler_arc: Arc::new(request_handler),
secret_provider, secret_provider_arc: Arc::new(secret_provider),
} }
} }
@@ -38,6 +38,8 @@ impl<T: RequestHandler, U: SecretProvider> Server<T, U> {
loop { loop {
let conn = conn_arc.clone(); let conn = conn_arc.clone();
let request_handler = self.request_handler_arc.clone();
let secret_provider = self.secret_provider_arc.clone();
tokio::select! { tokio::select! {
received = conn.recv_from(&mut buf) => { received = conn.recv_from(&mut buf) => {
@@ -62,8 +64,8 @@ impl<T: RequestHandler, U: SecretProvider> Server<T, U> {
local_addr, local_addr,
remote_addr, remote_addr,
undergoing_requests_lock, undergoing_requests_lock,
self.request_handler, request_handler,
self.secret_provider, secret_provider,
self.skip_authenticity_validation, self.skip_authenticity_validation,
).await; ).await;
}); });
@@ -78,8 +80,8 @@ impl<T: RequestHandler, U: SecretProvider> Server<T, U> {
local_addr: SocketAddr, local_addr: SocketAddr,
remote_addr: SocketAddr, remote_addr: SocketAddr,
undergoing_requests_lock: Arc<RwLock<HashSet<RequestKey>>>, undergoing_requests_lock: Arc<RwLock<HashSet<RequestKey>>>,
request_handler: &T, request_handler: Arc<T>,
secret_provider: &U, secret_provider: Arc<U>,
skip_authenticity_validation: bool, skip_authenticity_validation: bool,
) { ) {
let secret: Vec<u8> = match secret_provider.fetch_secret(remote_addr) { let secret: Vec<u8> = match secret_provider.fetch_secret(remote_addr) {