Skip to content

Commit

Permalink
hostname resolution in routing targets
Browse files Browse the repository at this point in the history
  • Loading branch information
BRA1L0R committed Jul 25, 2022
1 parent 75514ec commit 5000d18
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 11 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "hopper"
version = "0.3.3"
version = "0.3.4"
edition = "2021"

[features]
Expand Down
10 changes: 5 additions & 5 deletions src/config/balancer.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
use serde::Deserialize;
use std::net::SocketAddr;

use serde::Deserialize;
use super::resolver::ResolvableAddr;

#[derive(Debug)]
pub struct Balanced {
servers: Vec<SocketAddr>,
servers: Vec<ResolvableAddr>,
last_used: usize,
}

Expand All @@ -13,9 +14,8 @@ impl<'de> Deserialize<'de> for Balanced {
where
D: serde::Deserializer<'de>,
{
let servers = Vec::deserialize(deserializer)?;
Ok(Self {
servers,
servers: Vec::deserialize(deserializer)?,
last_used: Default::default(),
})
}
Expand All @@ -26,6 +26,6 @@ impl Balanced {
let item = self.servers[self.last_used];
self.last_used = (self.last_used + 1) % self.servers.len();

item
item.into()
}
}
7 changes: 4 additions & 3 deletions src/config/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@ use serde::{Deserialize, Deserializer};
use std::{collections::HashMap, net::SocketAddr};
use tokio::sync::Mutex;

use self::balancer::Balanced;
use self::{balancer::Balanced, resolver::ResolvableAddr};

mod balancer;
mod resolver;

#[derive(Deserialize)]
/// Defines the structure of a config file. Extension can be
Expand Down Expand Up @@ -50,15 +51,15 @@ where
#[derive(Deserialize, Debug)]
#[serde(untagged)]
enum RouteType {
Simple(SocketAddr),
Simple(ResolvableAddr),
#[serde(deserialize_with = "deserialize_mutex")]
Balanced(Mutex<Balanced>),
}

impl RouteType {
async fn get(&self) -> SocketAddr {
match self {
RouteType::Simple(route) => *route,
RouteType::Simple(route) => (*route).into(),
RouteType::Balanced(balancer) => balancer.lock().await.get(),
}
}
Expand Down
27 changes: 27 additions & 0 deletions src/config/resolver.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
use std::net::{SocketAddr, ToSocketAddrs};

use serde::{Deserialize, Deserializer};

#[derive(Deserialize, Debug, Clone, Copy)]
pub(super) struct ResolvableAddr(#[serde(deserialize_with = "resolve_hostname")] SocketAddr);

fn resolve_hostname<'de, D>(deserializer: D) -> Result<SocketAddr, D::Error>
where
D: Deserializer<'de>,
{
use serde::de::Error;

let inner = <String>::deserialize(deserializer)?;

let mut addr = inner
.to_socket_addrs()
.map_err(|err| Error::custom(format!("invalid hostname format: {err}")))?;

addr.next().ok_or_else(|| Error::custom("msg"))
}

impl From<ResolvableAddr> for SocketAddr {
fn from(addr: ResolvableAddr) -> Self {
addr.0
}
}
2 changes: 1 addition & 1 deletion src/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ impl Hopper {
}
Err(err) => {
log::error!("Couldn't connect {client}: {err}");
Err(client.disconnect_err_chain(err).await.into())
Err(client.disconnect_err_chain(err.into()).await)
}
}
};
Expand Down

0 comments on commit 5000d18

Please sign in to comment.