Author:
Hash:
Timestamp:
+22 -17 +/-2 browse
Kevin Schoon [me@kevinschoon.com]
8a639449f7b82930bc2a8bc74b838ac0b85b5ee5
Sat, 17 Aug 2024 22:43:37 +0000 (1.3 years ago)
| 1 | diff --git a/maitred/src/server.rs b/maitred/src/server.rs |
| 2 | index 0b371b7..d6cff2b 100644 |
| 3 | --- a/maitred/src/server.rs |
| 4 | +++ b/maitred/src/server.rs |
| 5 | @@ -202,13 +202,12 @@ where |
| 6 | self.shutdown_handles.push(tx); |
| 7 | let global_queue = global_queue.clone(); |
| 8 | let stealers = stealers.clone(); |
| 9 | - let milter = self |
| 10 | - .milter |
| 11 | - .as_ref() |
| 12 | - .map_or(None, |milter| Some(milter.clone())); |
| 13 | + let milter = self.milter.clone().expect("Milter not configured"); |
| 14 | + let delivery = self.delivery.clone().expect("Delivery not configured"); |
| 15 | tokio::task::spawn(async move { |
| 16 | let mut worker = Worker { |
| 17 | milter, |
| 18 | + delivery, |
| 19 | global_queue, |
| 20 | stealers, |
| 21 | local_queue: Arc::new(Mutex::new(local_queue)), |
| 22 | diff --git a/maitred/src/worker.rs b/maitred/src/worker.rs |
| 23 | index 86e5878..d5160fd 100644 |
| 24 | --- a/maitred/src/worker.rs |
| 25 | +++ b/maitred/src/worker.rs |
| 26 | @@ -9,7 +9,7 @@ use tokio::sync::{mpsc::Receiver, Mutex}; |
| 27 | use tokio_stream::{self as stream}; |
| 28 | use url::Host; |
| 29 | |
| 30 | - use crate::{Error, Milter, Session}; |
| 31 | + use crate::{Delivery, Error, Milter, Session}; |
| 32 | |
| 33 | /// Session details to be passed internally for processing |
| 34 | #[derive(Clone, Debug)] |
| 35 | @@ -38,19 +38,22 @@ impl From<Session> for Packet { |
| 36 | /// Running DKIM verification |
| 37 | /// ARC Verficiation |
| 38 | /// SPF Verification |
| 39 | - pub(crate) struct Worker<M> |
| 40 | + pub(crate) struct Worker<D, M> |
| 41 | where |
| 42 | + D: Delivery + Clone + Send + Sync, |
| 43 | M: Milter + Clone + Send + Sync, |
| 44 | { |
| 45 | - pub milter: Option<Arc<M>>, |
| 46 | + pub milter: Arc<M>, |
| 47 | + pub delivery: Arc<D>, |
| 48 | pub global_queue: Arc<Injector<Packet>>, |
| 49 | pub stealers: Vec<Stealer<Packet>>, |
| 50 | pub local_queue: Arc<Mutex<WorkQueue<Packet>>>, |
| 51 | pub shutdown_rx: Receiver<bool>, |
| 52 | } |
| 53 | |
| 54 | - impl<M> Worker<M> |
| 55 | + impl<D, M> Worker<D, M> |
| 56 | where |
| 57 | + D: Delivery + Clone + Send + Sync, |
| 58 | M: Milter + Clone + Send + Sync + 'static, |
| 59 | { |
| 60 | async fn next_packet(&self) -> Option<Packet> { |
| 61 | @@ -79,16 +82,19 @@ where |
| 62 | |
| 63 | if let Some(packet) = self.next_packet().await { |
| 64 | let mut message = packet.body.unwrap(); |
| 65 | - if let Some(milter) = self.milter.as_ref() { |
| 66 | - match milter.apply(message).await { |
| 67 | - Ok(modified) => { |
| 68 | - tracing::info!("Milter finished successfully"); |
| 69 | - message = modified; |
| 70 | - } |
| 71 | - Err(err) => { |
| 72 | - tracing::warn!("Milter failed to apply: {:?}", err); |
| 73 | - } |
| 74 | + match self.milter.apply(message.clone()).await { |
| 75 | + Ok(modified) => { |
| 76 | + tracing::info!("Milter finished successfully"); |
| 77 | + message = modified; |
| 78 | } |
| 79 | + Err(err) => { |
| 80 | + tracing::warn!("Milter failed to apply: {:?}", err); |
| 81 | + } |
| 82 | + }; |
| 83 | + match self.delivery.deliver(message.clone()).await { |
| 84 | + Ok(_) => tracing::info!("Message successfully delivered"), |
| 85 | + // TODO: Implement retry here |
| 86 | + Err(err) => tracing::warn!("Message could not be delievered: {:?}", err), |
| 87 | } |
| 88 | } else { |
| 89 | ticker.tick().await; |