Fix var swapping in finalize_message
This commit is contained in:
parent
263dbda46a
commit
543f56d904
29
src/smtp.rs
29
src/smtp.rs
|
@ -1,4 +1,5 @@
|
||||||
use std::io::{BufRead, BufReader, Write};
|
use std::io::{BufRead, BufReader, Write};
|
||||||
|
use std::mem;
|
||||||
use std::net::{TcpListener, TcpStream};
|
use std::net::{TcpListener, TcpStream};
|
||||||
|
|
||||||
pub fn start_server() {
|
pub fn start_server() {
|
||||||
|
@ -12,7 +13,13 @@ pub fn start_server() {
|
||||||
let reader = BufReader::new(tcp_stream.try_clone().unwrap());
|
let reader = BufReader::new(tcp_stream.try_clone().unwrap());
|
||||||
|
|
||||||
let mut connection = Connection::new();
|
let mut connection = Connection::new();
|
||||||
let _ = connection.handle(tcp_stream, reader);
|
if let Err(e) = connection.handle(tcp_stream, reader) {
|
||||||
|
eprintln!("System error: {}", e)
|
||||||
|
} else {
|
||||||
|
for mail in connection.messages {
|
||||||
|
println!("Mail from {} for {}\n{}", mail.sender, mail.recipients.join(", "), mail.data.unwrap_or("<empty>".to_string()))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
eprintln!("Failed to accept connection: {}", e)
|
eprintln!("Failed to accept connection: {}", e)
|
||||||
|
@ -102,14 +109,14 @@ impl Connection {
|
||||||
send(&mut writer, out)?;
|
send(&mut writer, out)?;
|
||||||
|
|
||||||
if out == MSG_BYE {
|
if out == MSG_BYE {
|
||||||
break
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
line.clear()
|
line.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
return Ok(())
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_line(&mut self, line: &String) -> Result<Option<&str>, &'static str> {
|
fn handle_line(&mut self, line: &String) -> Result<Option<&str>, &'static str> {
|
||||||
|
@ -147,7 +154,7 @@ impl Connection {
|
||||||
ConnectionState::Data => {
|
ConnectionState::Data => {
|
||||||
if line.trim_end() == CMD_DOT {
|
if line.trim_end() == CMD_DOT {
|
||||||
self.state = ConnectionState::Done;
|
self.state = ConnectionState::Done;
|
||||||
return Ok(Some(MSG_OK))
|
return Ok(Some(MSG_OK));
|
||||||
}
|
}
|
||||||
|
|
||||||
return match self.current_message {
|
return match self.current_message {
|
||||||
|
@ -163,18 +170,17 @@ impl Connection {
|
||||||
_ => {
|
_ => {
|
||||||
Err(MSG_FAIL)
|
Err(MSG_FAIL)
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
ConnectionState::Done => {
|
ConnectionState::Done => {
|
||||||
if line.starts_with(CMD_QUIT) {
|
if line.starts_with(CMD_QUIT) {
|
||||||
self.finalize_mail();
|
self.finalize_mail();
|
||||||
return Ok(Some(MSG_BYE))
|
return Ok(Some(MSG_BYE));
|
||||||
}
|
}
|
||||||
|
|
||||||
if line.starts_with(CMD_MAIL_FROM) {
|
if line.starts_with(CMD_MAIL_FROM) {
|
||||||
self.finalize_mail();
|
self.finalize_mail();
|
||||||
return Ok(Some(MSG_OK))
|
return Ok(Some(MSG_OK));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -183,9 +189,10 @@ impl Connection {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn finalize_mail(&mut self) {
|
fn finalize_mail(&mut self) {
|
||||||
if let Some(mail) = &self.current_message {
|
let current_message = mem::replace(&mut self.current_message, None);
|
||||||
self.current_message = None;
|
|
||||||
self.messages.push(*mail)
|
if let Some(mail) = current_message {
|
||||||
|
self.messages.push(mail)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue