smtp_server: avoid logging an error message when client disconnects

If we get a write error talking to a client that is no longer there,
we don't need to write an error level log message, so don't!
This commit is contained in:
Wez Furlong
2023-03-03 07:43:50 -07:00
parent d70b90e455
commit e366677898
+20 -11
View File
@@ -251,14 +251,16 @@ impl SmtpServer {
tokio::task::spawn_local(async move {
server.params.connection_gauge().inc();
if let Err(err) = server.process().await {
error!("Error in SmtpServer: {err:#}");
server
.write_response(
421,
format!("4.3.0 {} technical difficulties", server.params.hostname),
)
.await
.ok();
if err.downcast_ref::<WriteError>().is_none() {
error!("Error in SmtpServer: {err:#}");
server
.write_response(
421,
format!("4.3.0 {} technical difficulties", server.params.hostname),
)
.await
.ok();
}
}
server.params.connection_gauge().dec();
});
@@ -269,16 +271,19 @@ impl SmtpServer {
&mut self,
status: u16,
message: S,
) -> anyhow::Result<()> {
) -> Result<(), WriteError> {
if let Some(socket) = self.socket.as_mut() {
let mut lines = message.as_ref().lines().peekable();
while let Some(line) = lines.next() {
let is_last = lines.peek().is_none();
let sep = if is_last { ' ' } else { '-' };
let text = format!("{status}{sep}{line}\r\n");
socket.write(text.as_bytes()).await?;
socket
.write(text.as_bytes())
.await
.map_err(|_| WriteError {})?;
}
socket.flush().await?;
socket.flush().await.map_err(|_| WriteError {})?;
}
Ok(())
}
@@ -786,6 +791,10 @@ impl SmtpServer {
}
}
#[derive(Error, Debug)]
#[error("Error writing to client")]
struct WriteError;
const MAX_LINE_LEN: usize = 998;
#[derive(PartialEq)]
enum ReadLine {