httproxide 0.2.0

Rusted HTTP router reverse-proxy
Documentation
use std::net::SocketAddr;

use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub struct TcpListenerConfig {
    bind: SocketAddr,
    ipv6_only: Option<bool>,
}

pub fn std_tcp_listener_from_config(
    cfg: &TcpListenerConfig,
) -> std::io::Result<std::net::TcpListener> {
    let domain = socket2::Domain::for_address(cfg.bind);
    let sock = socket2::Socket::new(domain, socket2::Type::STREAM, None)?;
    if let Some(ipv6_only) = cfg.ipv6_only {
        sock.set_only_v6(ipv6_only)?;
    }
    sock.set_reuse_address(true)?;
    sock.bind(&cfg.bind.into())?;
    sock.listen(128)?;
    sock.set_nonblocking(true)?;
    Ok(sock.into())
}
pub fn tokio_tcp_listener_from_config(
    cfg: &TcpListenerConfig,
) -> std::io::Result<tokio::net::TcpListener> {
    let std_sock = std_tcp_listener_from_config(cfg)?;
    let tokio_sock = tokio::net::TcpListener::from_std(std_sock)?;
    Ok(tokio_sock)
}
pub fn hyper_addr_incoming_from_config(
    cfg: &TcpListenerConfig,
) -> anyhow::Result<hyper::server::conn::AddrIncoming> {
    let tokio_sock = tokio_tcp_listener_from_config(cfg)?;
    let hyper_addr_incoming = hyper::server::conn::AddrIncoming::from_listener(tokio_sock)?;
    Ok(hyper_addr_incoming)
}