diff options
| author | MatthieuCoder <matthieu@matthieu-dev.xyz> | 2023-01-02 18:59:03 +0400 | 
|---|---|---|
| committer | MatthieuCoder <matthieu@matthieu-dev.xyz> | 2023-01-02 18:59:03 +0400 | 
| commit | f8c2a144e2f3e47371f5e8352e7a7a0b6707bf88 (patch) | |
| tree | 8c1e6bd157ac599429c806f9aa9bc9dbc28140ed /exes/rest/src/main.rs | |
| parent | 46fd26962ef55f8b557f7e36d3aee915a819c88c (diff) | |
restructure project
Diffstat (limited to 'exes/rest/src/main.rs')
| -rw-r--r-- | exes/rest/src/main.rs | 90 | 
1 files changed, 50 insertions, 40 deletions
diff --git a/exes/rest/src/main.rs b/exes/rest/src/main.rs index 9fa6ce7..8d014ab 100644 --- a/exes/rest/src/main.rs +++ b/exes/rest/src/main.rs @@ -1,46 +1,56 @@ -use std::{convert::Infallible, sync::Arc}; +use config::ReverseProxyConfig; -use crate::{config::Config, ratelimit::Ratelimiter}; -use shared::{ -    config::Settings, -    log::{error, info}, -    redis_crate::Client, +use handler::handle_request; +use hyper::{ +    server::conn::AddrStream, +    service::{make_service_fn, service_fn}, +    Body, Client, Request, Server,  }; -use hyper::{server::conn::AddrStream, service::make_service_fn, Server}; -use std::net::ToSocketAddrs; -use tokio::sync::Mutex; - -use crate::proxy::ServiceProxy; +use hyper_tls::HttpsConnector; +use leash::{ignite, AnyhowResultFuture, Component}; +use shared::config::Settings; +use std::convert::Infallible;  mod config; -mod proxy; -mod ratelimit; - -#[tokio::main] -async fn main() { -    let settings: Settings<Config> = Settings::new("rest").unwrap(); -    let config = Arc::new(settings.config); -    let redis_client: Client = settings.redis.into(); -    let redis = Arc::new(Mutex::new( -        redis_client.get_async_connection().await.unwrap(), -    )); -    let ratelimiter = Arc::new(Ratelimiter::new(redis)); - -    let addr = format!("{}:{}", config.server.address, config.server.port) -        .to_socket_addrs() -        .unwrap() -        .next() -        .unwrap(); - -    let service_fn = make_service_fn(move |_: &AddrStream| { -        let service_proxy = ServiceProxy::new(config.clone(), ratelimiter.clone()); -        async move { Ok::<_, Infallible>(service_proxy) } -    }); - -    let server = Server::bind(&addr).serve(service_fn); - -    info!("starting ratelimit server"); -    if let Err(e) = server.await { -        error!("server error: {}", e); +mod handler; +mod ratelimit_client; + +struct ReverseProxyServer {} +impl Component for ReverseProxyServer { +    type Config = ReverseProxyConfig; +    const SERVICE_NAME: &'static str = "rest"; + +    fn start(&self, settings: Settings<Self::Config>) -> AnyhowResultFuture<()> { +        Box::pin(async move { +            // Client to the remote ratelimiters +            let ratelimiter = ratelimit_client::RemoteRatelimiter::new(); +            let client = Client::builder().build(HttpsConnector::new()); + +            let service_fn = make_service_fn(move |_: &AddrStream| { +                let client = client.clone(); +                let ratelimiter = ratelimiter.clone(); +                async move { +                    Ok::<_, Infallible>(service_fn(move |request: Request<Body>| { +                        let client = client.clone(); +                        let ratelimiter = ratelimiter.clone(); +                        async move { +                            handle_request(client, ratelimiter, "token".to_string(), request).await +                        } +                    })) +                } +            }); + +            let server = Server::bind(&settings.config.server.listening_adress).serve(service_fn); + +            server.await?; + +            Ok(()) +        }) +    } + +    fn new() -> Self { +        Self {}      }  } + +ignite!(ReverseProxyServer);  | 
