use thiserror::Error;
#[derive(Error, Debug)]
-pub enum ConfigurationError {
+pub enum Error {
#[error("Environment variable {0} not set.")]
MissingEnvVar(String),
#[error("Failed to parse {0}.")]
impl Configuration {
/// Creates a new configuration object by reading the environment
/// variables. Exits if the right ones aren't found.
- pub fn new() -> Result<Self, ConfigurationError> {
+ pub fn new() -> Result<Self, Error> {
Ok(Configuration {
imap_configuration: Arc::new(Proxy {
local_port: get_env_number("LOCAL_IMAP_PORT", 143)?,
}
/// Get an environment variable or return an error.
-fn get_env_var(name: &str, default: Option<String>) -> Result<String, ConfigurationError> {
+fn get_env_var(name: &str, default: Option<String>) -> Result<String, Error> {
match env::var(name) {
Ok(value) => Ok(value),
Err(_) => match default {
Some(default_value) => Ok(default_value),
- None => Err(ConfigurationError::MissingEnvVar(name.to_string())),
+ None => Err(Error::MissingEnvVar(name.to_string())),
},
}
}
/// Get an environment variable and parse it as a number. Return a default
/// if not set.
-fn get_env_number(name: &str, default: u16) -> Result<u16, ConfigurationError> {
+fn get_env_number(name: &str, default: u16) -> Result<u16, Error> {
match env::var(name) {
Ok(value) => value
.parse()
- .map_err(|_| ConfigurationError::ParseError(name.to_string())),
+ .map_err(|_| Error::ParseError(name.to_string())),
Err(_) => Ok(default),
}
}
let running_clone = Arc::clone(&running);
let thread_handle = spawn(move || {
- run_proxy(configuration, running_clone);
+ run_proxy(&configuration, &running_clone);
});
Server {
/// The main loop that listens for incoming (plaintext) connections on
/// `configuration.bind_address:configuration.local_port`.
-fn run_proxy(configuration: Arc<Proxy>, running: Arc<AtomicBool>) {
+fn run_proxy(configuration: &Arc<Proxy>, running: &Arc<AtomicBool>) {
let listener = match TcpListener::bind(format!(
"{}:{}",
configuration.bind_address, configuration.local_port
let configuration_clone = Arc::clone(&configuration);
let handle = spawn(move || {
- handle_client(stream, configuration_clone);
+ handle_client(stream, &configuration_clone);
});
active_threads.push(handle);
}
}
/// Handles a single client connection by bridging it (plaintext) to a TLS connection.
-fn handle_client(client_stream: TcpStream, configuration: Arc<Proxy>) {
+fn handle_client(client_stream: TcpStream, configuration: &Arc<Proxy>) {
if let Err(e) = client_stream.set_nonblocking(true) {
error!("Failed to set client stream to nonblocking: {}", e);
return;