mod body;
mod cookies;
mod error_page;
pub mod files;
mod forward;
mod listener;
mod router;
mod upstream;
use std::io;
use std::net::SocketAddr;
use std::sync::Arc;
pub use error_page::ErrorPage;
pub use listener::{Listener, ListenerOptions, is_loopback};
pub use router::{
ActivityGuard, BoxFuture, Dial, Dialer, ListenerKind, Route, RouteRequest, Router,
UpstreamError, UpstreamIo, UpstreamStream,
};
#[derive(Clone)]
pub struct Proxy {
shared: Arc<forward::Shared>,
}
impl Proxy {
pub fn new(router: Arc<dyn Router>) -> Self {
Self {
shared: Arc::new(forward::Shared::new(router)),
}
}
pub async fn bind(&self, addr: SocketAddr, options: ListenerOptions) -> io::Result<Listener> {
let listener = tokio::net::TcpListener::bind(addr).await?;
Ok(Listener::new(listener, options, self.shared.clone()))
}
pub fn listen(
&self,
listener: std::net::TcpListener,
options: ListenerOptions,
) -> io::Result<Listener> {
listener.set_nonblocking(true)?;
let listener = tokio::net::TcpListener::from_std(listener)?;
Ok(Listener::new(listener, options, self.shared.clone()))
}
}