proxy_http 0.1.9

Async HTTP proxy server in Rust. / Rust 异步 HTTP 代理服务器。
Documentation
use std::{net::SocketAddr, sync::Arc};

use hyper_util::rt::TokioIo;
use log::error;
use proxy_fetch::Fetch;
use tokio::net::TcpListener;

use crate::{Result, handle};

pub async fn run(
  fetch: impl Into<Arc<Fetch>>,
  addr: SocketAddr,
  user: impl AsRef<str>,
  password: impl AsRef<str>,
) -> Result<()> {
  let fetch = fetch.into();
  let user = user.as_ref().to_string();
  let password = password.as_ref().to_string();

  let listener = TcpListener::bind(addr).await?;

  let user = Arc::new(user);
  let password = Arc::new(password);

  loop {
    let (stream, _) = listener.accept().await?;

    let io = TokioIo::new(stream);

    let fetch = Arc::clone(&fetch);
    let user = Arc::clone(&user);
    let password = Arc::clone(&password);

    tokio::task::spawn(async move {
      let service = hyper::service::service_fn(move |req| {
        handle(
          req,
          Arc::clone(&fetch),
          Arc::clone(&user),
          Arc::clone(&password),
        )
      });

      if let Err(err) = hyper::server::conn::http1::Builder::new()
        .serve_connection(io, service)
        .with_upgrades()
        .await
      {
        error!("Error serving connection: {:?}", err);
      }
    });
  }
}